数理最適化による問題解決は、以下のステップを繰り返しながら進めるのが一般的です。
最初に、解決したい問題が何であるか、何を達成したいのか(目的)、どのような制約があるのかを明確に言葉で定義します。関係者へのヒアリングや現状分析を通じて、曖昧さをなくし、具体的な目標と条件を洗い出します。
例:配送コストを最小限に抑えたい。ただし、各顧客の要求量を満たし、各トラックの積載容量を超えてはならない。
言語化された要件を、数理最適化モデルの構成要素である「変数」「目的関数」「制約条件」を用いて数式で表現します。どの情報を変数とし、目的をどのように数式で表し、制約をどのように不等式や等式で記述するかを決定します。このステップがモデルの品質を大きく左右します。
例:
変数 $x_{ij}$ を工場 $i$ から顧客 $j$ への輸送量とする。
目的関数 $\min \sum_{i,j} c_{ij} x_{ij}$ ($c_{ij}$ は輸送コスト)。
制約条件 $\sum_i x_{ij} \geq d_j$ (顧客 $j$ の需要 $d_j$ を満たす)、$\sum_j x_{ij} \leq s_i$ (工場 $i$ の供給量 $s_i$ を超えない)。
最初から大規模な実データで試すのではなく、意図した通りにモデルが機能するかを確認するために、小規模で単純なデータ(インスタンス)を作成して試します。これにより、定式化の誤りや基本的な挙動を早期に発見しやすくなります。
例:工場2つ、顧客3つ程度の小さなデータで輸送問題を解いてみる。
定式化されたモデルとデータ(インスタンス)を、数理最適化ソルバーに入力し、解を計算させます。JijZeptのようなプラットフォームは、モデルを記述し、適切なソルバーを選択して実行するプロセスを支援します。
ソルバーが解を見つけるまでにかかった時間(計算時間)と、得られた解の質(目的関数の値、制約違反の有無など)を評価します。ソルバーによっては、最適解が保証される場合と、近似解が得られる場合があります。
例:計算時間は5秒、得られた解の目的関数値は1500、全ての制約、および要求した条件を満たしている。
得られた解が、元の問題の文脈で意味のあるものになっているか、直感に反していないかを確認します。単に数値を見るだけでなく、グラフや図などを用いて結果を可視化すると、問題点や改善のヒントが見つかりやすくなります。
例:輸送計画の結果を地図上にプロットし、非効率なルートがないか確認する。スケジュール結果をガントチャートで表示する。
数理最適化のプロジェクトは、1回のサイクルで完了することは稀です。得られた結果を基に、モデルの改善点を見つけ、再度定式化やデータの見直しを行い、再度ソルバーにかけるという反復的なプロセスが重要です。
このように、数理最適化のプロジェクトは、要件の言語化から始まり、定式化、求解、評価、改善のサイクルを繰り返すことで、徐々に要件に合致した解を見つけていきます。そのため、このサイクルをいかに高速に回すかが、プロジェクトの成功に大きく寄与します。
次の章から、実際にこのフローに沿って数理最適化のプロセスを進めていきましょう。