如何在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
相关产品推荐
相关产品推荐

