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

如何在Python OR-Tools的MIP问题中获取约束的Shadow Price(影子价格)

OR-Tools MIP模型提取约束影子价格的实现方法

影子价格(对偶值)本身是线性规划(LP)层面的概念,纯整数规划或混合整数规划(MIP)没有标准的全局对偶值定义,OR-Tools的通用接口也没有直接提供MIP场景下的影子价格提取方法,你可以通过固定整数变量转LP求解的方式高效获取对应数值,不需要反复修改约束参数重跑MIP,具体实现逻辑如下:

  • 第一步:正常求解你的MIP模型,确认得到最优可行解
  • 第二步:遍历所有整数/二进制变量,通过SetLB和SetUB方法将变量的上下界同时设置为该变量的最优解取值,完成整数变量的固定
  • 第三步:直接调用求解器的Solve方法,此时所有整数变量已固定,模型会自动转化为仅含连续变量的线性规划求解
  • 第四步:对每个约束对象调用DualValue()方法,即可获取对应约束的影子价格

参考代码示例

from ortools.linear_solver import pywraplp

# 此处替换为你原本的MIP模型构建逻辑,已完成变量、约束、目标函数的定义,得到solver对象
solver = pywraplp.Solver.CreateSolver('CBC')
# 你的模型构建代码段 ...

# 1. 求解原始MIP模型
status = solver.Solve()
if status not in (pywraplp.Solver.OPTIMAL, pywraplp.Solver.FEASIBLE):
    raise Exception("MIP求解无有效可行解")

# 2. 固定所有整数/二进制变量的取值
for var in solver.variables():
    if var.integer():
        opt_val = var.solution_value()
        var.SetLb(opt_val)
        var.SetUb(opt_val)

# 3. 求解固定后的线性规划模型
solver.Solve()

# 4. 提取所有约束的影子价格
shadow_price_res = []
for ct in solver.constraints():
    shadow_price_res.append((ct.name(), ct.dual_value()))

# 输出结果
for ct_name, sp_val in shadow_price_res:
    print(f"约束{ct_name}的影子价格为:{sp_val}")

注意事项

  • 该方法是适配所有OR-Tools支持的MIP求解器的通用实现,如果你使用Gurobi、SCIP等商用求解器,也可以调用求解器原生的MIP对偶值接口获取结果,OR-Tools的通用接口未封装这类专属功能
  • 影子价格的符号符合线性规划对偶规则:小于等于约束的影子价格非正,大于等于约束的影子价格非负,等于约束的影子价格可正可负
  • 若需要多次计算不同场景下的影子价格,每次计算前需先还原整数变量的原始上下界,再固定为对应场景的解值即可

内容的提问来源于stack exchange,提问作者Yuri Machado de Souza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:06:04