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

PySCIPOpt中混合整数规划OR约束定义的疑问

PySCIPOpt中addConsOr的resvar参数用法及OR约束实现

问题根源

你遇到的段错误是因为对resvar参数的理解和使用错误:

  • resvar必须是PySCIPOpt提前创建的布尔变量,用于标记OR约束是否被满足(当至少一个子约束成立时,该变量取值为1;否则为0)。
  • 直接传入Python原生布尔值True,或者使用未通过model.addVar()创建的变量,都会导致SCIP访问非法内存,触发段错误。

正确实现代码

针对你最小化变量x、要求三个约束至少满足其一的场景,正确代码如下:

from pyscipopt import Model

# 初始化模型
model = Model("OR_Constraint_Demo")

# 定义决策变量x(可根据需求设为整数或连续型)
x = model.addVar("x", vtype="C")

# 必须提前创建布尔变量作为resvar,由SCIP内部管理
res_var = model.addVar("or_constraint_flag", vtype="B")

# 定义三个子约束表达式
cons1 = x >= 1
cons2 = x >= 2
cons3 = x >= 3

# 添加OR约束:三个子约束中至少满足一个,res_var标记约束状态
model.addConsOr([cons1, cons2, cons3], res_var)

# 设置目标函数:最小化x
model.setObjective(x, "minimize")

# 求解模型
model.optimize()

# 输出结果
if model.getStatus() == "optimal":
    print(f"最优解x = {round(model.getVal(x), 4)}")
    print(f"OR约束满足标记res_var = {model.getVal(res_var)}")
else:
    print("求解失败,未找到最优解")

关键说明

  1. resvar的正确定义:必须通过model.addVar(vtype="B")创建合法的SCIP布尔变量,不能用Python原生布尔值替代。
  2. OR约束的逻辑:addConsOr实现的是「至少满足一个子约束」的逻辑,完全符合你需求中的“三个约束仅需满足其一”。你的预期最优解x=1会被正确求解,因为此时x>=1成立,OR约束满足,且x取到最小值。
  3. 若你实际需求是恰好满足一个子约束(而非至少一个),则需要额外引入布尔变量标记每个子约束的状态,并添加约束限制这些变量的和为1。但针对当前示例,仅OR约束即可达成目标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:41:19