AMPL(A Mathematical Programming Language)は、大規模な数理計算(大規模最適化やスケジューリング型問題など)における複雑な問題を記述および解決するための代数モデリング言語です。[ 1 ]これは、ベル研究所のロバート・フォーラー、デビッド・ゲイ、ブライアン・カーニハン によって開発されました。AMPLは、CBC、CPLEX、FortMP、MOSEK、MINOS、IPOPT、SNOPT、KNITRO 、LGOなど、オープンソースおよび商用ソフトウェアの両方を含む数十のソルバーをサポートしています。問題はnlファイルとしてソルバーに渡されます。AMPLは、100を超える企業顧客、政府機関、学術機関で使用されています。[ 2 ]
AMPLの利点の1つは、その構文が最適化問題の数学的表記法と類似していることです。これにより、最適化領域の問題が非常に簡潔かつ読みやすく定義されます。NEOSサーバー(以前はアルゴンヌ国立研究所でホストされていましたが、現在はウィスコンシン大学マディソン校でホストされています[ 3 ])で利用可能な多くの最新のソルバーは、AMPL入力を受け入れます。NEOSの統計によると、AMPLは数理計画問題を表現するための最も人気のある形式です。
AMPLは、宣言型プログラミングと命令型プログラミングの両方のスタイルを併せ持っています。最適化モデルの定式化は、集合、スカラーおよび多次元パラメータ、決定変数、目的関数、制約条件といった宣言型言語要素を用いて行われ、これにより数理最適化の分野におけるほとんどの問題を簡潔に記述することが可能になります。
AMPLでは、以下の手順と制御フロー文が利用可能です。
大規模最適化問題の再利用を支援し、構築を簡素化するために、AMPLはモデルとデータの分離を可能にしている。
AMPLは、以下のような幅広い問題タイプをサポートしています。
AMPLはソルバーを別のプロセスで起動しますが、これには次のような利点があります。
ソルバーとのやり取りは、明確に定義されたnlインターフェースを介して行われます。
AMPL は、 Linux、macOS、Solaris、AIX、Windowsなど、多くの一般的な 32 ビットおよび 64 ビットのオペレーティングシステムで利用可能です。[ 5 ] トランスレータは、AMPL Optimization LLC が保守している独自のソフトウェアです。ただし、AMPL を使用した無料のモデリングおよび解決機能を提供するオンライン サービスがいくつかあります。[ 6 ] [ 7 ]機能が制限された無料の学生版と、学術コース向けの無料のフル機能版も利用可能です。[ 8 ]
AMPLは、汎用プログラミング言語との統合を可能にするオープンソースAPIも提供しています。公式APIはPython、R、C++、C#、MATLAB、Javaで利用可能で、ユーザーはプログラムでモデルを生成、更新、解決できます。[ 9 ]
AMPLは、Microsoft ExcelのSolverStudioアドインを介してExcel内から使用できます。
nlファイルの読み込みと自動微分を可能にするAMPLソルバーライブラリ(ASL)はオープンソースです。多くのソルバーでAMPL接続を実装するために使用されています。
AMPL/MPは、線形、混合整数、制約プログラミングソルバーを構築するための別のオープンソースライブラリを提供し、自動微分を必要としないものについてはASLに取って代わります。[ 10 ]
この表は、AMPLの歴史における重要なステップを示しています。
ジョージ・ダンツィヒの輸送問題が、AMPLモデルのサンプルとして使用されます。この問題は、市場の需要を満たし、工場に供給する最小コストの輸送スケジュールを見つけます。[ 17 ]
植物を設定;市場を設定;# プラント p の容量(ケース別)param Capacity { p in Plants };# ケースにおける市場 m での需要param Demand { m in Markets };# 距離(千マイル単位)パラメータDistance { Plants , Markets };# 1ケースあたり1,000マイルあたりの運賃(ドル)param Freight ;# ケースごとの輸送コスト(千ドル単位)param TransportCost { p in Plants , m in Markets } : = Freight * Distance [ p , m ] / 1000 ;# 出荷数量(ケース単位)var shipment { Plants , Markets } >= 0 ;# 輸送コスト合計(千ドル単位)を最小化する:sum { p in Plants , m in Markets } TransportCost [ p , m ] * shipping [ p , m ];# プラント p での供給制限を監視s.t. supply { p in Plants }: sum { m in Markets } shipment [ p , m ] <= Capacity [ p ];# 市場 m の需要を満たすために、需要{ m in Markets }: sum { p in Plants } shipment [ p , m ] >= Demand [ m ] とする。データ;set Plants : = seattle san - diego ; set Markets : = new - york chicago topeka ;param容量: =シアトル350サンディエゴ600 ;param Demand : =ニューヨーク325シカゴ300トピカ275 ;パラメータ距離:ニューヨークシカゴトピカ: =シアトル2.5 1.7 1.8サンディエゴ2.5 1.8 1.4 ;param Freight : = 90 ;