物流最適化問題 PuLP

物流最適化問題

物流最適化問題の一つとして、輸送問題を考えてみましょう。

輸送問題は、複数の供給地点から複数の需要地点への最小コストの輸送計画を求める問題です。

以下に、PythonのPuLPを用いて輸送問題を解く例を示します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from pulp import LpProblem, LpMinimize, LpVariable, lpSum
import pandas as pd
import matplotlib.pyplot as plt

# データの設定
# 供給地点と供給量
supply_points = {'Factory1': 500, 'Factory2': 600}
# 需要地点と需要量
demand_points = {'Shop1': 300, 'Shop2': 400, 'Shop3': 400}
# 供給地点から需要地点への輸送コスト
costs = {
'Factory1': {'Shop1': 2, 'Shop2': 4, 'Shop3': 5},
'Factory2': {'Shop1': 3, 'Shop2': 1, 'Shop3': 3}
}

# 問題の定義
prob = LpProblem('Transportation', LpMinimize)

# 変数の定義
vars = {
i: {
j: LpVariable(f"x({i},{j})", lowBound=0)
for j in demand_points
}
for i in supply_points
}

# 目的関数の定義
prob += lpSum(costs[i][j] * vars[i][j] for i in supply_points for j in demand_points)

# 制約条件の定義
for i in supply_points:
prob += lpSum(vars[i][j] for j in demand_points) <= supply_points[i]
for j in demand_points:
prob += lpSum(vars[i][j] for i in supply_points) >= demand_points[j]

# 問題の解法
prob.solve()

# 結果の表示
for v in prob.variables():
print(v.name, "=", v.varValue)

# 結果のグラフ化
df = pd.DataFrame([(v.name, v.varValue) for v in prob.variables()], columns=['Variable', 'Value'])
df.plot(kind='bar', x='Variable', y='Value')
plt.show()

このコードは、2つの工場から3つの店舗への最小コストの輸送計画を求めます。

各工場から各店舗への輸送コストと供給量、需要量を元に、PuLPを用いて最適化問題を解きます。

最後に、各ルートの輸送量を棒グラフで表示します。

[実行結果]

ソースコード解説

1行目から6行目:

必要なライブラリのインポートを行います。

pulpは線形最適化モデリングライブラリであり、pandasとmatplotlibはデータ処理とグラフ表示のためのライブラリです。


9行目から11行目:

輸送問題で必要なデータの設定を行います。

供給地点と供給量、需要地点と需要量、および供給地点から需要地点への輸送コストを辞書として定義しています。


14行目:

LpProblemオブジェクトを作成し、最小化問題を定義します。

‘Transportation’は問題の名前で、LpMinimizeは最小化問題を指定しています。


17行目から22行目:

変数の定義を行います。

変数は「供給地点iから需要地点jへの輸送量」として定義され、LpVariableオブジェクトとして作成されます。

変数名は”x(i,j)”となります。


25行目:

目的関数を定義します。輸送コストと変数の積の総和として定義され、最小化対象となります。


28行目から30行目:

制約条件を定義します。各供給地点からの輸送量は供給量以下でなければならず、各需要地点への輸送量は需要量以上でなければなりません。


33行目:

prob.solve()を呼び出して、問題を解きます。

具体的な最適解が計算されます。


36行目から38行目:

解の結果を表示します。

各変数の値(輸送量)が表示されます。


41行目から45行目:

結果を棒グラフとして表示します。

解の各変数の値をDataFrameに格納し、pandasとmatplotlibを使用して棒グラフを描画します。