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

如何添加线性表达式处于变量边界之外的约束?

解决OR-Tools中abs(x) >= y约束的添加问题

你遇到的问题是OR-Tools的AddBoolOr不支持直接传入线性不等式表达式,得借助布尔变量中转每个约束条件,再对布尔变量做逻辑或操作。

具体解决方案

步骤如下:

  • 为两个不等式分别创建布尔变量,用来标记对应条件是否成立
  • 用OnlyEnforceIf将每个布尔变量和对应的线性约束绑定
  • 最后对两个布尔变量添加BoolOr约束,确保至少一个条件满足

修正后的代码

from ortools.sat.python import cp_model

model = cp_model.CpModel()

x = model.NewIntVar(-10, 10, 'x')
y = model.NewIntVar(0, 10, 'y')

# 创建两个布尔变量,分别对应两个条件
x_less_neg_y = model.NewBoolVar('x_less_neg_y')  # 表示 x < -y
x_greater_y = model.NewBoolVar('x_greater_y')    # 表示 x > y

# 将布尔变量和约束绑定:当布尔变量为真时,必须满足对应约束
model.Add(x < -y).OnlyEnforceIf(x_less_neg_y)
model.Add(x > y).OnlyEnforceIf(x_greater_y)

# 添加逻辑或约束:至少一个布尔变量为真,即至少一个条件满足
model.AddBoolOr([x_less_neg_y, x_greater_y])

补充说明

因为y已经被定义为非负变量,所以abs(x) >= y等价于x < -y或者x > y。通过布尔变量中转后,AddBoolOr就能正常处理逻辑或的需求了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:32:19