数理最適化超入門
はじめに(最適化とは)
今日、大学に来たルートは、どのように選びましたか?
- 時間が短い?
- 乗り換えが楽?
- 景色がいい?
到着しなければならない時刻や・体力・費用などの制約がある中で、自分にとって最も良いルートを選んでいたと思います。
このように、制約のもとで目的を最良にする選択をすることを、最適化といいます。
最適化の3要素
先ほどの話しで登場した「制約」「目的」「選択」は、最適化の3要素です。
| 概念 | 数学の言葉 | 通学の例 |
|---|---|---|
| 変えられない条件 | 制約条件 | 始業時刻・体力・費用 |
| 何を良くしたいか | 目的関数 | 所要時間を最小化 |
| 何を決められるか | 決定変数 | ルート・出発時刻 |
ミクロ経済学と最適化
ミクロ経済学では、消費者が予算制約のもとで効用を最大化することを考える、という問題がよく登場します。 実はこれは、最適化問題の一種です。
消費者問題(ミクロ)
- 予算制約のもとで
- 効用を最大化する
- \(x_1\)、\(x_2\)の数量を決める
最適化問題(一般形)
- 制約条件のもとで
- 目的関数を最大化する
- 決定変数を求める
ミクロ経済学は、最適化問題の応用だったというわけです。 この問題を復習してみましょう。
例題:お菓子の効用最大化
次のような問題を考えます。
- 週のおやつ予算は600円。
- 摂取カロリーは1,200 kcalまで。
- チョコレート🍫とクッキー🍪の価格、カロリー、得られる満足度は下の表のように示した通り。
| 🍫チョコ(1枚) | 🍪クッキー(1袋) | |
|---|---|---|
| 価格 | 150円 | 100円 |
| カロリー | 150 kcal | 300 kcal |
| 満足度 | 4 | 3 |
このとき、満足度の合計を最大にするには、チョコレート🍫とクッキー🍪、どちらをどれだけ買えばよいでしょうか?
数式で書くと
この状況を、数式で表すと、次のようになります。
| 決定変数 | チョコ \(x\) 枚、クッキー \(y\) 袋 \((x,\, y \geq 0)\) |
| 目的関数 | \(\max\; 4x + 3y\) (満足度最大化) |
| 制約条件① | \(150x + 100y \leq 600\) (予算制約) |
| 制約条件② | \(150x + 300y \leq 1200\) (カロリー制約) |
グラフで書くと
この状況を、グラフにすると、次のようになります。
なぜ角が最適解になるのか?
- 目的関数(満足度)は直線
- 制約条件も直線 → 実行可能領域は凸多角形
満足度が大きくなる方向に直線をスライドさせると…
- 実行可能領域に目的関数が最後に触れるのは、必ず頂点になる
このタイプの問題を線形計画問題と呼びます。
現実への応用
このような最適化問題は、表に示すように多くの分野で実際の意思決定の場面に応用されています。
| 分野 | 最適化の問題 |
|---|---|
| 企業経営 | 生産計画/資源配分/メディアミックス |
| 政策 | 予算配分・社会厚生の最大化 |
| 金融 | ポートフォリオ最適化(リスク vs リターン) |
| サプライチェーン | コスト最小の輸送計画 |
| AI・機械学習 | 損失関数の最小化(モデルの学習) |
ただし、線形計画法「だけでは」解けない問題もあります。
- 変数が整数でなければならない → 整数計画問題
- 目的関数が非線形 → 非線形計画問題
- 不確実性がある → 確率的最適化
- 変数が数百万個 → 大規模最適化
このように、次々に手法が開発され、多くの問題が解けるようになっています
組み合わせ最適化
線形計画から整数計画へ
お菓子の最適化問題の例で、設定によっては、最適解がクッキー \(x = 3.7\) 袋…などということになることもありそうです。 ただし、そのような解が得られたとしても、そのようにクッキーを買うことはできません(実行不可能)。 では、どうすればよいでしょうか。
最適化問題に、変数が整数でなければならない制約を加えるとどうなるか、考えてみましょう。
先ほどのクッキーとチョコレートの例では、たまたま最適解が整数になりましたが、一般には線形計画問題の解が整数になるとは限りません。
線形計画問題(LP)と整数計画問題(IP)の違い
変数が整数でなければならないという制約を加えた問題を、整数計画問題といいます。 線形計画問題と整数計画問題の違いを簡単に整理してみます。
| 線形計画(LP) | 整数計画(IP) | |
|---|---|---|
| 実行可能領域 | 凸多角形(凸多面体) | 格子点 |
| 最適解 | 実行可能領域の頂点 | LPの最適解とずれる |
| 求解 | 比較的早く解ける | はるかに難しい |
整数計画問題の例:チーム編成問題
次のような問題を考えましょう。
- 8人の学生を2つのグループに分けたい
- 過去のグループワークですでに同じグループだったペアをできるだけ少なくしたい
これを数理最適化の問題としてとらえるために、決定変数・制約条件・目的関数を数式で表してみましょう。
決定変数
決定変数を0/1(ゼロ・イチ)変数にします。 0/1変数とは、0または1のどちらかの値を取る変数です。
\(x_{ig} \in \{0, 1\}\quad i=\{1,2,\ldots , 8\}\quad g=\{1, 2\}\)
\[x_{ig} = \begin{cases} 1 & \text{学生} i \text{ がグループ} g \text{ に入る} \\ 0 & \text{それ以外} \end{cases}\]
変数は、8人 × 2グループ = 16個の0/1変数です。
| \(g\backslash i\) | \(1\) | \(2\) | \(3\) | \(4\) | \(5\) | \(6\) | \(7\) | \(8\) |
|---|---|---|---|---|---|---|---|---|
| \(1\) | \(x_{11}\) | \(x_{21}\) | \(x_{31}\) | \(x_{41}\) | \(x_{51}\) | \(x_{61}\) | \(x_{71}\) | \(x_{81}\) |
| \(2\) | \(x_{12}\) | \(x_{22}\) | \(x_{32}\) | \(x_{42}\) | \(x_{52}\) | \(x_{62}\) | \(x_{72}\) | \(x_{82}\) |
それぞれの\(x_{ig}\)が0または1の値をとります。
例えば、グループ \(1=\{1, 2, 3, 4\}\)、グループ \(2=\{5, 6, 7, 8\}\)のとき、そのようなグループ分けの状態は次のような変数の組み合わせとして表すことができます。
| \(g\backslash i\) | \(1\) | \(2\) | \(3\) | \(4\) | \(5\) | \(6\) | \(7\) | \(8\) |
|---|---|---|---|---|---|---|---|---|
| \(1\) | \(1\) | \(1\) | \(1\) | \(1\) | \(0\) | \(0\) | \(0\) | \(0\) |
| \(2\) | \(0\) | \(0\) | \(0\) | \(0\) | \(1\) | \(1\) | \(1\) | \(1\) |
また、グループ \(1=\{1, 3, 5, 7\}\)、グループ \(2=\{2, 4, 6, 8\}\)のときには、\(x_{ig}\)は下の表のようになります。
| \(g\backslash i\) | \(1\) | \(2\) | \(3\) | \(4\) | \(5\) | \(6\) | \(7\) | \(8\) |
|---|---|---|---|---|---|---|---|---|
| \(1\) | \(1\) | \(0\) | \(1\) | \(0\) | \(1\) | \(0\) | \(1\) | \(0\) |
| \(2\) | \(0\) | \(1\) | \(0\) | \(1\) | \(0\) | \(1\) | \(0\) | \(1\) |
制約条件
上の2つの\(x_{ig}\)例を見て、何か決まりがあることに気づいたのではないでしょうか。 それがそのまま制約条件になります。
制約①:各学生は必ずどちらか1つだけのグループに所属
これは先ほどの\(x_{ig}\)の表でいうと、表の列和(縦方向の合計)が必ず1になることを意味します。 ある個人\(i\)についてみたときに、その人がどちらのグループにも属していない(\(x_{i1}=0\)かつ\(x_{i2}=0\))とか、両方のグループに所属している(\(x_{i1}=1\)かつ\(x_{i2}=1\))状態を許さない、という制約です。 これを数式で表現すると次のようになります。
\[x_{i1} + x_{i2} = \sum_gx_{ig} = 1 \quad (\forall i\in\{1,2,\ldots,8\})\]
制約②:グループサイズの上限は4人
これは先ほどの\(x_{ig}\)の表でいうと、表の行和(横方向の合計)が必ず4以下になることを意味します。 これを数式で表現すると次のようになります。
\[x_{1g} + x_{2g} + \cdots x_{8g} = \sum_ix_{ig} \leq 4 \quad (\forall g\in\{1,2\})\]
目的関数
目的関数は、過去のグループワークですでに同じグループだったペアをできるだけ少なくすることです。 これを数式で表現するために、補助変数 \(y_{ij} \in \{0,1\}\) を導入します。
\[y_{ij} = \begin{cases} 1 & \text{学生}i\text{と}j\text{が今回同じグループに入る} \\ 0 & \text{それ以外} \end{cases}\]
そして、学生\(i\)と学生\(j\)過去に同じグループだった回数を\(w_{ij}\)とすると、目的関数は以下のように表すことができます。
\[\min \sum_{i,j} w_{ij} \cdot y_{ij}\]
同じグループに入った全てのペアについての\(w_{ij}\)合計を最小化する、という意味です。
そして、\(y_{ij}\)と\(x_{ig}\)の関係を規定する制約式を追加します(これは少しテクニカルな話なので、理解しなくても構いません)。
\[y_{ij} \geq x_{ig} + x_{jg} - 1 \quad \forall i,j,g\]
手作業でやってみよう
【練習1】8人・履歴1回・2グループ(4+4)
過去のチーム分けが以下の通りであったとします。
- グループ \(X = \{1,2,3,4\}\)、グループ \(Y = \{5,6,7,8\}\)
このとき、できるだけ過去のブループが一緒だったペアが少なくなるように、2グループに分けてください。
| グループ 1 | グループ 2 |
|---|---|
| ? | ? |
そのグループ分けにおいて、過去に同じグループで一緒だったペアは、合計で何ペアありますか?
【練習2】8人・履歴2回・2チーム(4+4)**
過去のチーム分けが以下の通りであったとします。 - 1回目:チーム \(X = \{1,2,3,4\}\)、チーム \(Y = \{5,6,7,8\}\) - 2回目:チーム \(X' = \{1,3,5,7\}\)、チーム \(Y' = \{2,4,6,8\}\)
このとき、できるだけ過去ペアが少なくなるよう2チームに分けてください。
| グループ 1 | グループ 2 |
|---|---|
| ? | ? |
そのグループ分けにおいて、過去に同じグループで一緒だったペアは、合計で何ペアありますか? そして、「これが本当に最小か」自信を持って言えますか?
コンピュータで解くと…
グループ分けの履歴が1回増えると、最適解を見つけるのがより難しくなるのが分かったと思います。 コンピュータを使って全ての場合を列挙してこの問題を解くと、最適解でのスコアは8であることがわかりあます。 すなわち、これが証明された最小値だということです。
しかし、同じスコア8を達成する並べ方は9通りあります。 「正解はこれ」だけではなく「最適値が8であること(それよりも良い解がないこと)が証明された」ことも大事です。
| グループ 1 | グループ 2 | |
|---|---|---|
| (1) | 1, 2, 5, 6 | 3, 4, 7, 8 |
| (2) | 1, 2, 5, 7 | 3, 4, 6, 8 |
| (3) | 1, 2, 6, 8 | 3, 4, 5, 7 |
| (4) | 1, 2, 7, 8 | 3, 4, 5, 6 |
| (5) | 1, 3, 5, 6 | 2, 4, 7, 8 |
| (6) | 1, 3, 5, 7 | 2, 4, 6, 8 |
| (7) | 1, 3, 6, 8 | 2, 4, 5, 7 |
| (8) | 1, 3, 7, 8 | 2, 4, 5, 6 |
| (9) | 1, 4, 6, 7 | 2, 3, 5, 8 |
また、生徒の人数やグループの数が増えると、より困難になることが容易に想像できます。
実践:来週からのグループ分け
24人の学生を6人ずつ4つのグループに分けることを考えるとき、何通りの分け方があるでしょうか? その答えは、以下のように計算できます。
\[ \frac{{}_{24}C_{6}\times {}_{18}C_{6}\times {}_{12}C_{6}}{4!} = \text{9,663,972,130} \]
全ての分け方について過去ペア数の合計を計算するには、96.6億通りの計算が必要になります。 これは、コンピュータを使っても数分〜数時間かかる計算量です。 したがって、先ほどの8人のグループ分けでやったように、全ての組み合わせを計算し、最適解を全て列挙することは困難です。
しかし、整数計画問題として定式化し、その求解ツールを使えば、短時間で最適解(の1つ)を求めることができます。
ヒント
R + OMPR + HiGHS 使ってこの問題を解くRコードを公開します。 興味があるかたは、試してみてください。
定式化をΣ記号でまとめると
チーム編成問題の定式化をまとめておきます。 なんだか難しそうに見えますが、これまでの説明を思い出せば、1つ1つの式の意味はわかると思います。
\[\min \sum_{i < j} w_{ij} \cdot y_{ij}\]
\[\text{s.t.} \quad \sum_{g} x_{ig} = 1 \quad \forall i\]
\[\sum_{i} x_{ig} \leq 6 \quad \forall g\]
\[y_{ij} \geq x_{ig} + x_{jg} - 1 \quad \forall i,j,g\]
\[x_{ig},\, y_{ij} \in \{0, 1\}\]
空間最適化へ
チーム編成問題は、最適なグループ分けを見つける問題でした。 言うなれば、人をグループに割り当てる問題です。
空間的な問題に対しても、最適化の考え方が適用できることがわかります。 例えば、以下のような問題があります。
- 施設配置問題:人を施設に割り当てる
- どこに施設を置けば住民の移動距離が最小になるか
- 輸送問題:施設と施設を割り当てる
- 工場から倉庫への輸送コストを最小化
- 巡回セールスマン問題(TSP):人を経路に割り当てる
- 全都市を最短経路で回るルートを探す
これらはすべて、すべて「制約のもとで目的を最小化/最大化する」整数計画問題です。
施設配置問題
福岡市内に宅配ピザ店を3店舗新設することを考えてみましょう。 このとき、商圏人口を最大化するには、どこに出店すればよいでしょうか?
この問題にも0/1整数計画問題が適用できることがわかります。 すなわち:
- 決定変数:各候補地に置くか否か(0/1)
- 目的関数:カバーされる人口の最大化
- 制約条件:出店数 = 3
1店舗だけ出店する場合とは、考え方がちょっと変わりますよね。
巡回セールスマン問題(TSP)
これは例えば\(n\)個の支社をすべて1回ずつ訪問して本社に戻る最短ルート(訪問順)を求める問題です。
上の図に示すように、訪問すべき地点が7であれえば、全ての経路数 = 7! / 2 = 2,520通り程度です。 しかし、地点数が増えると経路数は爆発的に増加します。 そうなると、コンピュータを使っても、大きなスケールの問題を解くのは難しくなります。
まとめ
- 線形計画:連続変数、グラフで解ける
- 整数計画:0/1変数、組み合わせ爆発、でも定式化は同じ発想
- グループ分けも施設配置もTSPも同じ枠組み
- GISと組み合わせると空間的な最適化へ
ヒント
次回:空間最適化の考え方を使って、自転車観光ルートを考えてみたいと思います。