模拟测试解法

Python 供应链分析

Aaren Stubberfield

Supply Chain Analytics Mgr.

注意

  • 求解耗时很长的问题不应使用 LP 或 IP

注意图像,男子滑倒

Python 供应链分析

总体概念

总体思路:

  • 为关键输入添加随机噪声
  • 反复求解模型
  • 观察分布
Python 供应链分析

为何尝试

原因:

  • 输入多为估计,可能不准确。
  • 之前的敏感性分析仅一次改变一个输入。
Python 供应链分析

背景

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

资源 产品 A 产品 B 产品 C
利润 $US $500 $450 $600

约束:

  • 存在需求、产能和仓储容量约束

风险:

  • 利润估计可能不准确
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

# 定义约束并求解
model += 6 * A + 5 * B + 8 * C <= 60
model += 10.5 * A + 20 * B + 10 * C <= 150
model += A  <= 8
model.solve()
Python 供应链分析

代码示例 - 步骤 2

a, b, c = normalvariate(0,25), 
          normalvariate(0,25),
          normalvariate(0,25)
# 定义目标函数
model += (500+a)*A + (450+b)*B + (600+c)*C
# 初始化类并定义变量
model = LpProblem("Max Glass Co. Profits", 
                   LpMaximize)

A = LpVariable('A', lowBound=0)
B = LpVariable('B', lowBound=0)
C = LpVariable('C', lowBound=0)
a, b, c = normalvariate(0,25), 
          normalvariate(0,25), 
          normalvariate(0,25)
# 定义目标函数
model += (500+a)*A + (450+b)*B + (600+c)*C

# 定义约束并求解
model += 6 * A + 5 * B + 8 * C <= 60
model += 10.5 * A + 20 * B + 10 * C <= 150
model += A  <= 8
model.solve()
Python 供应链分析
def run_pulp_model():
    # 初始化类
    model = LpProblem("Max Glass Co. Profits", LpMaximize)
    A = LpVariable('A', lowBound=0)
    B = LpVariable('B', lowBound=0)
    C = LpVariable('C', lowBound=0)
    a, b, c = normalvariate(0,25), normalvariate(0,25), normalvariate(0,25)

    # 定义目标函数
    model += (500+a)*A + (450+b)*B + (600+c)*C

    # 定义约束并求解
    model += 6 * A + 5 * B + 8 * C <= 60
    model += 10.5 * A + 20 * B + 10 * C <= 150
    model += A  <= 8
    model.solve()
    o = {'A':A.varValue, 'B':B.varValue, 'C':C.varValue, 'Obj':value(model.objective)}
    return(o)
Python 供应链分析

代码示例 - 步骤 4

def run_pulp_model():
    # 初始化类
    model = LpProblem("Max Glass Co. Profits",
                       LpMaximize)
    A = LpVariable('A', lowBound=0)
    B = LpVariable('B', lowBound=0)
    C = LpVariable('C', lowBound=0)
    a, b, c = normalvariate(0,25), 
              normalvariate(0,25),
              normalvariate(0,25)

    # 定义目标函数
    model += (500+a)*A + (450+b)*B + 
             (600+c)*C
    # 定义约束并求解
    model += 6 * A + 5 * B + 8 * C <= 60
    model += 10.5 * A + 20 * B + 10 * C <= 150
    model += A  <= 8
    model.solve()
    o = {'A':A.varValue, 'B':B.varValue, 
         'C':C.varValue, 
         'Obj':value(model.objective)}
    return(o)
for i in range(100):
    output.append(run_pulp_model())
df = pd.DataFrame(output)
Python 供应链分析

代码示例 - 步骤 5

print(df['A'].value_counts())
print(df['B'].value_counts())
print(df['C'].value_counts())

输出:(结果可能不同)

6.666667    73
0.000000    14
8.000000    13
Name: A, dtype: int64
4.000000    73
5.454546    14
2.400000    13
Name: B, dtype: int64
0.000000    86
4.090909    14
Name: C, dtype: int64
Python 供应链分析

用直方图可视化

产品 A: 产品 A、B、C 及目标的直方图

产品 B: 产品 B 的直方图

产品 C: 产品 C 的直方图

目标值: 目标值的直方图

Python 供应链分析

总结

  • 不适用于求解耗时很长的问题
  • 优点

    • 观察输入变化时最优结果如何变化
  • 步骤

    1. 从标准 PuLP 模型代码开始
    2. 用 Python 的 normalvariate 为关键输入添加噪声
    3. 将 PuLP 代码封装为函数并返回输出
    4. 循环调用函数并将结果存入 DataFrame
    5. 可视化结果 DataFrame
Python 供应链分析

试一试!

Python 供应链分析

Preparing Video For Download...