AMPL(A Mathematical Programming Language)は、線形計画・整数計画・非線形計画などの数理最適化問題を、数式に近い記法で書くためのモデリング言語です。AMPLはモデルの記述・前処理・ソルバーへの受け渡しを担い、解を計算するのはHiGHS・Gurobi・CPLEXなどの外部ソルバーです。この記事では、輸送問題をAMPLのファイル3種(.mod・.dat・.run)とPythonのamplpyで解き、出力まで示します。あわせて、無料で使える範囲(pip版に同梱されるデモライセンスとCommunity Edition)の条件と、ソルバーの切り替え方を整理します。
検索結果には米Amplitude社の株式ティッカー「AMPL」も出ますが、本記事が扱うのは数理最適化の言語です。生成AIの文脈でいう「AI最適化」との違いはAIと最適化の違いで整理しています。動作確認の環境は Python 3.12.13・amplpy 0.18.0・AMPL 20260809・HiGHS 1.15.1・CBC 2.10.12(2026年10月27日時点)です。
まとめ:AMPLの要点と無料で使える範囲
- 役割:変数・目的関数・制約を数式に近い形で書き、標準形に変換してソルバーへ渡す。計算はソルバーが担う。
- 導入:
python -m pip install amplpyのあとpython -m amplpy.modules install highsでAMPL本体とHiGHSが入る。ライセンス登録なしでも動く。 - 無料の上限:pip版に同梱のデモライセンスは、線形で変数2,000・制約と目的関数の合計2,000まで、非線形は300まで(presolve後・実測)。無料のCommunity Editionを有効化するとオープンソースソルバーでサイズ制限がなくなる。
- 商用の条件:Community Editionは学習・個人の非商用・商用の試作まで。本番運用や事業上の利益を生む継続利用には有償ライセンスが要る(公式は年払いで月300ドル相当から)。
- Python:amplpy 0.18.0(2026年7月21日)はPython 3.8〜3.14に対応。
solve()は求解失敗時にも例外を出さない場合があるので、solve_resultを必ず確かめる。 - 選び方:ソルバーを差し替えながら大規模なLP・MIP・非線形を扱うならAMPL。無償のまま本番に載せるなら、Pyomo・PuLP・OR-ToolsなどOSSのモデラーが候補になる。
AMPLの仕組み:モデルとデータとソルバーを分ける言語
数理最適化の問題は「何を決めるか(決定変数)」「何を最小化・最大化するか(目的関数)」「守る条件(制約)」の3つで書けます。この3要素の考え方は決定変数・目的関数・制約条件の解説にまとめています。AMPLは、この3要素を集合(set)とパラメータ(param)を使って添字付きの式で書く、代数モデリング言語です。
AMPLの設計は、次の3つを別々のものとして扱う点に特徴があります。
- モデル(.mod):集合・パラメータ・変数・目的関数・制約の宣言。拠点数や品目数が変わっても書き換えない。
- データ(.dat、またはPythonのDataFrame):集合の中身とパラメータの値。
- ソルバー:
option solverで選ぶ外部プログラム。AMPLは問題を「.nl」形式のファイルにしてソルバーへ渡し、解を受け取る(.nl形式の公式解説)。
別のデータや別のソルバーで解き直す作業が、どちらも1行の変更で済みます。
開発の経緯:ベル研究所の3人による設計
AMPLはベル研究所のRobert Fourer、David Gay、Brian Kernighanが開発しました(AMPL公式の沿革)。KernighanはC言語の解説書『プログラミング言語C』の共著者です。言語の設計は1990年に論文「A Modeling Language for Mathematical Programming」(Management Science 36巻、519〜554ページ)で発表され、書籍『AMPL: A Modeling Language for Mathematical Programming』の第2版が2003年に出ています。この書籍は2012年から無料で公開されており、文法の一次資料として今も使えます。現在の開発・販売元はAMPL Optimization社で、日本ではMOAI Labが国内総販売代理店として販売とサポートを受け持っています。
無料で使える範囲:デモライセンス・Community Edition・有償版
「AMPLは無料か」への答えは、どのライセンスで動かすかで変わります。pipで入れた直後は、モジュールに同梱されたデモライセンスで動いています。手元で option version; を実行すると「Demo license with maintenance expiring 20270131.」と表示されました。
| ライセンス | 費用 | サイズ上限 | 使える用途 |
|---|---|---|---|
| デモ(pip版に同梱) | 無料・登録不要 | 線形2,000/非線形300 | 試用 |
| Community Edition | 無料・期限なし | OSSソルバーで上限なし | 学習・非商用・商用の試作 |
| AMPL for Academics | 無料・期間制限なし | 上限なし | 学生・教員・研究 |
| 有償(Development等) | 月300ドル相当〜 | 上限なし | 商用の開発・本番運用 |
デモライセンスの上限:線形で変数2,000、非線形で300
変数と制約の数を増やしながらHiGHSで解いたところ、変数1,500・制約1,500は解け、変数2,000・制約2,000で次のエラーになりました。数え方は「presolve後」で、制約と目的関数を合算します。変数2,000ちょうどでも、制約2,000と目的関数1本の合計が2,001になるため止まります。
Sorry, a demo license for AMPL is limited to 2000 variables
and 2000 constraints and objectives (after presolve) for linear
problems. You have 2000 variables, 2000 constraints, and 1 objective.
Activate a free Community Edition license (https://ampl.com/ce)
to remove size limits.
非線形の問題をIpopt(coinモジュール)で解くと、上限は「300 variables and 300 constraints and objectives」でした。教科書の例題ならデモのままで足りますが、実データを流し込むと非線形はすぐに300を超えます。
Community Editionの条件:無料・期限なし・本番運用は不可
Community Editionの公式ページによれば、ライセンス料も支払い情報も不要で、有効期限もありません。HiGHS・CBC・Couenne・Ipopt・Bonminなどのオープンソースソルバーを、変数や制約の数の制限なしで使えます。Gurobi・CPLEX・Xpressなどの商用ソルバーは、それぞれ30日間の試用ができます。取得したライセンスは python -m amplpy.modules activate <license-uuid> で有効化します。
注意したいのは用途の条件です。公式FAQは用途を「non-academic educational use, personal and non-commercial projects, and commercial prototyping」とし、「It is not intended for production deployment or ongoing operational use that generates business value」と明記しています。利用規約(EULA)にも「no commercial advantages can be realized from the AMPL Community Edition license」とあります。社内の配送計画やシフト作成をCommunity Editionのまま毎日回す使い方は、試作の範囲を超えます。EULAは、商用の試作を行えるのは本人の個人アカウント(ボットのアカウントは不可)に限るとし、既存の商用システムの結果を検証する用途にも使えないと定めています。
また、Community Editionはクラウドライセンスで、認証のリースは5分ごとに自動更新されます(公式FAQ)。インターネットに出られない閉域網のサーバーでは動きません。
有償版の料金と試用
公式の料金ページでは、DevelopmentプランのAMPL本体が年払いで月300ドル相当から、ソルバーは月105ドル相当から(MOSEK)と掲載されています。CPLEXとKnitroは月400ドル相当から、Gurobiは個別見積です。商用ソルバーは本体とは別のライセンスで、Community Editionに商用ソルバーだけを買い足すことはできません。購入前には、AMPLと商用ソルバー、技術サポートを含む30日間の無料試用があります。日本国内からの購入・見積の窓口はMOAI Labです。
AMPLとソルバーのインストール:pipによる導入手順
AMPL本体とソルバーは、Pythonのパッケージとして配布されています(公式のモジュール解説)。Pythonを使わない場合も、この方法で入れるのが手軽です。
python -m pip install amplpy
python -m amplpy.modules install highs cbc # AMPL本体(base)も一緒に入る
python -m amplpy.modules activate <license-uuid> # Community Editionを使う場合
python -m amplpy.modules list # 入ったモジュールの確認
2026年10月27日に入れた版は、AMPL本体(ampl-module-base)が20260809、HiGHSが20260813(HiGHS 1.15.1)、CBCが20251121(CBC 2.10.12)でした。AMPL本体の20260809は公式の変更履歴でも最新版として掲載されています。python -m amplpy.modules available を実行すると、gurobi・cplex・xpress・knitro・scipを含む32種類のモジュールが一覧に出ます。IpoptやBonmin、CouenneはCOIN-ORのソルバーをまとめた coin モジュールに入っています。
つまずきやすい2点:uvの仮想環境とコマンドラインのPATH
uvで作った仮想環境にpipがない場合、amplpy.modulesによるモジュール導入は失敗します。amplpy.modules install は内部で python -m pip install -i https://pypi.ampl.com ... を呼びます。uv venv は既定でpipを入れないため、「No module named pip」で失敗しました。先に uv pip install pip を実行するか、uv venv --seed で環境を作ると通ります。
コマンドラインの ampl は、そのままではソルバーを見つけられません。モジュールの bin にある ampl を直接起動すると、solve で「Cannot find “highs”」になりました。python -m amplpy.modules path が出力するディレクトリをPATHに足してから起動します。
export PATH="$(python -m amplpy.modules path):$PATH"
ampl transp.run
開発環境:AMPL IDEは2027年1月1日に廃止
従来のAMPL IDEは2027年1月1日に廃止され、公式はVS CodeのAMPL拡張かamplpyへの移行を案内しています(公式の移行案内)。VS Code拡張は構文の色分け、モデル内の移動、ソルバー出力の表示に対応しています。JupyterやGoogle Colabでは、amplpyの ampl_notebook() にモジュール名とライセンスUUIDを渡して環境を用意します。Community Editionのページでは、モデルの記述やデバッグを手伝うAIツールとして、ChatGPT上のamplbot、AMPLのClaude Skill、AMPL MCPサーバーも案内されています。
輸送問題を解く:.mod・.dat・.runの書き方
東京と大阪の2拠点から、仙台・名古屋・福岡の3都市へ製品を運ぶ問題を例にします。供給量の範囲で需要を満たし、輸送費の合計を最小にする配送量を求めます。
モデルファイル(transp.mod):輸送量・目的関数・制約の定義
set ORIG; # 出荷元
set DEST; # 届け先
param supply {ORIG} >= 0; # 供給量
param demand {DEST} >= 0; # 需要量
param cost {ORIG, DEST} >= 0; # 1単位あたりの輸送費
var Trans {ORIG, DEST} >= 0; # 決定変数:輸送量
minimize Total_Cost:
sum {i in ORIG, j in DEST} cost[i,j] * Trans[i,j];
subject to Supply {i in ORIG}:
sum {j in DEST} Trans[i,j] <= supply[i];
subject to Demand {j in DEST}:
sum {i in ORIG} Trans[i,j] >= demand[j];
set で添字の集合、param で値を受け取る箱、var で決定変数を宣言します。{i in ORIG, j in DEST} が数式のΣの添字にあたり、拠点が100に増えてもこのファイルは変わりません。
データファイル(transp.dat):供給量・需要量・輸送費の設定
set ORIG := Tokyo Osaka;
set DEST := Sendai Nagoya Fukuoka;
param supply := Tokyo 300 Osaka 250;
param demand := Sendai 150 Nagoya 200 Fukuoka 180;
param cost: Sendai Nagoya Fukuoka :=
Tokyo 4 5 9
Osaka 7 3 4 ;
2次元のパラメータは、1行目に列の添字、各行の先頭に行の添字を置く表の形で書けます。
実行と結果の読み方:双対値・被約費用・スラック
次のコードをtransp.runとして保存し、transp.mod・transp.datと同じディレクトリで ampl transp.run を実行します。
model transp.mod;
data transp.dat;
option solver highs;
solve;
display Trans, Trans.rc;
display Demand.dual, Supply.slack;
実行すると、HiGHS 1.15.1が4回の単体法反復で最適解(総輸送費2,180)を返しました。
HiGHS 1.15.1: optimal solution; objective 2180
: Trans Trans.rc :=
Osaka Fukuoka 180 0
Osaka Nagoya 70 0
Osaka Sendai 0 5
Tokyo Fukuoka 0 3
Tokyo Nagoya 130 0
Tokyo Sendai 150 0
;
: Demand.dual Supply.slack :=
Fukuoka 6 .
Nagoya 5 .
Osaka . 0
Sendai 4 .
Tokyo . 20
;
変数や制約の後ろに付ける .rc・.dual・.slack はサフィックスと呼ばれ、解の値以外の情報を取り出します。
- Trans.rc(被約費用):大阪→仙台の5は、このルートを1単位使うと総費用が5増えることを表す。0でない経路は使われていない。
- Demand.dual(双対値):福岡の6は、この例で他の条件を固定して需要を180から181に増やすと、最小総費用が6増えることを表す。需要を大きく変える場合は、同じ増分が続くとは限らない。値上げ交渉や追加受注の損益判断に使える数字。
- Supply.slack(スラック):東京の20は供給能力の余り。大阪は0で、供給がボトルネックになっている。
スクリプトでシナリオを回す:forとsolve_result
.runファイルにはループと条件分岐も書けます。次のコードをtransp.runの末尾に足すと、福岡の需要を10ずつ増やして解き直し、解けなかったときは状態を表示します。
option solver_msg 0;
for {k in 0..3} {
let demand['Fukuoka'] := 180 + 10*k;
solve;
if solve_result = 'solved' then
printf "Fukuoka=%d Total_Cost=%g\n", demand['Fukuoka'], Total_Cost;
else
printf "Fukuoka=%d %s (%d)\n", demand['Fukuoka'], solve_result, solve_result_num;
}
Fukuoka=180 Total_Cost=2180
Fukuoka=190 Total_Cost=2240
Fukuoka=200 Total_Cost=2300
Fukuoka=210 infeasible (200)
需要を10増やすと総費用は60増え、さきほどの双対値6と一致します。需要210では需要の合計が560になり、供給の合計550を超えるため実行不能(infeasible)になりました。solve_result_num の値は範囲で意味が決まっていて、0〜99がsolved、200〜299がinfeasible、300〜399がunbounded、400〜499が反復回数などの上限による停止、500〜999が解を返さない失敗です(AMPL MPの解説)。
ソルバーの選び方とオプションの渡し方
ソルバーは option solver の値を変えるだけで切り替わり、モデルは書き換えません。公式のソルバー一覧には20種類以上が載っています。問題の種類で選ぶと次のとおりです。
| 問題の種類 | オープンソース | 商用 |
|---|---|---|
| 線形(LP)・混合整数(MIP) | HiGHS / CBC / SCIP | Gurobi / CPLEX / Xpress / COPT |
| 凸二次・円錐 | HiGHS(凸二次) | MOSEK / Gurobi |
| 連続の非線形 | Ipopt | Knitro / CONOPT / SNOPT |
| 非線形の整数・大域最適 | Bonmin(凸MINLP) / Couenne(大域最適化) | BARON / LINDO Global |
無料で始めるならLP・MIPはHiGHSが第一候補です。CPLEXはIBMの商用ソルバーで、大規模なLP・MIPを高速に解く用途で使われます。CPLEXやGurobiへ移るときは option solver cplex; や option solver gurobi; に変えるだけですが、そのソルバーのモジュールとライセンスが要ります。モジュールを入れずに solver="gurobi" を指定すると「Cannot find “gurobi”」となり、solve_result は failure(999)でした。Gurobi単体の導入とライセンスはGurobiの解説で扱っています。
ソルバー固有の設定は option highs_options 'time_limit=60 outlev=1'; のように、ソルバー名に _options を付けたオプションへ空白区切りで渡します。ここで1つ注意があります。存在しないキーを渡すと、警告で済まず求解そのものが行われません。HiGHSに sensitivity=1 を渡したところ「Unknown option or invalid key “sensitivity”」と出て、目的関数は0のままでした。HiGHS 1.15.1のAMPLドライバには感度分析の範囲(.down・.up)を返すオプションが無いため、範囲が必要なら highs -= のようにソルバーのオプション一覧を出して、目的の機能があるソルバーを選びます。
PythonからAMPLを使う:amplpyの実行例
amplpyを使うと、Pythonの中でモデルを読み込み、データを渡して解き、結果をpandasのDataFrameで受け取れます。上のtransp.modをそのまま使い、データだけPythonから渡す例です。結果のDataFrame変換にはpandasが必要なので、実行前に python -m pip install pandas で追加してください。
from amplpy import AMPL
ampl = AMPL()
ampl.read("transp.mod") # モデルはファイルのまま再利用できる
ampl.set["ORIG"] = ["Tokyo", "Osaka"]
ampl.set["DEST"] = ["Sendai", "Nagoya", "Fukuoka"]
ampl.param["supply"] = {"Tokyo": 300, "Osaka": 250}
ampl.param["demand"] = {"Sendai": 150, "Nagoya": 200, "Fukuoka": 180}
ampl.param["cost"] = {
("Tokyo", "Sendai"): 4, ("Tokyo", "Nagoya"): 5, ("Tokyo", "Fukuoka"): 9,
("Osaka", "Sendai"): 7, ("Osaka", "Nagoya"): 3, ("Osaka", "Fukuoka"): 4,
}
ampl.solve(solver="highs", verbose=False)
if ampl.solve_result != "solved": # 例外が出なくても求解成功とは限らない
raise RuntimeError(f"solve_result={ampl.solve_result}")
print(ampl.get_objective("Total_Cost").value())
df = ampl.get_variable("Trans").to_pandas()
print(df[df["Trans.val"] > 0])
2180.0
Trans.val
index0 index1
Osaka Fukuoka 180
Nagoya 70
Tokyo Nagoya 130
Sendai 150
コマンドラインと同じ2,180が出ます。コストの表がCSVやデータベースにあるなら、ORIGとDESTを索引にしたDataFrameを ampl.set_data(df) で渡せます(同じ結果2,180を確認済み)。需要予測モデルの出力を param に流し込めば、予測と最適化を1本のPythonスクリプトにまとめられます。予測側の作り方はAI予測分析・需要予測の開発支援で扱っています。
solve()後の状態確認と例外処理
このコードで solve_result を確かめているのには理由があります。デモライセンスの上限を超える問題を ampl.solve() で解かせると、エラーメッセージは表示されるものの例外は発生せず、solve_result が「?」、solve_result_num が-1のまま処理が先へ進みました。ソルバーが見つからない場合も同様に例外は出ず、failure(999)が返るだけです。チェックを省くと、解けていない変数の値(0や前回の解)をそのまま後続の処理に渡してしまいます。一方、同じモデルを ampl.eval("solve;") で解かせると AMPLException が発生しました。バッチ処理に組み込むなら、solve() の後の solve_result チェックを必ず入れます。
他のモデリング言語との比較と、AMPLを選ばない場面
最適化のモデルを書く手段はAMPLだけではありません。2026年10月時点の主な選択肢です。ツール全体の比較はORツールの比較記事にまとめています。
| ツール | 版(2026年10月) | ライセンス | 書く言語 |
|---|---|---|---|
| AMPL | 20260809 | 商用(CEは無料) | 独自言語+Python等 |
| GAMS | – | 商用 | 独自言語 |
| Pyomo | 6.10.1 | BSD-3-Clause | Python |
| PuLP | 4.2.0 | MIT | Python |
| JuMP | 1.32.1 | OSS | Julia |
| OR-Tools | 9.15 | Apache 2.0 | Python・C++・Java等 |
AMPLが向くのは、次の条件がそろう場合です。
- 同じモデルをGurobi・CPLEX・Knitroなど複数の商用ソルバーで比べたい。
- 非線形を含むモデルを書く。AMPLは微分を自動で計算してIpoptやKnitroへ渡すので、勾配を手で書かずに済む。
- モデルを数学の記法に近い形で残し、Pythonを書かない分析担当者にも読ませたい。
反対に、無償のまま本番システムに組み込むなら、AMPLは選びません。Community Editionは本番運用が認められていないためです。HiGHSやCBCで足りる規模なら、PyomoかPuLPで書けばライセンス費用はかかりません。PuLPの使い方はPuLPの解説、配送ルートやスケジューリングのような組合せ最適化はOR-Toolsの解説が近い題材です。数十変数の連続最適化なら、SciPyが導入済みの環境ではscipy.optimizeで解けます。研究用途でJuliaを使っているならJuMPが自然な選択で、JuliaそのものはJulia言語の解説で紹介しています。
よくある質問
AMPLとは何の略ですか?
A Mathematical Programming Language の略で、数理計画法(数理最適化)の問題を書くための言語です。解を計算するのは外部のソルバーで、AMPLはモデルの記述とソルバーへの受け渡しを担います。
AMPLは無料で使えますか?商用利用はできますか?
pipで入れた直後のデモライセンスは無料で、線形の問題なら変数2,000・制約と目的関数の合計2,000まで解けます。無料のCommunity Editionを有効化すると、HiGHSやCBCなどのオープンソースソルバーでサイズ制限がなくなります。ただしCommunity Editionで認められる商用利用は試作までで、本番運用や事業上の利益を生む継続利用には有償ライセンスが必要です。
AMPLでCPLEXやGurobiは使えますか?
使えます。python -m amplpy.modules install gurobi などでソルバーのモジュールを入れ、option solver gurobi; と指定します。商用ソルバーにはそれぞれのライセンスが必要で、Community Editionからは各30日間の試用ができます。モデルを書き換える必要はありません。
PythonからAMPLを使うにはどうすればよいですか?
python -m pip install amplpy pandas でamplpyと結果の受け取りに使うpandasを入れ、python -m amplpy.modules install highs でAMPL本体とHiGHSを入れます。Pythonでは AMPL() でインスタンスを作り、read() または eval() でモデルを渡して solve(solver="highs") で解きます。amplpy 0.18.0はPython 3.8〜3.14に対応しています。
AMPL IDEは今も使えますか?
AMPL IDEは2027年1月1日に廃止されます。公式は、VS CodeのAMPL拡張か、amplpyを使ったPythonやJupyterでの開発へ移ることを案内しています。これから始めるならVS Code拡張を選びます。