如何在Gurobi中获取与对应约束绑定的影子价格(对偶值)
Gurobi打印带对应约束标识的影子价格方法
核心逻辑:Gurobi的约束对象本身携带ConstrName(约束名称)属性,同时可直接读取Pi属性获取对应对偶值,无需通过getAttr批量获取后手动匹配。
场景1:已给约束手动设置自定义名称
这是最方便的情况,定义约束时通过name参数指定可识别的业务名称,示例如下:
# 定义约束时命名示例 model.addConstr(x + 2*y <= 150, name="A类原料总量约束") model.addConstr(3*x + y <= 200, name="B类原料总量约束") # 求解完成后直接遍历约束打印 for con in model.getConstrs(): print(f"约束名称:{con.ConstrName},影子价格:{con.Pi}")
如果需要将结果存储为字典后续调用,可以用推导式生成:
pi_map = {con.ConstrName: con.Pi for con in model.getConstrs()}
场景2:未提前给约束设置自定义名称
如果之前定义约束时没有手动命名,Gurobi会自动生成默认名称(格式为c0、c1……,索引顺序和你添加约束的顺序完全一致),你可以匹配自己保存的约束业务含义列表对应识别:
# 提前按约束添加顺序定义对应的业务含义列表 con_meaning = ["原料1约束", "原料2约束", "产能约束", "需求下限约束", ...] for idx, con in enumerate(model.getConstrs()): print(f"约束序号:{idx},业务含义:{con_meaning[idx]},影子价格:{con.Pi}")
可选优化:过滤无意义的零值影子价格
松约束的影子价格为0,通常不需要关注,可以添加过滤条件排除浮点误差导致的极小值:
for con in model.getConstrs(): if abs(con.Pi) > 1e-6: print(f"约束:{con.ConstrName},影子价格:{round(con.Pi, 4)}")
内容的提问来源于stack exchange,提问作者Sound Of Silence
相关产品推荐
相关产品推荐

