課題(第1回):p-median 問題のモデリング¶

この課題では、スーパーマーケットの配置計画を題材に、p-median 問題という最適化問題を 自分の手で数式にする(モデリングする)ことに挑戦する。

  • この資料には考え方と記号の定義だけが書いてある。数理モデル(数式)は書いていない。
  • 資料を読んだうえで、目的関数と制約条件を自分で数式にして、レポート雛形 (pmedian_課題_学籍番号_氏名.docx)に記入して提出すること。
  • 数式は必ず Word の数式ツールで入力すること(雛形の注意事項を参照)。
  • 次回(第2回)は、今回作った数理モデルをプログラム(pulp)で実装して実際に解く。

1. どこにスーパーを置くべきか?¶

ある地域に住民が住んでいる街(需要点)がいくつかあり、 スーパーマーケットを建てられる候補地(配置点)もいくつかあるとする。 会社の予算の都合で、店舗は決められた数しか建てられない。

さて、どの候補地に店舗を建てるのが「良い」配置だろうか。

「良い」を決めるには基準が必要である。ここでは 「地域全体の住民が、店までの移動で苦労しないこと」を基準にする。 これを数値で表したものが、次に説明する重み付き総移動距離である。

2. 重み付き総移動距離¶

住民は自分の街から一番近い(正確には、配置された店舗のうち一番使いやすい)店舗まで移動する。 このとき、地域全体の「移動の苦労」は

(街の人口)×(その街から利用する店舗までの距離)を全部の街について足したもの

で表せる。これを重み付き総移動距離と呼ぶ。 人口を掛けるのは、100人の街が2km 移動するのと、1000人の街が2km 移動するのとでは、 地域全体としての負担が10倍違うからである。 単位は [km] ではなく[人/km](全住民の移動距離の合計、延べ移動距離)になることに注意すること。

2.1 手を動かして確認しよう¶

小さな例で実際に計算してみよう。 街が3つ(A, B, C)、店舗の候補地が2つ(候補地1, 候補地2)ある地域を考える。 建てられる店舗は1つだけとする。

街 人口 候補地1までの距離 候補地2までの距離
A 100人 1 km 4 km
B 300人 2 km 1 km
C 200人 3 km 2 km

候補地1に建てた場合:全員が候補地1を使うしかないので

$100 \times 1 + 300 \times 2 + 200 \times 3 = 1300$ [人/km]

候補地2に建てた場合:

$100 \times 4 + 300 \times 1 + 200 \times 2 = 1100$ [人/km]

候補地2に建てた方が重み付き総移動距離が小さい、つまり地域全体にとって「良い」配置だと分かる。 Aの住民だけを見ると遠くなるが、人口の多いBとCが近くなるので全体では得をしているわけである。

このように、すべての置き方の中で重み付き総移動距離が最小になるように、 決められた数の店舗を配置する問題をp-median 問題と呼ぶ。

上の例は「3つの街、2つの候補地、店舗1つ」なので2通りを比べれば済んだが、 候補地が20か所で店舗が5つなら置き方は15,504通りもある。 だからこそ、問題を数式で書いてコンピュータに解かせる必要がある。 その「数式で書く」作業=モデリングが今回の課題である。

3. 最適化問題の形¶

最適化問題は、次の2つの部品でできている。

  • 目的関数 … 最小化(または最大化)したい指標
  • 制約条件 … 解が満たさなければいけない条件

p-median 問題の場合、それぞれは言葉で書くと次のようになる。

目的関数(最小化)

  • 重み付き総移動距離

制約条件

  1. 各需要点の住民は、ちょうど1つの店舗を利用する
  2. 店舗が配置されていない配置点は利用できない
  3. 配置する店舗の数はちょうど $k$ 個

課題では、この言葉で書かれた目的関数と制約条件を、次節で定義する記号を使って数式にする。

4. 記号の定義¶

数式で書くために、記号を用意する。課題で使ってよいのはここにある記号だけである。

4.1 記号(添字)¶

  • $i$ … 需要点(街)の番号。需要点は全部で $n$ 個あり、$i = 1, 2, \cdots, n$
  • $j$ … 配置点(店舗の候補地)の番号。配置点は全部で $m$ 個あり、$j = 1, 2, \cdots, m$

4.2 定数(あらかじめ与えられている値)¶

  • $p_i$ … 需要点 $i$ の人口
  • $d_{ij}$ … 需要点 $i$ から配置点 $j$ までの距離
  • $k$ … 配置する店舗の数

