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

SCIP预求解变量边界过度收紧问题及正确边界获取方法咨询

SCIP/PySCIPOpt预求解过度收紧变量边界的原因及解决方法

问题原因

SCIP默认的presolve()并非用于计算变量的全局可行紧边界,它的核心目标是简化模型以加速后续求解:

  • 当模型无目标函数时,预求解会寻找任意可行点并直接固定变量到该点(比如你的测试用例中x=0,y=5,z=0是一个合法可行解);
  • 添加目标函数后,预求解会沿着目标优化方向将变量推到最优边界(比如最大化y时,y会被固定到上限5,进而推导得出x=0,z=0)。
    这两种场景下,SCIP都不会主动计算所有可行解范围内的变量上下界。

解决方法

要获取每个变量在所有可行解中的真实紧边界,需要调用SCIP专门的边界计算接口,而非依赖预求解。修改代码如下:

from pyscipopt import Model

# 创建模型
model = Model("minimal_example")

# 添加变量,初始边界-5到5
x = model.addVar("x", lb=-5, ub=5)
y = model.addVar("y", lb=-5, ub=5)
z = model.addVar("z", lb=-5, ub=5)

# 添加约束
model.addCons(x + y == 5)
model.addCons(y + z == 5)

# 计算全局紧边界,替代预求解步骤
model.computeTightBounds()

# 输出结果
print("全局紧边界计算结果:")
print(f"x的边界: {x.getLbLocal()} ≤ x ≤ {x.getUbLocal()}")
print(f"y的边界: {y.getLbLocal()} ≤ y ≤ {y.getUbLocal()}")
print(f"z的边界: {z.getLbLocal()} ≤ z ≤ {z.getUbLocal()}")

补充说明

  • computeTightBounds()会通过线性规划(LP)分别对每个变量求解最大化、最小化问题,从而得到该变量在可行域内的上下界;
  • 若模型规模较大,该方法的计算成本高于预求解,因为需要多次求解LP问题;
  • 如果需要保留预求解简化模型的同时获取紧边界,可先关闭预求解中的变量固定参数,再调用边界计算,但直接使用computeTightBounds()是最直接的方式。

内容的提问来源于stack exchange,提问作者J.Galt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 13:33:24