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

如何在OR-Tools的pywraplp中添加变量条件约束?

解决pywraplp中依赖布尔变量的条件约束问题

在pywraplp里无法直接用Python的if语句定义约束,得用求解器支持的语法来实现你要的「当x为False时,c必须等于0」的逻辑,以下是两种常用可行方案:

方法一:用OnlyEnforceIf实现直观条件约束

pywraplp的约束支持通过OnlyEnforceIf指定触发条件,结合布尔变量的Not()方法,可以直接对应你的需求逻辑:

# 定义变量
c = solver.IntVar(0, 6, f'c_{i}')
x = solver.BoolVar(f'x_{i}')

# 添加约束:仅当x为False时,强制c等于0
solver.Add(c == 0).OnlyEnforceIf(x.Not())

逻辑说明:当x的取反值为真(即x本身为假)时,c == 0的约束才会生效;当x为真时,该约束不生效,c可以正常取0-6之间的任意值。

方法二:线性约束写法(通用线性规划兼容方案)

如果需要兼容不支持OnlyEnforceIf语法的求解器,可以利用布尔变量只能取0或1的特性,用线性不等式实现同样逻辑:

# 定义变量
c = solver.IntVar(0, 6, f'c_{i}')
x = solver.BoolVar(f'x_{i}')

# 添加线性约束
solver.Add(c <= 6 * x)

原理:

  • 当x=0时,约束变为c <= 0,结合c的下限是0,因此c只能等于0;
  • 当x=1时,约束变为c <= 6,和c原本的上限一致,不影响c的正常取值范围。

内容的提问来源于stack exchange,提问作者Victor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:05:02