4.3 変数(コンピュータに決めてもらう値)¶

どちらも0 か 1 しか取らない変数(0-1変数)である。

  • $x_{ij}$ … 需要点 $i$ の住民が配置点 $j$ の店舗を利用するなら 1、しないなら 0
  • $y_j$ … 配置点 $j$ に店舗を配置するなら 1、しないなら 0

例えば「需要点3の住民が配置点2の店舗を利用する」ことは $x_{3,2} = 1$ と表せる。

4.4 記法の復習¶

総和記号 $\sum$:$\sum_{i=1}^{3} a_i = a_1 + a_2 + a_3$ のように「足し合わせる」ことを表す。

「すべての〜について」$\forall$:同じ形の式がたくさんあるとき、1本ずつ書く代わりに

$(式), \quad \forall i \in \{1, 2, \cdots, n\}$

と書くと「この式が $i = 1$ から $n$ のすべてについて成り立つ」という意味になる。

5. 課題:p-median 問題をモデリングしよう¶

第4節の記号を使って、第3節の目的関数と制約条件1〜3を数式で書き、 レポート雛形(pmedian_課題_学籍番号_氏名.docx)の各欄に記入すること。 雛形では、数式そのものに加えて式の意味の説明(式を展開して具体的に解説すること)も求めている。

いきなり全体を書くのは難しいので、次の順で考えるのがおすすめである。

5.1 目的関数を組み立てるステップ¶

  1. 1組だけ考える:需要点 $i$ の住民が配置点 $j$ の店舗を利用するときの 「人口 × 距離」を、$p_i$ と $d_{ij}$ で書いてみる。
  2. 変数を掛ける:ステップ1の式は「利用するとき」しか成り立たない。 利用しないときは 0 になってほしい。0 か 1 を取る変数 $x_{ij}$ をうまく使うと、 1つの式で両方の場合を表せる。
  3. 全部足す:ステップ2の式を、すべての需要点 $i$ とすべての配置点 $j$ について $\sum$ で足し合わせる。それが重み付き総移動距離=目的関数。

5.2 制約条件を組み立てるヒント¶

  • 制約条件1(住民はちょうど1店舗を利用): 需要点1だけについて考えると「$x_{1,1}, x_{1,2}, \cdots, x_{1,m}$ のうちちょうど1つだけが 1」。 これは総和を使うと1本の式で書ける。それを $\forall$ ですべての需要点に広げる。
  • 制約条件2(店舗がない配置点は利用できない): 「$y_j = 0$ ならば $x_{ij}$ も 0 でなければならない」を、 不等号($\leq$)1本で表すことができる。$y_j = 0$ の場合と $y_j = 1$ の場合を それぞれ代入して、狙い通りの意味になるか確かめること。
  • 制約条件3(店舗はちょうど $k$ 個): 「$y_1, y_2, \cdots, y_m$ のうち 1 になっているものの個数が $k$」を総和で書く。
  • 変数制約:$x_{ij}$ と $y_j$ が 0 か 1 しか取らないことも、 忘れずに制約として書くのが数理モデルの作法。 (例:$x_{ij} \in \{0, 1\}$ のように書く)

5.3 検算のすすめ¶

数式が書けたら、第2節の小さな例(街3つ、候補地2つ、店舗1つ、$n=3, m=2, k=1$)を 自分の数式に当てはめてみること。 候補地2に建てる解($y_1 = 0, y_2 = 1$、全員が候補地2を利用)がすべての制約を満たし、 目的関数の値が 1100 [人/km] になれば、モデルは正しくできている。

6. 提出方法¶

  • レポート雛形 pmedian_課題_学籍番号_氏名.docx のすべての欄を埋めて提出すること。
  • ファイル名の「学籍番号」と「氏名」は自分のものに書き換えること(例:24B00000_日大太郎)。
  • 数式は必ず Word の数式ツールで入力すること(雛形冒頭の注意事項を参照)。

6.1 提出前チェックリスト¶

  • 記号、定数、変数の定義がすべて具体的に書けている
  • 目的関数に「最小化する」ことが明示されている
  • 制約条件1〜3がすべて数式で書けていて、$\forall$ の範囲も書けている
  • 変数が 0-1 変数であることが制約として書けている
  • 各式について、展開した具体例つきの意味の説明が書けている
  • 第2節の小さな例で検算した