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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:18:12