数理最適化とは?3要素・アルゴリズム・機械学習との違いをPythonで解説
数理最適化とは、目的関数・制約条件・変数という数式で問題を表し、制約を満たす範囲で目的の値を最大または最小にする解を求める数学的手法です。英語では mathematical optimization(または mathematical programming=数理計画法)と呼び、読み方は「すうりさいてきか」。生産計画・物流・人員配置・投資配分など「限られた資源をどう割り振れば最も得か」という意思決定を、勘や試行錯誤ではなく数式とアルゴリズムで解くのが本質です。本記事では定義と3要素、問題の種類、代表アルゴリズム、機械学習との違い、Pythonでの実装、実際の活用事例までを整理します。
まとめ
数理最適化は「目的関数・制約条件・変数」の3要素で意思決定を数式化し、最適解を求める技術です。問題は線形計画・整数計画・非線形計画・組合せ最適化に分類され、それぞれシンプレックス法や分枝限定法などの解法が対応します。データからパターンを学ぶ機械学習が「予測」の技術なのに対し、数理最適化は与えた制約のもとで「最良の打ち手を決める」技術で、両者は競合ではなく組み合わせて使います。実装はPythonのSciPy・PuLP・OR-Toolsで始められ、物流ルートやシフト作成など効果が金額で測れる領域から導入するのが定石です。以下で各要素を具体的に見ていきます。
数理最適化とは何か(数理計画法との関係)
数理最適化は、達成したい目標を数式(目的関数)で表し、守るべき条件(制約条件)を満たす変数の組み合わせのなかから、目的関数を最大化または最小化する解を導くプロセスです。「数理計画法(mathematical programming)」はほぼ同義で、歴史的経緯から計画法と呼ばれてきた分野を指します。近年は programming(=プログラミング)との混同を避けるため optimization の語が主流です。
機械学習ブームで注目が集まりましたが、起源は古く、1947年にジョージ・ダンツィグが線形計画問題の解法であるシンプレックス法を考案したことが近代的な数理最適化の出発点とされます。線形計画の実務応用が広がったことで再び関心を集め、以来、整数計画・非線形計画・組合せ最適化へと対象が広がり、現在はソルバー(求解エンジン)の高速化により、変数が数万を超える大規模問題も現実的な時間で解けるようになっています。
最適化を構成する3要素:目的関数・制約条件・変数
あらゆる最適化問題は次の3要素に分解できます。この3つを正しく定義できれば、問題の半分は解けたと言えます。
| 要素 | 役割 | 例(生産計画) |
|---|---|---|
| 目的関数 | 最大化/最小化したい指標 | 利益を最大化 |
| 制約条件 | 解が満たすべき条件 | 原材料・作業時間の上限 |
| 変数(決定変数) | 意思決定で動かせる量 | 各製品の生産数 |
目的関数は「何を良し悪しの基準にするか」を一意に決める式です。利益最大化とコスト最小化のように相反する目的を同時に扱う場合は、重み付けで1つの式に統合するか、多目的最適化として扱います。制約条件は等式・不等式で表し、これが解の探索範囲(実行可能領域)を決めます。変数は連続値か整数かで問題の難しさが大きく変わり、その設計が解ける・解けないを左右します。各要素の決め方は決定変数とは?目的関数・制約条件との違いと決め方【数理最適化の基本】で詳しく扱っています。
最適化問題の種類(線形・整数・非線形・組合せ)
数理最適化は、目的関数と制約が線形か、変数が連続か整数かによって分類され、種類ごとに適した解法が異なります。自分の問題がどれに当たるかを見極めることが、ソルバー選びの第一歩です。
| 種類 | 特徴 | 代表的な用途 |
|---|---|---|
| 線形計画(LP) | 目的・制約がすべて線形、変数は連続 | 配合・生産量の配分 |
| 整数計画(IP/MIP) | 変数が整数(0/1含む) | 選ぶ・選ばないの決定 |
| 非線形計画(NLP) | 目的か制約が非線形 | 工学設計・パラメータ調整 |
| 組合せ最適化 | 離散的な組み合わせから最良を探す | 配送順・スケジューリング |
線形計画は最も扱いやすく、変数が数万規模でも高速に解けます。難しさが跳ね上がるのは変数に整数条件が付く整数計画で、選択肢の組み合わせが爆発的に増えるため厳密解の計算コストが高くなります。巡回セールスマン問題(最短の配送順を求める)に代表される組合せ最適化は、規模が大きいと厳密解が現実的な時間で求まらず、後述のメタヒューリスティクスで「十分良い近似解」を狙う運用が一般的です。
代表的な最適化アルゴリズム
アルゴリズムは問題の種類に対応して選びます。実務ではソルバーが内部で自動選択するため手書き実装は不要ですが、仕組みを知ると求解時間やソルバー選定の勘所がつかめます。
| アルゴリズム | 対象 | 考え方 |
|---|---|---|
| シンプレックス法 | 線形計画 | 実行可能領域の頂点を辿る |
| 内点法 | 線形・凸計画 | 領域内部を通り最適点へ |
| 分枝限定法 | 整数計画 | 候補を枝分かれで絞り込む |
| 勾配降下法 | 非線形計画 | 傾きに沿って解を更新 |
| メタヒューリスティクス | 組合せ最適化 | 近似解を反復改善 |
シンプレックス法は1947年以来使われる線形計画の基本解法で、大規模問題では内点法が有利な場面もあります。整数計画では分枝限定法(branch and bound)が緩和問題を解きながら不要な枝を切り落とします。厳密解が間に合わない大規模な組合せ問題では、遺伝的アルゴリズム・シミュレーテッドアニーリング・粒子群最適化などのメタヒューリスティクスで近似解を探します。特殊なハードとしては、QUBO形式に落とした組合せ問題をD-Waveなどの量子アニーリングで解くアプローチもあり、動向は量子コンピュータとは?仕組み・方式・実用化の現在地を実装目線で解説する技術ガイドで整理しています。
数理最適化と機械学習・AIとの違い
数理最適化と機械学習は混同されがちですが、解く問題が根本的に異なります。機械学習は過去データからパターンを学び、未知のデータに対する「予測」を出す技術です。対して数理最適化は、目的関数と制約を人が与え、その条件下で「最良の意思決定」を計算する技術です。
| 観点 | 機械学習 | 数理最適化 |
|---|---|---|
| 目的 | 予測・分類 | 意思決定・最適解 |
| 入力 | 大量の学習データ | 目的関数・制約条件 |
| 出力 | 予測値・確率 | 変数の最適な値 |
実務では両者を直列につなぐことが多く、機械学習で需要を予測し、その予測値を目的関数のパラメータとして数理最適化で在庫や配送計画を決める、といった連携が典型です。データが乏しく「何が最適か」を制約で明確に書ける問題は数理最適化が向き、ルールが複雑で明示しづらく実績データが豊富な問題は機械学習が向きます。報酬を手がかりに試行錯誤で方策を学ぶ強化学習は、逐次的な意思決定という点で最適化と目的が近く、両分野の中間に位置づけられます。
数理最適化のPython実装(SciPy・PuLP・OR-Tools)
Pythonには目的別に無料ライブラリが揃っており、小規模な検証ならすぐ始められます。線形計画ならSciPyのscipy.optimize.linprog、モデルを読みやすく書くならPuLP、配送・スケジューリングなど組合せ問題ならGoogle OR-Toolsが定番です。SciPyのlinprogは既定でHiGHSソルバーを使い、旧来のsimplex・interior-pointはバージョン1.9.0で非推奨、1.11.0で削除されました。
次はPuLPで「利益を最大化する2製品の生産量」を解く例です。PuLPは既定でCBCソルバーを呼び出します。
from pulp import LpProblem, LpMaximize, LpVariable, value, PULP_CBC_CMD
prob = LpProblem("production", LpMaximize)
x = LpVariable("x", lowBound=0) # 製品Aの生産量
y = LpVariable("y", lowBound=0) # 製品Bの生産量
prob += 300 * x + 400 * y # 目的関数:利益
prob += 2 * x + 3 * y <= 12 # 制約:原材料
prob += 1 * x + 1 * y <= 5 # 制約:作業時間
prob.solve(PULP_CBC_CMD(msg=0)) # 求解ログを抑制
print(value(x), value(y), value(prob.objective))
目的関数・制約・変数がそのままコードに対応している点に注目してください。数式に近い形でモデルを記述する専用言語を使いたい場合はAMPLのようなモデリング言語もあり、大規模問題や商用ソルバー(Gurobi・CPLEX)との連携で選ばれます。
ビジネスでの適用事例
数理最適化は「効果を金額や時間で測れる」領域で費用対効果が出やすい技術です。代表的な適用先を挙げます。
- 物流・配送計画:配送先の訪問順やトラック割当を組合せ最適化で決め、総走行距離を短縮する
- 生産・在庫計画:需要予測を制約に、利益最大かコスト最小になる生産量を線形・整数計画で算出する
- 要員シフト作成:勤務ルールや希望を制約に、必要人数を満たす勤務表を自動生成する
- 投資ポートフォリオ:リスク上限の制約下でリターンを最大化する資産配分を求める
いずれも「守るべき条件」が明確で、良し悪しを一つの指標で測れる問題です。導入時は、まず効果検証しやすい単一業務に絞り、手作業の結果と最適化結果を金額で比較してから対象を広げるのが失敗の少ない進め方です。逆に、制約が言語化できず判断基準が人によって揺れる問題は、数理最適化の前に業務ルールの整理が必要になります。
よくある質問
Q. 数理最適化は英語で何といいますか。
mathematical optimization です。歴史的には mathematical programming(数理計画法)とも呼ばれ、単に optimization(最適化)と略されることもあります。
Q. 数理最適化と数理計画法の違いは何ですか。
ほぼ同義です。programming が「計画」を指す古い用法に由来し、コンピュータのプログラミングとの混同を避けるため、近年は optimization の語が好まれています。
Q. 「最適化」の読み方と意味を教えてください。
読み方は「さいてきか」です。与えられた条件のもとで、目的の指標が最も良くなる状態を選ぶことを指します。
Q. optimization の意味は最適化と同じですか。
同じです。IT分野では性能改善(コード最適化など)も optimization と呼ぶため、文脈で「数式で最適解を求める数理最適化」なのか「性能改善」なのかを区別すると誤解を防げます。
Q. 数理最適化と機械学習はどちらを使うべきですか。
予測したいなら機械学習、制約下で最良の決定を求めたいなら数理最適化です。多くの現場では機械学習の予測値を最適化の入力にする形で併用します。