!pip install amplpy数理最適化モデリング言語 AMPL
数理最適化モデリング言語AMPL
- SCIP、HiGHS、CBCを含む無料のソルバーやGurobi、CPLEX、C-OPTなどを商用のソルバーが使える.
- 非線形最適化ソルバーも呼び出すことができる.
Google Colaboratory での実行
Google Colaboratory で実行する場合には,Googleのg-mailアカウントを準備してから、以下のボタンを押す.
- g-mailアカウントでログインする.
- 上部メニューのファイル/ドライブにコピーを保存を押して,Google Driveに保存する(保存しないと警告が出る).
- その後,以下のセルを実行し,amplpyをインストールし,notebookの設定を行う.
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をベースとして数理最適化モデルを書くと、モデルとデータが混ざりがちだ。 一つの問題を解くだけならそれでも良いが、実際問題を解決する際には、この特徴が重要な意味をもつ。
通常、複雑な実際問題の最適化モデルを構築する際には、はじめに簡単な小規模モデルを作成し、徐々に複雑で大規模なモデルにしていくという方法をとる。 モデルとデータが分離していないと、これが簡単にはできない。