使用CP-SAT的OnlyEnforceIf时出现互斥变量均为假的问题
问题分析与解决方案
你的代码仅定义了当d120为True时强制约束d[emp]>=25,以及当d121为True时强制约束d[emp]<25,但完全没有对d120和d121本身的取值关系做任何约束。
当前逻辑下:
- 当d120和d121都为False时,两个约束都不会被触发,模型完全允许这种情况存在
- 你需要额外添加约束,强制d120和d121必须互斥且穷尽(即两者中恰好有一个为True)
修复后的代码示例
for emp in employees: # 原有约束 Model.Add(d[emp] >= 25).OnlyEnforceIf(d120[emp]) Model.Add(d[emp] < 25).OnlyEnforceIf(d121[emp]) # 添加互斥穷尽约束:d120和d121必须一真一假 Model.Add(d120[emp] + d121[emp] == 1)
如果你的求解器支持布尔变量的逻辑运算,也可以写成更直观的形式:
Model.Add(d120[emp] == not d121[emp])
关键说明
- 原代码只约束了条件触发后的行为,但没有约束条件本身的取值规则
- 添加
d120[emp] + d121[emp] == 1(针对整数型布尔变量)或等价的逻辑约束,才能确保两个变量始终互斥且覆盖所有情况
内容的提问来源于stack exchange,提问作者Prem Narasimhan
相关产品推荐
相关产品推荐

