使用OR-Tools CP-SAT求解器,如何用两个布尔变量作为OnlyEnforceIf条件?
解决Google OR-Tools CP-SAT中“双布尔变量为True时启用约束”的问题
错误原因
你用firstboolvar and secondboolvar的写法不对——OR-Tools的布尔变量是LinearExpr对象,没法直接用Python原生的and运算符组合,这就是你收到Evaluating a LinearExpr instance as a Boolean is not implemented报错的原因。
两种可行解决方案
方案1:直接用OnlyEnforceIf的列表参数
CP-SAT的OnlyEnforceIf方法支持传入布尔变量列表,当列表里所有变量都为True时,约束才会生效。直接改代码就行:
model.Add(RandomIntVar < 100).OnlyEnforceIf([firstboolvar, secondboolvar])
方案2:新建布尔变量表示双变量的逻辑与
如果需要多次复用“两个变量都为True”这个条件,可以先创建一个新布尔变量,通过约束定义它等于两个变量的逻辑与,再用这个新变量控制目标约束:
# 新建布尔变量,代表firstboolvar和secondboolvar同时为True的状态 both_true = model.NewBoolVar("both_true") # 给新变量添加逻辑与约束:both_true 等价于 firstboolvar ∧ secondboolvar model.Add(both_true == model.AddBoolAnd([firstboolvar, secondboolvar])) # 用新变量启用目标约束 model.Add(RandomIntVar < 100).OnlyEnforceIf(both_true)
说明
方案1更简洁,适合只需要用一次这个条件的场景;方案2适合需要重复使用该逻辑与条件的场景,两种方法都能满足你的需求。
内容的提问来源于stack exchange,提问作者andré amistadi
相关产品推荐
相关产品推荐

