影子价格敏感性分析

Python 供应链分析

Aaren Stubberfield

Supply Chain Analytics Mgr.

影子价格定义

建模中的问题:

  • 模型约束的输入多为估计值
  • 输入变化会改变我们的解吗?

影子价格:

  • 在其他条件不变时,约束右端项每增加 1 单位,目标函数最优值的变化量。
Python 供应链分析

背景——玻璃公司资源规划:

资源 产A 产B 产C
生产工时 6 5 8
仓库容量(平方英尺) 10.5 20 10
利润(美元) $500 $450 $600

约束:

  • 生产工时 ≤ 60
  • 仓库容量 ≤ 150 平方英尺
  • A 的最大发电量 ≤ 8
Python 供应链分析

代码示例

# 初始化类、定义变量和目标
model = LpProblem("Max Glass Co. Profits", 
                   LpMaximize)
A = LpVariable('A', lowBound=0)
B = LpVariable('B', lowBound=0)
C = LpVariable('C', lowBound=0)
model += 500 * A + 450 * B + 600 * C

# 约束 1
model += 6 * A + 5 * B + 8 * C <= 60

# 约束 2
model += 10.5 * A + 20 * B + 10 * C <= 150
# 约束 3
model += A  <= 8

# 求解模型
model.solve()
print("Model Status: 
        {}".format(LpStatus[model.status]))
print("Objective = ", value(model.objective))
for v in model.variables():
    print(v.name, "=", v.varValue)
Python 供应链分析

示例解

解:

产品 产A 产B 产C
生产件数 6.667 4 0

目标值为 $5133.33

Python 供应链分析

回顾约束

决策变量:

  • A 到 C = 各产品 A 至 C 的件数

约束:

  • 6A + 5B + 8C ≤ 60(生产能力有限)
  • 10A + 20B + 10C ≤ 150(仓储容量有限)
  • A ≤ 8(A 的最大发电量)
Python 供应链分析

打印影子价格

Python 代码:

o = [{'name':name, 'shadow price':c.pi} 
     for name, c in model.constraints.items()]
print(pd.DataFrame(o))
Python 供应链分析

影子价格说明

输出:

  name  shadow price
   _C1     78.148148
   _C2      2.962963
   _C3     -0.000000

回忆这些约束:

  1. 生产能力有限
  2. 仓储容量有限
  3. A 的最大发电量
Python 供应链分析

约束松弛量(slack)

slack

  • 未使用的资源量。

Python:

o = [{'name':name, 'shadow price':c.pi, 'slack': c.slack} 
     for name, c in model.constraints.items()]
print(pd.DataFrame(o))
Python 供应链分析

约束松弛量说明

输出:

  name  shadow price     slack
   _C1     78.148148 -0.000000
   _C2      2.962963 -0.000000
   _C3     -0.000000  1.333333

关于"绑定"的更多信息

  • slack = 0,则为"绑定"(binding)
  • 改变"绑定"约束会改变解

回忆这些约束:

  1. 生产能力有限
  2. 仓储容量有限
  3. A 的最大发电量
Python 供应链分析

小结

  • 如何计算:
    • shadow prices
    • 约束 slack
  • 识别绑定约束
    • slack = 0,则为绑定
    • slack > 0,则为非绑定
Python 供应链分析

试一试!

Python 供应链分析

Preparing Video For Download...