首页 > 编程问答 >从 OR-Tools 设置 CP-SAT 求解器的 IntVar 值

从 OR-Tools 设置 CP-SAT 求解器的 IntVar 值

时间:2024-07-23 04:30:01浏览次数:13  
标签:python solver or-tools cp-sat

我目前正在使用 google OR-tools CP-SAT 求解器来解决规划问题。我使用 IntVars 作为日期的表示。所有这些 IntVar 都在字典中。我有一些可以正常工作的约束,但我想强制求解器使大约 2/3 的 Intvars 低于 400。

我尝试使用 BoolVars 解决问题,但没有成功,我运行了出于如何将 2/3 的值强制低于 400 的想法。

有人能想到解决方案吗?


可以使用 Google OR-Tools CP-SAT 求解器来强制大约 2/3 的 IntVar 值低于 400。以下是一种可能的方法:

  1. 创建布尔变量: 为字典中的每个 IntVar 创建一个布尔变量。当相应的 IntVar 小于 400 时,此布尔变量将为 true,否则为 false。
from ortools.sat.python import cp_model

model = cp_model.CpModel()

# your existing code to create IntVars dictionary

# Create boolean variables for each IntVar
bool_vars = {}
for key, int_var in int_vars.items():
    bool_vars[key] = model.NewBoolVar(f'{key}_below_400')
    model.Add(int_var < 400).OnlyEnforceIf(bool_vars[key])
    model.Add(int_var >= 400).OnlyEnforceIf(bool_vars[key].Not())
  1. 计算目标数量: 计算字典中 IntVar 总数的 2/3。
target_count = int(len(int_vars) * (2 / 3))
  1. 添加约束: 添加约束以确保 true 布尔变量的数量大约等于目标数量。
model.Add(sum(bool_vars.values()) >= target_count)

此约束确保至少有 target_count 个 IntVar 小于 400。可能希望添加另一个约束来限制大于 400 的变量的数量,以使分布更接近 2/3:

model.Add(sum(bool_vars.values()) <= target_count + 1)

此约束确保最多有 target_count + 1 个 IntVar 小于 400。

完整代码示例:

from ortools.sat.python import cp_model

# Create a model
model = cp_model.CpModel()

# Sample data for IntVars
int_vars = {
    f'var_{i}': model.NewIntVar(0, 1000, f'var_{i}') for i in range(10)
}

# Create boolean variables for each IntVar
bool_vars = {}
for key, int_var in int_vars.items():
    bool_vars[key] = model.NewBoolVar(f'{key}_below_400')
    model.Add(int_var < 400).OnlyEnforceIf(bool_vars[key])
    model.Add(int_var >= 400).OnlyEnforceIf(bool_vars[key].Not())

# Calculate the target count
target_count = int(len(int_vars) * (2 / 3))

# Add constraints for the number of True boolean variables
model.Add(sum(bool_vars.values()) >= target_count)
model.Add(sum(bool_vars.values()) <= target_count + 1)

# Create a solver and solve the model
solver = cp_model.CpSolver()
status = solver.Solve(model)

# Print the solution
if status == cp_model.OPTIMAL or status == cp_model.FEASIBLE:
    for key, int_var in int_vars.items():
        print(f'{key}: {solver.Value(int_var)}')
else:
    print('No solution found.')

此代码将打印一个解决方案(如果找到),其中大约 2/3 的 IntVar 值小于 400。请注意,由于“大约”的要求,实际比率可能并非始终完全为 2/3,但它将尽可能接近约束条件。

标签:python,solver,or-tools,cp-sat
From: 78292545

相关文章

  • 无法在 python 中安装 pip install expliot - bluepy 的 Building Wheel (pyproject.t
    在此处输入图像描述当我尝试在Windows计算机中通过cmd安装pipinstallexpliot包时,我收到2个错误名称×Buildingwheelforbluepy(pyproject.toml)didnotrunsuccessfully.│exitcode:1**AND**opt=self.warn_dash_deprecation......
  • python 用单斜杠-反斜杠替换url字符串中的双斜杠
    我的URL包含错误的双斜杠(“//”),我需要将其转换为单斜杠。不用说,我想保持“https:”后面的双斜杠不变。可以在字符串中进行此更改的最短Python代码是什么?我一直在尝试使用re.sub,带有冒号否定的正则表达式(即,[^:](//)),但它想要替换整个匹配项(包括前面......
  • 如何使用 Selenium Python 搜索 Excel 文件中的文本
    我有一些数据在Excel文件中。我想要转到Excel文件,然后搜索文本(取自网站表),然后获取该行的所有数据,这些数据将用于在浏览器中填充表格。示例:我希望selenium搜索ST0003然后获取名称,该学生ID的父亲姓名,以便我可以在大学网站中填写此信息。我想我会从网站......
  • Python 套接字请求在很多情况下都会失败
    我在python中尝试了超过5种不同的方法,尽管人们说它在其他论坛上有效,但所有这些方法都惨遭失败。importsocketmessage="test"clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)clientsocket.connect(('1.1.1.1',80))clientsocket.send(mes......
  • Python 网络套接字
    我一直尝试通过Python访问该网站的websocket,但是需要绕过CloudFlare,现在我尝试通过cookie进行绕过,但是这不起作用。我已经尝试在没有cookie的情况下执行此操作,但这也不起作用。importwebsocketimportbase64importosdriver=selenium.webdriver.Firefox()driver.ge......
  • 如何在Python中使用Selenium提取data-v-xxx?
    因为我想查看每个class='num'内的文本是否大于0。如果测试通过,那么我需要获取venuen-name内的文本。我观察到,data-v是相同的。所以我的方法是获取相同的data-v-<hashvalue>来查找场地名称。我尝试了不同的方法来提取,但仍然无法提取。有什么建议吗?这是DOM<div......
  • Python:添加异常上下文
    假设我想提出一个异常并提供额外的处理信息;最好的做法是什么?我想出了以下方法,但对我来说有点可疑:definternal_function():raiseValueError("smellysocks!")defcontext_function():try:internal_function()exceptExceptionase:......
  • 【视频】Python遗传算法GA优化SVR、ANFIS预测证券指数ISE数据-CSDN博客
    全文链接:https://tecdat.cn/?p=37060本文旨在通过应用多种机器学习技术,对交易所的历史数据进行深入分析和预测。我们帮助客户使用了遗传算法GA优化的支持向量回归(SVR)、自适应神经模糊推理系统(ANFIS)等方法,对数据进行了特征选择、数据预处理、模型训练与评估。实验结果表明,这些方法......
  • Python学习笔记42:游戏篇之外星人入侵(三)
    前言在之前我们已经创建好了目录,并且编写好了游戏入口的模块。今天的内容主要是讲讲需求的分析以及项目各模块的代码初步编写。在正式编写代码前,碎碎念几句。在正式编写一个项目代码之前,实际是有很多工作要做的。就项目而言,简单的定项,需求对齐,项目架构设计,实际的代码编写,......
  • Python入门知识点 5--流程控制语句
    先来分享一个pycharm使用小技巧   红色波浪线:提醒可能报错   黄色波浪线:提醒书写不规范,ctrl+alt+l去掉黄线   code--Reformatcode,就可以去掉黄线,调整代码格式1、程序三大执行流程(1)顺序执行        程序执行时,代码从上往下,从左往右执行,中间......