Wang Haihua
🍈 🍉🍊 🍋 🍌
进行敏感性分析对决策者统计模型非常重要。单纯创建模型是不够的,我们还需要从不同的方面统计模型,从而最大限度地利用模型。
敏感性分析是研究特征变化对线性规划模型影响的一种方法。在这种方法中,我们改变一个特性(比如某个约束),保持其他特性不变,检查对模型输出的影响。
我们可以通过三种方式进行敏感性分析:
影子价格(shadow price)是约束条件右侧常数每增加一单位对目标函数值的影响。 松弛变量(slack variabl)是未使用资源的数量。松弛变量表示该约束的可行性范围。如果松弛变量 = 0,则约束是一个“紧”约束(binding constraint。更改紧约束将改变模型的最优解。“松”约束(Non-binding constraint)意味着在这个范围内的任何变化都不会影响目标函数的最优值。
一个玻璃制造公司生产两种玻璃产品A和B。用如下变量表示
- $x$: A型玻璃的数量
- $y$: B型玻璃的数量
约束1: $$4 x+ 10 y \le 100$$ 约束2: $$2x + y \le 22$$
约束3: $$3 x + 3 y \le 39$$
同时要保证 $$x, y \ge 0$$
from pulp import *
# Initialize Class, Define Vars., and Objective
model = LpProblem("Glass_Manufacturing_Industries_Profits",LpMaximize)
# Define variables
A = LpVariable('A', lowBound=0)
B = LpVariable('B', lowBound=0)
# Define Objetive Function: Profit on Product A and B
model += 60 * A + 50 * B
# Constraint 1
model += 4 * A + 10 * B <= 100
# Constraint 2
model += 2 * A + 1 * B <= 22
# Constraint 3
model += 3 * A + 3 * B <= 39
# Solve Model
model.solve()
print("Model Status:{}".format(LpStatus[model.status]))
print("Objective = ", value(model.objective))
for v in model.variables():
print(v.name,"=", v.varValue)
输出结果:
Output:
Model Status:Optimal
Objective = 740.0
A = 9.0
B = 4.0
你可以看到约束C2和C3的影子价格值是10和13.33。这意味着如果我们在约束C2和C3右侧的常数中做一个单位改变,将会分别影响目标函数10和13.33。
C1约束的松弛值为24,即该约束的可行性范围。它还表明约束是一个松约束。约束C2和C3松弛度为0,这意味着约束这两个约束是紧约束。松约束意味着在这个范围内的任何变化都不会影响目标函数的最优值。
本文介绍了线性规划敏感性分析的相关概念——影子价格、松弛变量,并介绍了一个使用pulp库求解的例子。
参考
from pulp import *
import pandas as pd
# Initialize Class, Define Vars., and Objective
model = LpProblem("Glass_Manufacturing_Industries_Profits",LpMaximize)
# Define variables
A = LpVariable('A', lowBound=0)
B = LpVariable('B', lowBound=0)
# Define Objetive Function: Profit on Product A and B
model += 60 * A + 50 * B
# Constraint 1
model += 4 * A + 10 * B <= 100
# Constraint 2
model += 2 * A + 1 * B <= 22
# Constraint 3
model += 3 * A + 3 * B <= 39
# Solve Model
model.solve()
print("Model Status:{}".format(LpStatus[model.status]))
print("Objective = ", value(model.objective))
for v in model.variables():
print(v.name,"=", v.varValue)
Model Status:Optimal Objective = 740.0 A = 9.0 B = 4.0
o = [{'name':name,'shadow price':c.pi,'slack': c.slack} for name, c in model.constraints.items()]
pd.DataFrame(o)
name | shadow price | slack | |
---|---|---|---|
0 | _C1 | -0.000000 | 24.0 |
1 | _C2 | 10.000000 | -0.0 |
2 | _C3 | 13.333333 | -0.0 |