Or-Tools布尔表达式编写咨询:如何实现指定约束逻辑?
解决Or-Tools中布尔条件约束的实现问题
在Or-Tools的CP-SAT求解器中,无法直接用&&运算符组合布尔变量作为OnlyEnforceIf的参数,你需要通过辅助布尔变量+逻辑约束来实现需求的逻辑:
- 创建辅助布尔变量
d,用来表示两个条件同时成立的状态 - 添加约束让
d等价于Teams[r,g,m,t]和Teams[r,g,m+1,op]的逻辑与 - 用
OnlyEnforceIf(d)来约束WhoVsWho[t,op] == 1
对应的代码示例如下:
# 假设所有变量都是通过model.NewBoolVar创建的布尔变量 d = model.NewBoolVar("d") # 添加等价约束:d 为真当且仅当两个Teams变量都为真 model.Add(d == (Teams[r,g,m,t] & Teams[r,g,m+1,op])) # 当d为真时,强制WhoVsWho[t,op]为1 model.Add(WhoVsWho[t,op] == 1).OnlyEnforceIf(d)
如果你的Or-Tools版本支持,也可以跳过辅助变量,直接通过逻辑表达式转换实现:
# 逻辑等价于:若Teams[r,g,m,t]和Teams[r,g,m+1,op]都为真,则WhoVsWho[t,op]必须为真 model.AddBoolOr([Teams[r,g,m,t].Not(), Teams[r,g,m+1,op].Not(), WhoVsWho[t,op]])
两种写法都能实现你要的逻辑,第一种用辅助变量更直观易懂,第二种直接通过逻辑规则转换,省去创建额外变量的步骤。
内容的提问来源于stack exchange,提问作者Carsten Nørgård
相关产品推荐
相关产品推荐

