You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:20:53