1 回答

TA贡献1772条经验 获得超8个赞
正如 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())
添加回答
举报