Insight Edgeのデータサイエンティストのki_ieです。 数理最適化の専門家として、これまでさまざまな課題を数理最適化問題としてモデリングしてきました。 モデリングはアルゴリズム設計と比べて注目を集めることが少ないようですが、 実際には技術的な知見・調査を要求する骨の折れるタスクです。
このタスクを簡単にしたいとは日々思っていたところですが、最近 OpenAI o1 というモデルの論理的推論能力が高いらしいという聞きました。この賢いLLMがモデリングのお手伝いをしてくれたら嬉しいですね! 今日は数理最適化問題(混合整数計画問題)のモデリングをどれだけLLMに任せられるのか、簡単な実験結果をご紹介します。
数理最適化問題とは
数理最適化問題と混合整数計画問題の基礎知識がある方はこの節はスキップしましょう(面白いことは一つも書いてありません)!
数理最適化問題とその実行可能解・最適解
数理最適化問題とは「変数・制約・目的関数」が与えられたときに、 「制約を守るなかで最も目的関数を小さく(または大きく)する決定変数を選ぶ」 という問題です。
数理最適化問題は、一般に以下の形で表現できます:
数理最適化問題
- 変数 :
- 変数
は の中から選べる - 制約 :
は がすべての について成り立つように選ぶ - 目的関数(最小化) :
- 上記ルールを守ったうえで
を最小化したい。
上手に
例: おにぎりの仕入れ量の適正化
- 変数: おにぎりに仕入れ量
- 制約: おにぎりが店から溢れない
- 目的関数:
: おにぎり を仕入れたときの期待利益
一方、問題によっては最適解を求めることが極めて難しいことがあります。
おにぎりの仕入れ量の適正化問題は
混合整数計画問題
数理最適化問題の中でも特別に重要な問題クラスとして、混合整数計画(MIP; Mixed Integer Programming)問題があります。
これは実行可能領域
混合整数計画問題
- 変数 :
- 制約 :
を行ベクトルとして集めた行列を , を集めたベクトルを としたら、まとめて と書ける。 - 目的関数(最小化) :
変数に別途上下限を許す場合も、等号制約を許す場合もある。いずれもここで示した形に容易に変形できる
この問題クラスの重要性を説明するために、まず数理最適化を利用した課題解決の一般的な流れを説明します。 さまざまなタイプの数理最適化問題に対して、最適解または最適解ではないにせよ目的関数値の良い実行可能解を求めてくれるプログラムが作られています。これらのプログラムはよく「ソルバー」とよばれます。数理最適化の考え方とソルバーを利用して現実の課題を解くときの流れは以下のようになります。
- 課題の整理
- 課題を数理最適化問題としてモデル化
- 数理最適化問題をソルバーで求解する
- 得られた最適解(または目的関数値の良い実行可能解)を現実世界で採用する
課題を数理最適化問題に落とし込むことにも技術的な難しさがありますが、 その数理最適化問題を解くソルバーを設計・実装することもまた大変に難しいことです。 そのため、できれば既存のソルバーを用いて求解できるような範囲でモデル化をしたいというのが数理最適化エンジニアの本音です。
MIPによるモデリングはこの観点で大変すぐれています。MIPは多様な問題を表現でき、さらに優れたソルバーが存在するからです。 MIPは制約・目的関数が線形に限定されているため一見すると限られた表現力しかないように見えますが、0, 1の値しかとらないバイナリ変数を巧みに使うことで複雑な論理関係を表現でき、幅広い問題を表現可能です。表現できる問題の幅広さゆえ、学術的にも深く研究され、ソルバーの研究が積み重ねられてきました。その結果、優れた商用・OSSのソルバーが存在するのです。
このような背景から、MIPによるモデリングは数理最適化の実務においてなくてはならない基本技術となっています。
LLMに混合整数計画問題をモデリングさせたいモチベーション
課題のMIPモデリングというのはなかなか骨の折れる作業です。 論理的に正しいというだけではなくソルバーにとって解きやすいモデルを作ることが求められるため、 難しい課題の場合は最適化モデルの試行錯誤・調査の1サイクルだけで数日かかってしまう、ということも稀ではありません。
この作業、なるべくサボりたいですね。性能向上の著しいLLMに手伝ってもらえれば、 まるごと作業代替とはならなくとも効率化できるのではないか?というのが、本記事で検証したいポイントです。
数理最適化エンジニアとして確認したい具体的なポイントは以下の3つです。
- 有名問題をモデル化できるか / 有名定石を利用できるか?
- 有名問題に簡単な要件を追加してもモデル化がうまくいくか?
- 複雑な要件を上手にモデル化できるか?
LLM に 1. ができたら、数理最適化初心者/学習者にはLLMによる補助が有用だと考えられるでしょう。
数理最適化問題のモデリングにはさまざまな「定石」が登場します。
例えば、0/1変数
2.ができたら、実務的なモデリングの補助としても使えそうです。 実際の問題は有名定石単体で解けないケースのほうが多く、 そのような場合定石を組み合わせたり、自分でテクニックを作ってモデル化する必要があります。 ここまでLLMがやってくれるなら、実務的なモデリングの補助として十分有用でしょう。
3.は、ここまでできたらモデリングの初手はLLMとの対話になりそうですね。 これで毎回完璧な答えが出てきたら私達は冷や飯を食わされることになりそうですが…どこまでできるか見てみましょう。
LLM に数理最適化問題をモデリングさせる
現在利用可能な o1 モデルの o1-mini モデルを利用して実験を行います。 確認したいポイントに対応させて、3つのレベルに分けて実験を進めましょう。
1. 有名問題をモデル化できるか/有名定石は使えるか?
まずは有名問題・有名定石のモデリングをさせてみましょう。毛色の違う2つの有名問題を解かせてみます。
巡回セールスマン問題
o1-mini へ次の質問を投げました:
次の課題を混合整数計画問題としてモデル化してください。
「10個の都市をすべて回って出発地点に返ってくる必要がある。移動時間を最短化したい。」
結果は「パラメタ」「決定変数」「制約」「目的関数」の4セクションに分けてください。
これは巡回セールスマン問題という有名問題で、特殊なモデリングの技法が使われていますが「知っていれば書ける」タイプの問題です。 o1-mini の出力を見てみましょう。見出しのレベルだけ編集で本文に合うように揃えている点以外、出力そのままです。
パラメタ
: 10個の都市の集合。 : 都市 から都市 への移動時間( , )。 決定変数
: 都市 から都市 へ移動する場合に1、そうでない場合に0。 (連続変数): 都市 の訪問順序を表す補助変数(サブツアー除去のため)。ここでは都市1を出発地点とし、 とする。 制約
- 各都市からちょうど1つの都市へ出発する
- 各都市へちょうど1つの都市から到着する
- サブツアーを防止するための順序変数に関する制約(ミラー・タミルゾーラックの制約)
- 順序変数の範囲制約
目的関数
総移動時間を最小化する:
このモデルは、10個の都市を全て一度ずつ訪問し、出発地点に戻る巡回経路(ツアー)を見つけるための混合整数計画問題として定式化されています。制約条件により、各都市の出発と到着が一度ずつ行われることを保証し、順序変数を用いることでサブツアーの発生を防いでいます。目的関数は、全体の移動時間を最小化することを目指しています。
正しく巡回セールスマン問題がモデリングできているようですね! 人名だけ間違っているようです。 制約 3., 4. は Miller-Tucker-Zemlin (MTZ) 定式化などと呼ばれます(正確には制約3., 4.を含むこのモデル全体を指す言葉だと思います)。 o1-mini の出力では「ミラー・タミルゾーラック」という知らない人の名前が出てきましたが、これはMTZの人名が日本語で書かれることが稀であるから起きる間違いかもしれませんね。 ちょっと怪しい言葉が登場してしまいましたが、o1-mini は巡回セールスマン問題を「知っている」ということがわかりました。
クラス分け問題
別の有名問題、クラス分け問題を定式化をしてみましょう。 o1-mini へ次の質問を投げました。
次の課題を混合整数計画問題としてモデル化してください。
「120人の学生を3つのクラスに分けたい。3つのクラスの人数は等しくしたうえで、クラス間の成績のばらつきを最小に抑えたい。」
結果は「パラメタ」「決定変数」「制約」「目的関数」の4セクションに分けてください。
次の結果が返ってきました:
以下に、指定された課題を混合整数計画問題としてモデル化します。
パラメータ
学生の総数。
クラスの数。
学生( )の成績。
大きな定数(必要に応じて使用)。決定変数
バイナリ変数。
ここで、 。
クラスの平均成績(連続変数)。
クラス間の成績のばらつきを表す変数(連続変数)。最小化対象。制約
各学生はちょうど1つのクラスに割り当てられる。
各クラスの学生数は40人である。
クラスの平均成績を定義する。
クラス間のばらつきを定義する(例として最大の平均成績差を用いる)。
クラス間の平均成績差を表すために、以下の制約を導入します。
目的関数
クラス間の成績のばらつきを最小化する。ここでは、最大の平均成績差
を最小化します。
モデルの概要
- 目的: クラス間の平均成績差を最小化することで、成績のばらつきを抑える。
- 制約: 各学生が1つのクラスに割り当てられ、各クラスに40人の学生が配置される。
- 決定変数: 学生のクラス割り当てを表すバイナリ変数と、各クラスの平均成績およびばらつきを表す連続変数。
- パラメータ: 学生数、クラス数、および各学生の成績。
このモデルにより、120人の学生を3つのクラスに均等に分けつつ、クラス間の成績のばらつきを最小化する最適な割り当てを求めることができます。
おおむね問題のないモデリングですね!
「クラス間の成績のばらつきを最小に」というあいまいな言葉を「最大の平均成績差
2. 有名問題に簡単な要件を追加してもモデル化がうまくいくか?
有名な問題は知っている/モデリングできるということがわかったので、先程の2問題に少し要件を加えてみましょう。
巡回セールスマン問題 + α
巡回セールスマン問題に要件を加えた問題を投げてみます。下線部 が追加要素です。
次の課題を混合整数計画問題としてモデル化してください。
「10個の都市をすべて回って出発地点に返ってくる必要がある。移動時間を最短化したい。 ただし、特定の3都市を先に訪問し、残りの7都市を後に訪問したい。 」
結果は「パラメタ」「決定変数」「制約」「目的関数」の4セクションに分けてください。
結果は次の通りです(数式の開始終了記号が一部変だったので見やすいよう手作業で修正しています):
以下に、課題を混合整数計画問題としてモデル化しました。
パラメタ(Parameters)
: 都市の集合、 。 : 先に訪問すべき特定の3都市の集合、 (例: )。 : 都市 から都市 への移動時間( , )。
決定変数(Decision Variables)
: バイナリ変数。都市 から都市 への移動が選択された場合に 1、そうでない場合に 0( )。 : 順序変数。都市 が訪問される順序を表す連続変数( は 1 から 10 の整数)。
制約(Constraints)
- 出発点からの移動:
- 出発地点(例えば都市 1)から出る経路は1つ。
- 各都市の出入り:
- 各都市から出る移動はちょうど1つ。
- 各都市に入る移動はちょうど1つ。
- 巡回路の排除(サブツアー排除):
- ミラー・タム・ゾメラック(MTZ)制約を適用。
- 訪問順序の制約:
- 特定の3都市
は、出発点から最初の3つの訪問都市でなければならない。 - 残りの7都市は、訪問順序4より後でなければならない。
- 出発点の順序固定:
- 出発地点(例えば都市 1)の順序を1に固定。
目的関数(Objective Function)
- 移動時間の最小化:
以上のモデルにより、10都市をすべて回って出発地点に戻る際に、特定の3都市を先に訪問しつつ、総移動時間を最短化する経路を求めることができます。
これもほぼ正しそうですね! 良い点も気になるところもあるのでコメントしておきます:
- 先に訪問すべき都市を
の部分集合 として定義しているのは、見通しがよく素晴らしい。 制約 1, 2 を分けているのが不思議。
- 2 で統一したらよさそう。
- 1 での「入る移動」を省略をしているのは、数学的には間違いとはいえない(残りの 1, 2 の制約から導かれる) が、それで意味のある高速化がおきるのかは不明。普通は 2 で統一する気がします。
が連続変数なのか整数変数なのかよくわらかない書き方になっている。技術的には「 の連続変数として定義したら結果的に整数変数になってくれる」というタイプの変数なので、連続変数と書くのが適切。- 制約4の
は、正しくは であるべき。- 定数ミスは慣れてる人でもしてしまう軽微な問題。
- しかし
みたいな書き方だったらミスが発生しないのだから、せっかくならそう書いてほしい。
人力の確認と修正が入る前提であれば、それなりに有用な出力を出せていると思います。
クラス分け問題 + α
クラス分け問題の発展編も解かせてみましょう。 o1-mini へ次の質問を投げます。LLM に喧嘩を防いでもらいましょう。
次の課題を混合整数計画問題としてモデル化してください。
「120人の学生を3つのクラスに分けたい。3つのクラスの人数は等しくしたうえで、クラス間の成績のばらつきを最小に抑えたい。 ただし、何対かの喧嘩をしてしまう生徒ペアがあるため、それらのペアの生徒は必ず別のクラスにしてほしい。 」
結果は「パラメタ」「決定変数」「制約」「目的関数」の4セクションに分けてください。
次の結果が返ってきました:
パラメタ
: 学生の集合、 。 : クラスの集合、 。 : 学生 の成績。 : 喧嘩をしている学生ペアの集合、 。 決定変数
: バイナリ変数。学生 がクラス に割り当てられる場合は1、そうでなければ0。 : クラス の総成績。 : 最大クラス成績。
: 最小クラス成績。 制約
各学生はちょうど一つのクラスに割り当てられる:
- 各クラスの人数が40人である:
- 喧嘩をしている学生ペアは同じクラスに割り当てられない:
- クラス成績の定義:
- 最大および最小クラス成績の定義:
目的関数
クラス間の成績のばらつきを最小に抑えるため、最大クラス成績と最小クラス成績の差を最小化する。
このモデルにより、120人の学生を3つのクラスに均等に分けつつ、クラス間の成績のばらつきを最小限に抑え、喧嘩をしている学生ペアが同じクラスに割り当てられないようにすることができます。
すごい、完璧ですね。
3. 複雑な要件を上手にモデル化できるか?
ここまで、有名問題に毛が生えた程度の問題であれば o1-mini はそれなりに正しくモデル化してくれることがわかりました。 最後にしっかりと複雑な要件を与えて、モデル化できるか見てみます。
o1-mini へ次の質問を投げます。
次の課題を混合整数計画問題としてモデル化してください。
「拠点にある一台の車を使ってすべての店舗を回って拠点に戻る計画を立てたい。拠点と各店舗にはそれぞれタイムウィンドウが設定されている。各店舗のタイムウィンドウは最大3つであり、作業開始時間がいずれかのタイムウィンドウに入っていれば許されるものとする。拠点のタイムウィンドウは1つであるが、出発時刻・帰還時刻のいずれもここに収まる必要がある。巡回中のいずれかのタイミングで1度だけ拠点への報告業務を行うため、ここで一定の時間を使う必要がある。報告業務はいずれかの地点での作業終了直後に行うものとする。報告業務を行うことができるタイムウィンドウは1つ指定されているものとする。各店舗での作業時間・地点間の移動時間・報告業務の時間はパラメタで与えられる。」
結果は「パラメタ」「決定変数」「制約」「目的関数」の4セクションに分けてください。
結果は次の通りです:
パラメータ
: 拠点および店舗の集合。拠点を0、店舗を1,…, とする。 : 拠点のタイムウィンドウ。 (最大3つ): 店舗 の各タイムウィンドウ。 : 報告業務を行うタイムウィンドウ。 : 地点 から地点 への移動時間。 : 店舗 での作業時間。 : 報告業務に要する時間。 : 十分に大きな定数(ビッグM)。 決定変数
: 車が地点 から地点 へ移動する場合に1、そうでない場合に0。 : 地点 に到着する時刻。 : 地点 で報告業務を行う場合に1、そうでない場合に0。 : 店舗 がタイムウィンドウ ( )を使用する場合に1、そうでない場合に0。 制約
- 各店舗の訪問
- 各店舗は一度だけ訪問される:
- 拠点から出発する経路:
- 拠点に帰着する経路:
- タイムウィンドウの選択と遵守
- 各店舗はいずれかのタイムウィンドウを選択する:
- 到着時刻が選択されたタイムウィンドウ内にある:
- 報告業務の実施
- 報告業務は一箇所で行われる:
- 報告業務を行う時刻が指定のタイムウィンドウ内:
- 報告業務の開始時刻が作業終了直後である:
これを線形化するために以下の制約を追加: - 時間の整合性
- 時間の流れを維持する:
拠点のタイムウィンドウ遵守
- 出発時刻が拠点のタイムウィンドウ内にある:
- 帰還時刻が拠点のタイムウィンドウ内にある:
ここで、 は拠点への最終帰還時刻とする。 サブツアーの排除
- 順序変数
を用いたMTZ制約: ここで、 は地点 の訪問順序を示す連続変数であり、 。 目的関数
- 総移動時間の最小化:
※ 他の目的(例:総移動距離の最小化)を設定することも可能。以上のモデルにより、10都市をすべて回って出発地点に戻る際に、特定の3都市を先に訪問しつつ、総移動時間を最短化する経路を求めることができます。
なんとなくそれっぽくてすごい!のですがよく見ると変なところが目立ちますね。見ていきましょう。
タイムウィンドウ関係の制約は正しく書けていません。「2. タイムウィンドウの選択と遵守」の「到着時刻が選択されたタイムウィンドウ内にある」という制約で「
「3. 報告業務の実施」の「報告業務の開始時刻が作業終了直後である」という制約は意味不明なものになっています。他の制約にも報告業務による時間経過を妥当な形でモデリングしている箇所はないので、本モデルでは報告業務は無視されていると考えていいでしょう。
これくらいしっかりと間違えていると、 LLM が答えてくれたモデルを修正して正しいモデルを作るというのが効率の良い作業なのか疑問になってきます。
まとめ
実験結果のまとめです:
- 有名問題をモデル化できるか / 有名定石を利用できるか? ▶ できる
- 有名問題に簡単な要件を追加してもモデル化がうまくいくか? ▶ ちょっとできる
- 複雑な要件を上手にモデル化できるか? ▶ できない
o1-mini は有名問題の知識をもっており、これに簡単な改変を加える程度の思考であればある程度やってくれそうです。 一方で、見たことがないような複雑な要件を与えると、意味不明なモデリングを行ってしまうようです。
現時点では以下の2つの使い方ができそうです:
- 数理最適化初心者が簡単なモデルを作りたいとき・学習したいとき
- 簡単なモデルは作ってくれる
- ただし正誤判断は自分でできる必要があるため、 教科書で基本的な勉強をしたうえで利用する
- 中級者~上級者レベルの人のモデリング補助
- LLMの知識の幅は圧倒的。調査・検討をしたいときに「ダメもとで聞いてみる」のには意味がありそう
- たとえば、定石をしらない問題がでてきたときに(枝葉の要件を削って)モデル化させてみて、良さそうなもの使う and/or 出典を調べて調査する、など
LLMを使って面白いモデルを書いていきましょう!