出店最適化 PuLP

出店最適化

あなたはピザ店を経営しており、新しい店舗を出店することにしました。

出店する場所は3つあり、それぞれの場所には以下のような特徴があります。

🔹場所1:人口密度が高いが、家賃が高い
🔹場所2:人口密度が低いが、家賃が安い
🔹場所3:人口密度と家賃のバランスがとれている


あなたは、出店する店舗の場所を最適化することにしました。

以下の制約条件を考慮して、各場所の評価スコアを計算し、最も評価スコアが高い場所に店舗を出店することにしました。

🔹店舗の出店数は1つ
🔹店舗の出店費用はすべて同じ
🔹各場所には、人口密度、家賃、および場所による固有の評価スコアがあります。
 評価スコアは0から100までのスケールで測定されます。
🔹人口密度が高い場所ほど評価スコアが高くなるが、家賃が高い場合は低くなる。
🔹家賃が安い場所ほど評価スコアが高くなるが、人口密度が低い場合は低くなる。
🔹人口密度と家賃のバランスがとれている場所ほど評価スコアが高くなる。


各場所の人口密度、家賃、および場所による固有の評価スコアは以下の通りとします。

場所人口密度家賃評価スコア
19010070
2505050
3707080

解法

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
# ①必要なライブラリをインポート
from pulp import *

# ②問題を定義する
prob = LpProblem('出店最適化', LpMaximize)

# ③変数を定義する
x1 = LpVariable('場所1', 0, 1, LpInteger)
x2 = LpVariable('場所2', 0, 1, LpInteger)
x3 = LpVariable('場所3', 0, 1, LpInteger)

# ④目的関数を定義する
prob += 70 * x1 + 50 * x2 + 80 * x3

# ⑤制約条件を定義する
prob += x1 + x2 + x3 == 1
prob += 90 * x1 + 50 * x2 + 70 * x3 <= 100
prob += 100 * x1 + 50 * x2 + 70 * x3 <= 100

# ⑥最適化を実行する
status = prob.solve()

# ⑦結果を表示する
print('出店する場所:', end=' ')
if x1.value() == 1:
print('場所1')
elif x2.value() == 1:
print('場所2')
elif x3.value() == 1:
print('場所3')

print('最適な評価スコア:', value(prob.objective))

①必要なライブラリをインポート

PuLPを使うために必要なライブラリをインポートしています。

②問題を定義する

LpProblem関数を使って問題を定義します。

第一引数には問題の名前を指定し、第二引数には最大化か最小化かを指定します。

ここでは「出店最適化」という名前で最大化問題を定義しています。

③変数を定義する

LpVariable関数を使って変数を定義します。

第一引数には変数の名前を指定し、第二引数には変数の下限値、第三引数には変数の上限値、第四引数には変数の型(整数値か連続値か)を指定します。

ここでは、場所1、場所2、場所3の3つの変数を定義しています。各変数は0または1の整数値をとります。

④目的関数を定義する

目的関数を定義します。

ここでは、ピザ店を出店する場所によって得られる評価スコアを最大化するように設定しています。

場所1に出店すると70点、場所2に出店すると50点、場所3に出店すると80点の評価スコアが得られると仮定しています。

⑤制約条件を定義する

制約条件を定義します。ここでは、以下の条件を設定しています。

🔹出店する場所は1つだけである。
🔹場所1、場所2、場所3のそれぞれで得られる評価スコアが、100点以下である。

⑥最適化を実行する

LpProblem関数で定義した問題を解くために、solveメソッドを呼び出します。

解を求めるアルゴリズムはPuLPが自動的に選択します。

⑦結果を表示する

解の値を出力します。value関数を使って目的関数の値を取得しています。


上記のコードを実行すると、以下のように結果が表示されます。

[実行結果]
出店する場所: 場所3
最適な評価スコア: 80.0

この結果から、ピザ店を出店する最適な場所は場所3であり、評価スコアは80点であることが分かります。


今回の例では、ピザ店を出店する場所を最適化する問題を定義し、PuLPを使って解くことで、最適な出店場所とそのときの評価スコアを求めました。