使用PySCIPOpt的addConsOr触发Segmentation fault,如何实现x≠y约束?
修复PySCIPOpt中添加
x != y约束的问题 问题原因
PySCIPOpt的addCons方法仅支持<=、>=、==三种关系运算符,直接传入x != y会触发NotImplementedError;而你使用addConsOr时出现段错误,是因为直接将表达式(如x>=y+1)传入方法,而非先将表达式转化为约束对象。
修复addConsOr的段错误
将表达式先转为约束对象,再传入addConsOr,同时可按需选择是否传入布尔变量:
from pyscipopt import Model model = Model() x = model.addVar("x", "I") y = model.addVar("y", "I") # 先创建两个约束对象 cons1 = model.addCons(x >= y + 1) cons2 = model.addCons(x <= y - 1) # 传入约束对象列表到addConsOr model.addConsOr([cons1, cons2])
更简洁的实现方式
方法1:使用addConsDisjunction(推荐)
PySCIPOpt提供了专门的析取约束方法addConsDisjunction,可直接传入约束表达式列表:
from pyscipopt import Model model = Model() x = model.addVar("x", "I") y = model.addVar("y", "I") model.addConsDisjunction([x >= y + 1, x <= y - 1])
方法2:大M法结合布尔变量
通过引入布尔变量和足够大的常数M,将析取约束转化为线性约束,适用于需要跟踪约束激活状态的场景:
from pyscipopt import Model model = Model() x = model.addVar("x", "I") y = model.addVar("y", "I") z = model.addVar("z", "B") # z=1表示x≥y+1,z=0表示y≥x+1 M = 1000 # M需大于x、y的最大可能取值范围 model.addCons(x - y >= 1 - M*(1 - z)) model.addCons(y - x >= 1 - M*z)
内容的提问来源于stack exchange,提问作者jigo3635
相关产品推荐
相关产品推荐

