PuLP 建模基础

Python 供应链分析

Aaren Stubberfield

Supply Chain Analytics Mgr.

什么是 PuLP

  • PuLP 是一个用 Python 编写的线性(LP)与整数规划(IP)建模框架

  • 由 COIN-OR 基金会(运筹学计算基础设施)维护

  • PuLP 可对接求解器

    • CPLEX
    • COIN
    • Gurobi
    • 等等…
Python 供应链分析

PuLP 示例——资源排程

  • 为一家精品蛋糕店提供咨询,售卖 2 种蛋糕
  • 30 天的月份
  • 资源:
    • 1 台烤箱
    • 2 名烘焙师
    • 1 名包装工——只工作 22 天
Python 供应链分析

PuLP 示例——资源排程

  • 两种蛋糕的资源需求不同:
蛋糕A 蛋糕B
烤箱 0.5 天 1 天
烘焙师 1 天 2.5 天
包装工 1 天 2 天

.

蛋糕A 蛋糕B
利润 $20.00 $40.00
Python 供应链分析

PuLP 示例——资源排程

  • 目标:最大化利润
    • 利润 = 20*A + 40*B
  • 约束:
    • A ≥ 0
    • B ≥ 0
    • 0.5A + 1B ≤ 30
    • 1A + 2.5B ≤ 60
    • 1A + 2B ≤ 22
Python 供应链分析

PuLP 的通用建模流程

  1. 初始化模型
  2. 定义决策变量
  3. 定义目标函数
  4. 定义约束
  5. 求解模型
Python 供应链分析

初始化模型 - LpProblem()

LpProblem(name='NoName', sense=LpMinimize)
  • name = 输出 .lp 文件中问题的名称,如 "My LP Problem"
  • sense = 目标函数求最大化或最小化
    • 最小化 = LpMinimize (默认)
    • 最大化 = LpMaximize
Python 供应链分析

PuLP 示例——资源排程

  1. 初始化模型
from pulp import *

# 初始化类
model = LpProblem("Maximize Bakery Profits", LpMaximize)
Python 供应链分析

定义决策变量 - LpVariable()

LpVariable(name, lowBound=None, upBound=None, cat='Continuous', e=None)
  • name = 输出 .lp 文件中变量名称
  • lowBound = 下界
  • upBound = 上界
  • cat = 变量类型
    • Integer
    • Binary
    • Continuous (默认)
  • e = 用于基于列的建模
Python 供应链分析

PuLP 示例——资源排程

  1. 初始化类
  2. 定义变量
# 定义决策变量
A = LpVariable('A', lowBound=0, cat='Integer')
B = LpVariable('B', lowBound=0, cat='Integer')
Python 供应链分析

PuLP 示例——资源排程

  1. 初始化类
  2. 定义变量
  3. 定义目标函数
# 定义目标函数
model += 20 * A + 40 * B
Python 供应链分析

PuLP 示例——资源排程

  1. 初始化类
  2. 定义变量
  3. 定义目标函数
  4. 定义约束
# 定义约束
model += 0.5 * A + 1 * B <= 30
model += 1 * A + 2.5 * B <= 60
model += 1 * A + 2 * B <= 22
Python 供应链分析

PuLP 示例——资源排程

  1. 初始化类
  2. 定义变量
  3. 定义目标函数
  4. 定义约束
  5. 求解模型
# 求解模型
model.solve()
print("Produce {} Cake A".format(A.varValue))
print("Produce {} Cake B".format(B.varValue))
Python 供应链分析

PuLP 示例——资源排程

from pulp import *

# 初始化类
model = LpProblem("Maximize Bakery Profits",
                   LpMaximize)

# 定义决策变量
A = LpVariable('A', lowBound=0,
                cat='Integer')
B = LpVariable('B', lowBound=0, 
                cat='Integer')

# 定义目标函数
model += 20 * A + 40 * B
# 定义约束
model += 0.5 * A + 1 * B <= 30
model += 1 * A + 2.5 * B <= 60
model += 1 * A + 2 * B <= 22

# 求解模型
model.solve()
print("Produce {} Cake A".format(A.varValue))
print("Produce {} Cake B".format(B.varValue))
Python 供应链分析

小结

  • PuLP 是 Python 的 LP/IP 建模器
  • 回顾 PuLP 建模的 5 个步骤

    1. 初始化模型
    2. 定义决策变量
    3. 定义目标函数
    4. 定义约束
    5. 求解模型
  • 完成资源排程示例

Python 供应链分析

Passons à la pratique !

Python 供应链分析

Preparing Video For Download...