python - 如何表示约束(A && B)|| (C&&D) || (E && F) ||
问题描述
我是 or-tools 的新手,我正在尝试表示约束:
(!A && !B) || (!C && !D) || (!E && !F) || ...
我尝试了以下方法(在我的情况下,A 是 shift_0LM0,B 是 shift_0LT0,C 是 shift_0MM0,D 是 shift_0MT0,...),将 !A && !B 表示为 A + B == 0,即。!(A || B):
for week in range(4):
for employee in range(5):
model.AddBoolOr([
shift[f'{week}{weekday}M{employee}'] + shift[f'{week}{weekday}T{employee}'] == 0
for weekday in 'LMXJVSD'
])
但我得到了错误:
TypeError: NotSupported: model.GetOrMakeBooleanIndex((shift_0LM0 + shift_0LT0) == 0
有没有一种简单的方法来表达这个约束?
解决方案
正如 Laurent 所说, AddBoolOr 需要布尔文字,因此您必须创建中间变量:
from ortools.sat.python import cp_model
model = cp_model.CpModel()
a, b, c, d = [model.NewBoolVar(x) for x in 'abcd']
not_a_not_b = model.NewBoolVar('!A && !B')
model.Add(a+b == 0).OnlyEnforceIf(not_a_not_b)
not_c_not_d = model.NewBoolVar('!C && !D')
model.Add(c+d == 0).OnlyEnforceIf(not_c_not_d)
model.AddBoolOr([not_a_not_b, not_c_not_d])
solver = cp_model.CpSolver()
solver.Solve(model)
for x in [a, b, c, d]:
print(solver.Value(x))
编辑:对于 (A && B) || (C && D) 只是a+b == 0
变成a+b == 2
如果您想在搜索所有解决方案时避免重复的解决方案,您必须添加其他含义:
model.Add(a+b != 0).OnlyEnforceIf(not_a_not_b.Not())
推荐阅读
- node.js - 找不到在 Nodejs Express 中导入的模块
- c# - 在 C# 中以 Windows 窗体显示来自我的 .json 文件的数据
- python - ARCH/GARCH 模型的 test_X 数据框
- r - R中的重复函数输出非重复条目
- python - 用 numpy 和 pandas Python 计算重复单词
- java - 使用 java 查找堆栈的索引(仅使用方法 push、pop 和 peek)
- flutter - 颤振警告线从不隐藏
- python-3.x - 计算机重新启动后 Jupyter 笔记本未运行(来自 Miniconda 命令提示符)
- linux - NGINX 和 .NetCore 应用程序性能
- sql - 连续几天用户登录