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


<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->

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

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

## Google Colaboratory での実行

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

[![](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/scmopt/moai-manual/blob/main/01ampl-basic.ipynb)

- g-mailアカウントでログインする．
- 上部メニューのファイル/ドライブにコピーを保存を押して，Google
  Driveに保存する（保存しないと警告が出る）．
- その後，以下のセルを実行し，amplpyをインストールし，notebookの設定を行う．

``` python
!pip install amplpy
```

``` python
from amplpy import ampl_notebook
ampl = ampl_notebook(
    modules=["highs","gurobi","cbc","scip","coin","gecode"],  #coin includes ipopt, couenne, bonmin
    license_uuid=None)
```

## PCへのインストール方法

- [ポータルサイト](https://portal.ampl.com/account/MOAI/)でユーザー登録をする（フリーメールでは登録できないことがあるので注意）。

- ポータルにログインし，Download AMPL & Solver
  bundleのOtherを押して，OSにあったインストーラーをダウンロードしてインストールする（uuidの入力はスキップする）．
  <!-- - ログインすると **License UUID:** の後にIDが表示されるので，それをクリックしてクリップボードに記憶しておく．
  **注意：** uuidは公開しないように！ -->
  <!-- - Macにインストールする際には，使用するコマンド（amplkey, amplなど）をFinderで右クリックで開いて，「開発元を検証できません。開いてもよろしいですか?」というメッセージが出たら「開く」を押す． -->

- コマンドインターフェイス ampl，専用IDE amplide や VS-Code
  のampl拡張を使う．
  <!-- - amplのシェル環境で、uuidを用いてライセンスをactivateする（コマンドはポータルに表示される）。その後でリスタートとすることによって、amplとポータルで指定したソルバーが使えるようになる。 -->

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

``` python
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モデルを書いて」と依頼すると、以下のコードがえられる。

``` 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*<sub>*i*</sub> : 各供給地 *i* の供給可能量 (supply)
- *d*<sub>*j*</sub> : 各需要地 *j* の必要需要量 (demand)
- *c*<sub>*i**j*</sub> : 供給地 *i* から需要地 *j* への輸送単価 (cost)
- *x*<sub>*i**j*</sub> : 供給地 *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をベースとして数理最適化モデルを書くと、モデルとデータが混ざりがちだ。
一つの問題を解くだけならそれでも良いが、実際問題を解決する際には、この特徴が重要な意味をもつ。

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