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("求解失败,未找到最优解")
关键说明
- resvar的正确定义:必须通过
model.addVar(vtype="B")创建合法的SCIP布尔变量,不能用Python原生布尔值替代。 - OR约束的逻辑:
addConsOr实现的是「至少满足一个子约束」的逻辑,完全符合你需求中的“三个约束仅需满足其一”。你的预期最优解x=1会被正确求解,因为此时x>=1成立,OR约束满足,且x取到最小值。 - 若你实际需求是恰好满足一个子约束(而非至少一个),则需要额外引入布尔变量标记每个子约束的状态,并添加约束限制这些变量的和为1。但针对当前示例,仅OR约束即可达成目标。
内容的提问来源于stack exchange,提问作者kirlia
相关产品推荐
相关产品推荐

