這篇文章是系列的第一篇,主要介紹 AMPL 模組化語言的基本使用方法。MindOpt 支援在 Windows/Linux/OSX 系統中,通過 AMPL 建立線性規劃模型,并調用 MindOpt 來求解。
一、AMPL基本資訊
AMPL全稱為A Mathematical Programming Language,是一種描述并求解大規模複雜數學問題的代數模組化語言軟體。
AMPL解決數學規劃問題的流程如下:
- 準備模型檔案(.mod)與資料檔案(.dat)。
- 使用 AMPL 讀取模型與資料進行模組化。
- 選擇連結上的求解器(如 MindOpt)進行求解。
- 擷取求解結果。

二、AMPL基本文法
下面将介紹 AMPL 的一些基本使用方法,并以一個簡單的例子進行說明。
AMLP的一些基本文法規則
- 區分大小寫
- 以#開始的一行表示注釋
- 忽略空格
- 每個語句以分号 ";" 結尾
- :=表示指派,=表示表達式中的等号 ,==表示判斷
AMPL模型建立
AMPL用接近數學描述的語言把數學規劃問題寫成模型檔案,以".mod"為擴充名,如 “example.mod”,然後将其中的參數寫成資料檔案,以“.dat”為擴充名,如 “example.dat”。
AMPL中建立一個完整的優化模型主要包含以下項:
(1)集合(set):
集合是描述變量和限制的基礎,一般來說,優化表達式中的下标出自集合表示。集合可以在資料檔案中進行指派,對于比較簡單的集合的定義也可以直接在模型檔案中進行指派。
聲明集合的文法為:set [set name][set expression]
(2)參數(parameter):
參數是模型中需要被指派的系數,其指派一般在資料檔案中給出,對于比較簡單的參數,也可以在模型檔案中直接給出。标量、向量或矩陣都可以成為參數的表達式。
參數的文法為:param [name]{index1, index2,...}{attributes}
其中 [name]是必有的,{index1}...是可選的,用來說明參數資料的大小或範圍(可以使用集合來定義),{attributes}說明參數的屬性,如可能的取值等等。
(3)變量(variable):
變量是優化模型求解需要求出的量,即決策變量。變量的聲明與參數的聲明類似。
變量的文法為:var [name]{index1, index2,...}{attributes}
(4)目标函數(objective):
線性規劃的目标函數定義如下:
maximize [objective name]:sum{[index] in [index set]}[parameter]*[variable]+...
如果是最小化目标函數,将第maximize換成 minimize 即可。
(5)限制(constraint):
限制是優化問題需要滿足的限制條件。
一般的線性限制的文法為:
subject to [constraints name] {index in index set}:sum{[index] in [index set]}
[parameter]*[variable]+...+{<=,>=,=}[parameter]
優化模型示例
以 MindOpt (
https://solver.damo.alibaba-inc.com/doc/html/index.html) 中的
Diet問題為例,Diet問題的目标是以最低的價格來配置一滿足營養需求的食物組合,其 AMPL 模型(diet.mod)寫為:
set NUTR; #set 聲明集合
set FOOD;
param cost {FOOD} > 0; #param 聲明參數
param f_min {FOOD} >= 0;
param f_max {j in FOOD} >= f_min[j];
param n_min {NUTR} >= 0;
param n_max {i in NUTR} >= n_min[i];
param amt {NUTR,FOOD} >= 0;
var Buy {j in FOOD} >= f_min[j], <= f_max[j]; #var 表明變量
minimize Total_Cost: sum {j in FOOD} cost[j] * Buy[j]; #minimize表明最小目标函數
subject to Diet {i in NUTR}: # subject to 表明限制
n_min[i] <= sum {j in FOOD} amt[i,j] * Buy[j] <= n_max[i];
其對應的資料檔案(diet.dat)如下:
set NUTR := A B1 B2 C ;
set FOOD := BEEF CHK FISH HAM MCH MTL SPG TUR ;
param: cost f_min f_max :=
BEEF 3.19 0 100
CHK 2.59 0 100
FISH 2.29 0 100
HAM 2.89 0 100
MCH 1.89 0 100
MTL 1.99 0 100
SPG 1.99 0 100
TUR 2.49 0 100 ;
param: n_min n_max :=
A 700 10000
C 700 10000
B1 700 10000
B2 700 10000 ;
param amt (tr):
A C B1 B2 :=
BEEF 60 20 10 15
CHK 8 0 20 20
FISH 8 10 15 10
HAM 40 40 35 10
MCH 15 35 15 15
MTL 70 30 15 15
SPG 25 50 25 15
TUR 60 20 15 10 ;
三、運作AMPL
AMPL本身并不直接求解優化問題,它将模型轉換成專門的 .nl 檔案,其作用隻是類似語言編譯器。在讀入模型檔案和資料檔案後調用其他能夠求解各類數學規劃問題的求解器(optimization solver)進行求解。AMPL支援大部分的求解器,包括MindOpt。
運作AMPL之前需要準備兩個檔案:
- 模型檔案:用 AMPL 語言編寫問題的模型(model)檔案,模型檔案以".mod"為擴充名,例如我們在上一節中給出的示例。
- 資料檔案:優化模型中的集合和參數的具體取值可以放在模型檔案中,也可以放在單獨的資料檔案,這樣同一個抽象的優化模型可以适用不同的資料,資料檔案以".dat"為擴充名。
此外,也可以編寫一個包含按順序執行求解的 AMPL 指令的批處理檔案,以".run"為擴充名。
eample.run
如果沒有批處理檔案,也可以按照以下步驟在 AMPL 中以單個指令的方式輸入:
model example.mod; #調用模型檔案
data example.dat; #調用資料檔案
option solver mindopt; #選擇求解器
solve; #求解
四、支援的其他腳本語句
reset:清除已有的資料和模型
reset data:清除已有的資料
if...then...else:條件語句
and,or:邏輯與,邏輯或
let:指派給參數或變量
for,repeat,while,until,break:用于循環語句
更多的關于 AMPL 模組化工具的介紹請見:
https://ampl.com/resources/the-ampl-book/