Excel 求解器灵敏度报告与使用 PuLp 的 Python 输出

问题描述 投票:0回答:0

我想在使用 PuLP 运行 LP 模型后在 python 中创建敏感性报告。我需要它具有目标函数系数和约束 RHS 值的允许增加值和允许减少值;类似于标准的 Excel 求解器输出。我能够获得松弛值 (model.slack) 和影子价格 (model.constraints.pi),并且我知道如何获得目标函数变量 (x.dj) 的降低成本。但是,尽我所能,我无法弄清楚如何计算系数的允许增减。对象。功能。 & 约束的 RHS 值的允许范围。我的 python 代码和我的 excel 输出都在下面给出。

import pandas as pd
import pulp as p
# Create the Problem
MaxModel = p.LpProblem("Ch6Ill1",p.LpMaximize)
# Decision Variables
x = p.LpVariable(name='X', lowBound = 0)
y = p.LpVariable(name='Y', lowBound = 0)
# Objective Function
MaxModel += 5*x + 3*y
# Constraints
MaxModel += (x + y <= 15, "Const.1")
MaxModel += (7*x + 4*y <= 75, "Const.2")
MaxModel += (y <= 12, "Const.3")
status = MaxModel.solve()

#Printing the Outputs
sensitivity_data = []
for name, constraint in MaxModel.constraints.items():
    sensitivity_data.append({'Name': name,
                             'Constraint': constraint,
                             'Shadow Price': constraint.pi,
                             'Slack': constraint.slack
                             })
Modeloutput = pd.DataFrame(sensitivity_data)
print(f"status: {MaxModel.status}, {p.LpStatus[MaxModel.status]}")
for var in MaxModel.variables():
    print(str(var) + ": {}".format(round(var.value(),2)))
    print("Maximum: {}".format(round(MaxModel.objective.value(), 2)))
    print((Modeloutput))

获得的输出如下。每次尝试计算允许的增加和减少都失败了。我已经花了 20 多个小时尝试一切,但我似乎遗漏了一些关键的东西。 ChatGPT坚持认为目标系数的允许增减可以定义如下,但我知道这是错误的:

print("{:<15} {:<10.2f} {:<10.2f} {:<10.2f} {:<10.2f} {:<10.2f}".format("X", value(x), x.dj, 5, min(x.dj/problem.constraints['_C1'].pi, (x.getUb() - value(x))) if x.status == 1 else float("inf"), max(-x.dj/problem.constraints['_C1'].pi, (value(x) - x.getLb())) if x.status == 1 else float("inf")))
print("{:<15} {:<10.2f} {:<10.2f} {:<10.2f} {:<10.2f} {:<10.2f}".format("Y", value(y), y.dj, 3, min(y.dj/problem.constraints['_C2'].pi, (y.getUb() - value(y))) if y.status == 1 else float("inf"), max(-y.dj/problem.constraints['_C2'].pi, (value(y) - y.getLb())) if y.status == 1 else float("inf")))

同样,ChatGPT 一直给我以下版本的 Constraint RHS 调整,这也是不正确的:

print("\nConstraint 1:")
print("Name: ", problem.constraints["_C1"].name)
print("Shadow Price: ", problem.constraints["_C1"].pi)
print("Slack: ", problem.constraints["_C1"].slack)
print("Allowable Increase: ", problem.constraints["_C1"].pi)
print("Allowable Decrease: ", problem.constraints["_C1"].pi)

我想我需要向人类寻求帮助:-)

我知道对于绑定约束(松弛值!=0),允许的增加是无穷大,允许的减少等于松弛的值。但是,我不确定如何计算最佳解决方案更改之前 RHS 值的允许增加和减少。同样,我知道目标系数的允许增加和减少与绑定约束的斜率有关,但我不确定如何在 python 中计算它。对于像这样的双变量问题,有一种图形化的解决方法,但我正在尝试为 python 中更复杂的问题找到一个更通用的解决方案。

Gurobipy 内部定义了SAObjUp、SAObjLow 等这些函数,但由于我是为自己做的,基本上是Python 的初学者,所以我暂时不想购买它。任何帮助将不胜感激。谢谢

status: 1, Optimal
X: 5.0
Y: 10.0
Maximum: 55.0
      Name    Constraint  Shadow Price  Slack
0  Const.1  {X: 1, Y: 1}      0.333333   -0.0
1  Const.2  {X: 7, Y: 4}      0.666667   -0.0
2  Const.3        {Y: 1}     -0.000000    2.0


期望的输出: Excel Sensitivity Report output for same problem

python linear-programming pulp excel-solver
© www.soinside.com 2019 - 2024. All rights reserved.