数理最適化モデリング言語 AMPL

数理最適化モデリング言語 AMPL の基本的な使用法

数理最適化モデリング言語AMPL

  • SCIP、HiGHS、CBCを含む無料のソルバーやGurobi、CPLEX、C-OPTなどを商用のソルバーが使える.
  • 非線形最適化ソルバーも呼び出すことができる.

Google Colaboratory での実行

Google Colaboratory で実行する場合には,Googleのg-mailアカウントを準備してから、以下のボタンを押す.

  • g-mailアカウントでログインする.
  • 上部メニューのファイル/ドライブにコピーを保存を押して,Google Driveに保存する(保存しないと警告が出る).
  • その後,以下のセルを実行し,amplpyをインストールし,notebookの設定を行う.
!pip install amplpy
from amplpy import ampl_notebook
ampl = ampl_notebook(
    modules=["highs","gurobi","cbc","scip","coin","gecode"],  #coin includes ipopt, couenne, bonmin
    license_uuid=None)

PCへのインストール方法

  • ポータルサイトでユーザー登録をする(フリーメールでは登録できないことがあるので注意)。

  • ポータルにログインし,Download AMPL & Solver bundleのOtherを押して,OSにあったインストーラーをダウンロードしてインストールする(uuidの入力はスキップする).

  • コマンドインターフェイス ampl,専用IDE amplide や VS-Code のampl拡張を使う.

  • Pythonパッケージ amplpy を動かすには、amplpyをインストールした後で,amplの実行ファイルがある場所を以下のようにEnvironmentで指定する。

from amplpy import AMPL, Environment
ampl = AMPL(Environment("/Users/ユーザー名/Documents/ampl/"))

構成

  • AMPLによる最適化問題のモデリング: AMPLの基本的な使い方
  • AMPLPYパッケージの使用法: amplpyパッケージによるPythonとAMPLの融合
  • MPライブラリ:新しく導入された自動再定式化の解説
  • 最適化ケーススタディ:ケーススタディによる実問題の解決の練習

なぜAI時代にはAMPLが推奨されるのか?

AMPLとLaTeXは、ともに40年以上の歴史をもち、多くのユーザーをもつ。そのため、AIエージェントの基礎になるLLMに十分に学習されている。 したがって、コーディングが得意なAIエージェントは、AMPLやLaTeXを熟知している。

ためしに、適当なAIチャットボット(Gemini)に「輸送問題のAMPLモデルを書いて」と依頼すると、以下のコードがえられる。

# 集合の定義
set ORIGINS; # 供給地(工場など)
set DISTS;   # 需要地(店舗など)

# パラメータの定義
param supply {ORIGINS} >= 0;  # 各供給地の供給可能量
param demand {DISTS} >= 0;    # 各需要地の必要需要量
param cost {ORIGINS, DISTS} >= 0; # 輸送単価

# 変数の定義
var x {ORIGINS, DISTS} >= 0;  # 実際の輸送量(決定変数)

# 目的関数:総輸送コストの最小化
minimize Total_Cost:
    sum {i in ORIGINS, j in DISTS} cost[i,j] * x[i,j];

# 制約条件1:供給量制限
subject to Supply_Constraint {i in ORIGINS}:
    sum {j in DISTS} x[i,j] <= supply[i];

# 制約条件2:需要量充足
subject to Demand_Constraint {j in DISTS}:
    sum {i in ORIGINS} x[i,j] >= demand[j];

次いで、「このコードをLaTeXに変換して」と依頼すると以下のLaTeXファイルが得られる。

\begin{eqnarray}
\text{minimize}  & \sum_{i \in O} \sum_{j \in D} c_{ij} x_{ij} & \\
\text{subject to}& \sum_{j \in D} x_{ij} \le s_i               & \forall i \in O  \\
                 & \sum_{i \in O} x_{ij} \ge d_j               & \forall j \in D  \\
                 & x_{ij} \ge 0                                & \forall i \in O, \forall j \in D
\end{eqnarray}

ここで、各記号の定義は以下の通り。

  • \(O\) : 供給地の集合 (ORIGINS)
  • \(D\) : 需要地の集合 (DISTS)
  • \(s_i\) : 各供給地 \(i\) の供給可能量 (supply)
  • \(d_j\) : 各需要地 \(j\) の必要需要量 (demand)
  • \(c_{ij}\) : 供給地 \(i\) から需要地 \(j\) への輸送単価 (cost)
  • \(x_{ij}\) : 供給地 \(i\) から需要地 \(j\) への実際の輸送量(決定変数 x)

これをコンパイル(ここではmarkdownに貼り付け)すると、以下の定式化が得られる。

\[ \begin{eqnarray} \text{minimize} & \sum_{i \in O} \sum_{j \in D} c_{ij} x_{ij} & \\ \text{subject to}& \sum_{j \in D} x_{ij} \le s_i & \forall i \in O \\ & \sum_{i \in O} x_{ij} \ge d_j & \forall j \in D \\ & x_{ij} \ge 0 & \forall i \in O, \forall j \in D \end{eqnarray} \]

可読性に優れ、そのまま動く。

もう一つAMPLを薦める理由として、モデルとデータの分離がある。Pythonをベースとして数理最適化モデルを書くと、モデルとデータが混ざりがちだ。 一つの問題を解くだけならそれでも良いが、実際問題を解決する際には、この特徴が重要な意味をもつ。

通常、複雑な実際問題の最適化モデルを構築する際には、はじめに簡単な小規模モデルを作成し、徐々に複雑で大規模なモデルにしていくという方法をとる。 モデルとデータが分離していないと、これが簡単にはできない。