如何添加线性表达式处于变量边界之外的约束?
解决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
相关产品推荐
相关产品推荐

