PuLP 中的敏感性分析

Python 优化入门

Jasmin Ludolf

Content Developer

线性规划中的敏感性分析

  • 敏感性分析:改变一个参数,观察输出/结果的变化
  • 线性规划:目标变化多少
  • 三种方法:
    1. 改变目标中的系数
    2. 改变约束中的系数
    3. 改变约束的常数项
  • 求解原始模型与变更后的模型
  • 使用 PuLP!

用于表示敏感性的带左侧绿色区域的仪表指示器图标

Python 优化入门

术语定义

  • 约束
    • 等号成立:激活、绑定
    • 严格不等式成立:未激活、非绑定、有松弛(形容词)
  • 松弛量(名词):
    • 使约束恰好绑定需在左侧增加的数量
  • 影子价格
    • 目标对约束右端的边际增量
Python 优化入门

PuLP 中的饮食问题

食物 成本 ($/磅) 蛋白质 (%) 脂肪 (%)
玉米 0.11 10 2.5
大豆 0.28 40 1

 

  • 要求:至少 17% 蛋白质、2% 脂肪、7 磅食物
  • 目标:$0.11C + 0.28S$
  • 蛋白质:$10C+40S \geq 17(C+S)$
  • 脂肪:$2.5C + S \geq 2(C+S)$
  • 重量:$C + S \geq 7$
from pulp import *

model = LpProblem('diet', LpMinimize)

C = LpVariable('C', lowBound=0)
S = LpVariable('S', lowBound=0)

model += 0.11*C + 0.28*S

model += 10*C + 40*S >= 17 * (C+S), 'Protein' 
model += 2.5*C + S >= 2 * (C+S), 'Fat'
model += C + S >= 7, 'Weight' 

model.solve()
Python 优化入门

PuLP 中的松弛量与影子价格

print(f"Status: {LpStatus[model.status]}\n")
for name, c in model.constraints.items():
    print(f"{name}: slack = {c.slack:.2f}, shadow price = {c.pi:.2f}")
Status: Optimal
Protein: slack = -0.00, shadow price = 0.01

Fat: slack = -1.05, shadow price = 0.00
Weight: slack = -0.00, shadow price = 0.15
Python 优化入门

让我们来练习!

Python 优化入门

Preparing Video For Download...