PuLPモデリングの基本

Pythonで学ぶサプライチェーン分析

Aaren Stubberfield

Supply Chain Analytics Mgr.

PuLPとは

  • PuLP はPythonで書かれた線形計画(LP)/整数計画(IP)のモデリングフレームワーク

  • COIN-OR Foundation(Operations Researchの計算基盤)が保守

  • PuLP は各種ソルバーと連携

    • CPLEX
    • COIN
    • Gurobi
    • など
Pythonで学ぶサプライチェーン分析

PuLP例 – リソーススケジューリング

  • 2種類のケーキを販売する小規模ベーカリーのコンサルタント
  • 30日間の月
  • リソース:
    • オーブン 1台
    • ベーカー 2人
    • 梱包担当 1人(稼働22日)
Pythonで学ぶサプライチェーン分析

PuLP例 – リソーススケジューリング

  • 2種類のケーキで必要資源が異なる:
Cake A Cake B
Oven 0.5 days 1 day
Bakers 1 day 2.5 days
Packers 1 day 2 days

.

Cake A Cake B
Profit $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で学ぶサプライチェーン分析

Let's practice!

Pythonで学ぶサプライチェーン分析

Preparing Video For Download...