敵地輸送コスト最適化 PuLP

敵地輸送コスト最適化

敵地での輸送コスト最小化問題を考えてみましょう。

具体的には、敵地にある複数の拠点から自国の拠点への輸送を最適化する問題です。

以下に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
48
49
50
51
52
53
54
from pulp import *

# 問題の定義
problem = LpProblem("War Transportation Problem", LpMinimize)

# 変数の定義
base_names = ["Base1", "Base2", "Base3"] # 自国の拠点
enemy_bases = ["Enemy1", "Enemy2", "Enemy3"] # 敵地の拠点

# 輸送量変数
transport_vars = LpVariable.dicts("Transport", (base_names, enemy_bases), lowBound=0, cat="Integer")

# 輸送コスト辞書の定義
transport_cost_dict = {
"Base1": {
"Enemy1": 10,
"Enemy2": 8,
"Enemy3": 6
},
"Base2": {
"Enemy1": 9,
"Enemy2": 7,
"Enemy3": 5
},
"Base3": {
"Enemy1": 11,
"Enemy2": 9,
"Enemy3": 7
}
}

# 目的関数の定義
problem += lpSum(transport_vars[base][enemy] * transport_cost_dict[base][enemy]
for base in base_names for enemy in enemy_bases)

# 制約条件の定義
# 各自国の拠点からの輸送量は、自国の拠点の供給量以下である必要がある
supply_dict = {"Base1": 100, "Base2": 150, "Base3": 200}
for base in base_names:
problem += lpSum(transport_vars[base][enemy] for enemy in enemy_bases) <= supply_dict[base]

# 各敵地の拠点への輸送量は、敵地の拠点の需要量以上である必要がある
demand_dict = {"Enemy1": 80, "Enemy2": 120, "Enemy3": 100}
for enemy in enemy_bases:
problem += lpSum(transport_vars[base][enemy] for base in base_names) >= demand_dict[enemy]

# 最適化の実行
problem.solve()

# 結果の出力
print("Optimal Solution:")
for base in base_names:
for enemy in enemy_bases:
print(f"Transport from {base} to {enemy}: {transport_vars[base][enemy].varValue}")

このコードでは、自国の拠点から敵地の拠点への輸送量を最小化するように最適化問題を設定しています。

自国の拠点と敵地の拠点の数、各拠点の供給量と需要量、および輸送コストを適切に設定する必要があります。


上記のコードを適切に実行することで、最適な輸送計画が得られ、各自国の拠点から敵地の拠点への輸送量が表示されます。

[実行結果]
Optimal Solution:
Transport from Base1 to Enemy1: 30.0
Transport from Base1 to Enemy2: 0.0
Transport from Base1 to Enemy3: 70.0
Transport from Base2 to Enemy1: 0.0
Transport from Base2 to Enemy2: 120.0
Transport from Base2 to Enemy3: 30.0
Transport from Base3 to Enemy1: 50.0
Transport from Base3 to Enemy2: 0.0
Transport from Base3 to Enemy3: 0.0

各自国の拠点から敵地の拠点への輸送量が表示されています。

例えば、”Transport from Base1 to Enemy1: 30.0” は、自国の Base1 から敵地の Enemy1 への輸送量が30であることを示しています。

同様に、他の組み合わせも表示されています。


目的関数である輸送コストを最小化するために、各自国の拠点から敵地の拠点への輸送量が適切に決定されました。

制約条件(自国の拠点の供給量と敵地の拠点の需要量)も満たされています。


最適解を基にしたこの輸送計画は、輸送コストを最小化しながら効率的な物資補給を実現するために活用できます。