AMPL 入门
AMPL 入门
A Mathematical Programming Language
1. 软件安装
2. 基础教程
2.0 参考资料
[1] AMPL Tutorial, YouTube, 地址, 视频中的Sildes
[2] AMPL 建模语言 Tutorial, 知乎, 地址
2.1 基础逻辑结构
一个项目一般由3个文件组成
-
.mod文件:定义模型 -
.dat文件:设置参数数值 -
.run文件:执行命令
一般来说,在 .mod 文件中定义需要使用的变量,而在 .dat 文件中给变量赋值,实现模型与数值的逻辑分离
2.2 变量名的习惯
多单词之间用下划线(_)分割,除此之外:
-
set: 全大写字母 -
params: 全小写字母 -
var, 目标函数,subj to: 首单词大写
3. 关键内容
3.1 set 集合(索引)
3.1.1 set 定义与赋值
set 用于定义集合,一般用于变量(var)或参数(param)的索引。如线性规划中约束索引 \(i=1,2,\cdots,m\) 和决策变量索引 \(j=1,2,\cdots,m\)。
在 .mod 文件中使用 =
set INDEX1; # 只定义参数,而不赋值
set INDEX2 = 1..10;
set INDEX3 = 1..10 by 2;
set INDEX4 = start..end by interval;
在 .dat 文件中使用 :=
set INDEX1 := park basketball rec pool;
# 需要在 .mod 文件中定义 set INDEX1;
注意:
-
对于非数值
set只能在.dat赋值。 -
对于数值的
set(即数列)只能在.mod定义。只能.dat文件中定义数列的起始数字、终止数字、和间隔。一般用如下的形式,如:先在
.mod文件中:param start integer; param end > start integer; param interval > 0 integer; set YEARS = start .. end by interval;再在
.dat文件中:param start := 1990; param end := 2020; param interval := 5;
3.1.2. set 运算
A union B: union: in either A or BA inter B: intersection: in both A and BA diff B: difference: in A but not BA symdiff B: symmetric difference: in A or B but not both
3.2 param 参数
用于定义模型参数,非决策变量,如线性模型中的 \(a_{ij},b_j,c_i\)。
3.2.1 定义参数
- 在
.mod定义参数
param a1;
param b1 {INDEX1}; # 定义向量
param c2 {INDEX1, INDEX2}; # 定义矩阵
-
在
.mod定义参数,同时限制参数的取值范围。注意:这个不是约束,只是限制参数的取值范围,如果在
.dat文件中赋值时违背限制,则会报错。
param a2 >= 0, <= 10;
param a3 >0 integer;
param b2 {INDEX2} >= 1;
param b3 {i in INDEX1} >= b1[i];
-
也可以在定义参数的时候(在
.mod文件中),为参数赋值。注意:这种方法只能对单一变量赋值。
param a4 = 5;
3.2.2 赋值 Specifying Data
在 .dat 中为参数赋值
- 单变量赋值
param a1 := 3;
- 向量赋值
param b1 := park 1 basketball 2 rec 3 pool 4;
出于直观的考虑,或一般采用下面的格式,
param b1 :=
park 1
basketball 2
rec 3
pool 4;
- 多个向量(具有相同的索引)赋值:
# 注意不要漏掉 param 后的 :
param : b1, b3 :=
park 1 2
basketball 2 3
rec 3 4
pool 4 5;
矩阵或更高维度的张量赋值,参考 AMPL Book P146.
3.3 var 决策变量
在 .mod 文件中用 var 定义决策变量,决策变量不需要在 .dat 中赋值
var X1;
var Y1 {INDEX1};
- 决策变量约束
var X1 >= 0, <= 1;
var Y1 {INDEX1} >= 0;
var Y3 {j in INDEX1} >= Y1[j], <= Y2[j];
- 决策变量初始值
用 := 或 default 决策变量设置初始值
var X1 >= 0 := 2;
var Y1 {INDEX1} >= 1 default 3;
也可以在 .dat 文件为 var 设置初始值(类似 param 赋值)
# .dat 文件
var X1 := 2;
var Y1 {INDEX1} default 3;
- 整数决策变量和 0-1 决策变量
var Z1 integer;
var Z2 >= 0 integer;
var Z3 binary;
3.4 目标函数
使用 minimize,min,maximize,或 max 定义目标函数,如:
min Cost1: sum {i in INDEX1} c[i] * x[i];
# 或
min Cost2: sum {i in INDEX1, j in INDEX2} c[i,j] * x[i,j];
注意: Cost 为目标函数变量名,不可缺少
3.5 subj to 约束
使用 subj to 或 subject to 定义约束,如:
subj to Capacity:
sum {i in INDEX1} a[i] * x[i] <= 1, >= 10;
# 遍历
subj to Finance {j in INDEX2}:
sum {i in INDEX1} a[i,j] * x[i,j] >= y[j];
注意: Capacity 为约束名,不可缺少;对于循环,遍历的索引位置应在 : 前。
4. console 命令 (.run 文件)
注意: 所有的命令都要以英文分号(;)结尾表示结束
-
quit;: 终止程序,将重新加载 -
reset;: 当.mod和.dat文件改变,使用reset重新加载模型 -
model <filename>;: 指定.mod模型文件 -
data <filename>;: 指定.dat数据文件 -
option solver <solver-name>;: 指定求解器:如
option solver gurobi;或option solver cplex; -
solve;: 求解模型 -
display <var-name>;: 输出变量(var),参数(param),目标函数,或约束(subj to)的值
例子
reset;
model test.mod;
data test.dat;
option solver gurobi;
solve;
display x1, x2;

浙公网安备 33010602011771号