都市最適化問題
都市最適化問題の例として、以下の問題を考えてみましょう。
ある都市には5つの工場があり、それぞれが製品を生産しています。
各工場は、それぞれの製品を販売するための市場に製品を供給する必要があります。
この問題は、工場と市場をどのように結びつけるかを決定する問題となります。
解き方・ソースコード
この問題を解くために、PuLPを使用して以下のようにモデル化します。
[Google Colaboratory]
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
| import pulp
problem = pulp.LpProblem("Factory Market Problem", pulp.LpMinimize)
factories = ["Factory 1", "Factory 2", "Factory 3", "Factory 4", "Factory 5"] markets = ["Market 1", "Market 2", "Market 3", "Market 4", "Market 5"]
production = pulp.LpVariable.dicts("Production", factories, lowBound=0)
demand = {"Market 1": 20, "Market 2": 25, "Market 3": 30, "Market 4": 20, "Market 5": 15}
shipments = pulp.LpVariable.dicts("Shipments", (factories, markets), lowBound=0)
problem += pulp.lpSum([500 * production[i] for i in factories]) + pulp.lpSum([300 * shipments[i][j] for i in factories for j in markets])
for j in markets: problem += pulp.lpSum([shipments[i][j] for i in factories]) == demand[j]
for i in factories: problem += pulp.lpSum([shipments[i][j] for j in markets]) <= production[i]
problem.solve()
for i in factories: for j in markets: if shipments[i][j].value() > 0: print(f"{i} から {j} へ {shipments[i][j].value()} だけ製品を供給します。")
|
この例では、5つの工場と5つの市場があり、各市場に必要な製品の量が設定されています。
それぞれの工場の生産量と、各工場が各市場に供給する製品の量が決まっており、目的関数には生産コストと出荷コストが含まれています。
制約条件では、各市場に必要な製品の量が供給されていることと、各工場が生産した製品の量を超えて製品を出荷していないことを設定しています。
このモデルを実行すると、各工場が各市場に供給する製品の量が計算されます。
例えば、”Factory 2”から”Market 3”には30個の製品が供給され、”Factory 3”から”Market 2”には25個の製品が供給されるなど、全ての製品の供給量が計算されます。
このように、PuLPを使用して都市最適化問題を解くことができます。
実際の都市最適化問題では、工場や市場の数がより大きく、制約条件が複雑であることがありますが、PuLPはそれらの問題にも対応できます。
[実行結果]
Factory 2 から Market 3 へ 30.0 だけ製品を供給します。
Factory 2 から Market 5 へ 15.0 だけ製品を供給します。
Factory 3 から Market 2 へ 25.0 だけ製品を供給します。
Factory 4 から Market 1 へ 20.0 だけ製品を供給します。
Factory 4 から Market 4 へ 20.0 だけ製品を供給します。
この結果から、各工場が各市場に供給する製品の量が計算され、各市場に必要な量が供給されていることがわかります。