注意事项
- 模型是以MODEL: 开始,END结尾,每句;结尾
- min=模型,max=模型,表示求函数最大最小值
- 不区分大小写
- 默认所有变量非负,解除用@free(x)
- 注释符号为:!
- 可以给每个语句加上标号;例如 [ 标 号 ] M A X = x 1 + x 2 [标号] MAX=x_1+x_2 [标号]MAX=x1+x2
基本运算符
算术运算符
逻辑运算符
关系运算符
常见数学函数
例
目 标 函 数 最 大 值 max z = 4 x 1 + 3 x 2 约 束 条 件 { 2 x 1 + x 2 ≤ 10 x 1 + x 2 ≤ 8 x 2 ≤ 7 x 1 , x 2 ≥ 0 目标函数最大值 \max z=4 x_{1}+3 x_{2} \\ 约束条件 \left\{\begin{array}{l} 2 x_{1}+x_{2} \leq 10 \\ x_{1}+x_{2} \leq 8 \\ x_{2} \leq 7 \\ x_{1}, x_{2} \geq 0 \end{array}\right. 目标函数最大值maxz=4x1+3x2约束条件⎩⎪⎪⎨⎪⎪⎧2x1+x2≤10x1+x2≤8x2≤7x1,x2≥0
model:
max=4*x1+3*x2;
2*x1+x2<10;
x1+x2<8;
x2<7;
end
整数规划@gin(x)
01规划@bin(x)
可取负数@free(x)
min z = ∣ x 1 ∣ − 2 ∣ x 2 ∣ − 3 ∣ x 3 ∣ + 4 ∣ x 4 ∣ { x 1 − x 2 − x 3 + x 4 = 0 x 1 − x 2 + x 3 − 3 x 4 = 1 x 1 − x 2 − 2 x 3 + 3 x 4 = − 1 2 \begin{array}{l} \min z=\left|x_{1}\right|-2\left|x_{2}\right|-3\left|x_{3}\right|+4\left|x_{4}\right| \\ \left\{\begin{array}{l} x_{1}-x_{2}-x_{3}+x_{4}=0 \\ x_{1}-x_{2}+x_{3}-3 x_{4}=1 \\ x_{1}-x_{2}-2 x_{3}+3 x_{4}=-\frac{1}{2} \end{array}\right. \end{array} minz=∣x1∣−2∣x2∣−3∣x3∣+4∣x4∣⎩⎨⎧x1−x2−x3+x4=0x1−x2+x3−3x4=1x1−x2−2x3+3x4=−21
model:
max=@abs(x1)-2*@abs(x2)-3*@abs(x3)+4*@abs(x4);
x1-x2-x3+x4=0;
x1-x2+x3-3*x4=1;
x1-x2-2*x3+3*x4=-1/2;
@free(x1 ); @free(x2);@free(x3); @free(x4);
end
集合和条件约束
S.t. { min = ∑ j = 1 3 ∑ i = 1 2 g i j × L i j ∑ i = 1 2 g i j = d j ( j = 1 , 2 , 3 ) ∑ j = 1 3 g i j = s i ( i = 1 , 2 ) \text { S.t. }\left\{\begin{array}{l} \min =\sum_{j=1}^{3} \sum_{i=1}^{2} g_{i j} \times L_{i j} \\ \sum_{i=1}^{2} g_{i j}=d_{j} \quad(j=1,2,3) \\ \sum_{j=1}^{3} g_{i j}=s_{i} \quad(i=1,2) \end{array}\right. S.t. ⎩⎪⎨⎪⎧min=∑j=13∑i=12gij×Lij∑i=12gij=dj(j=1,2,3)∑j=13gij=si(i=1,2)
model:
! 集合的本质就是拥有几个元素的集合,类型名自定义,变量名自定义
sets:
supply/1..2/:s; !表示supply类型的数据是一个有两个元素的向量,s就是supply类型的一个数据,supply类自定义,变量名称也是自定义
demand/1..3/:d; ! 和supply相同,不过是三个元素的
link(supply,demand):road,g; !组合元素类型名(行类型,列类型),link就是一个两行三列的二维数据组合,两个变量road和g
end sets
data:
road=10,5,6;
4,8,12;
d=50,70,40;
s=60,100;
end data
min=@sum(link(i,j):road(i,j)*g(i,j));
!@sum(类型名:数据表达式);类型名本质就是确定i,j等索引变量的范围,sum函数会依次取出范围中的数据进行数据表达式的运算。
@for(demand(j):@sum(supply(i):g(i,j))=d(j));
!和sum类似,demand(j)本质就是确定了j范围是1~3,一次遍历循环。
@for(supply(i):@sum(demand(j):g(i,j))=s(i));
end
min
Z
=
∑
i
=
1
n
∑
j
=
1
n
w
i
j
f
i
j
\min Z=\sum_{i=1}^{n} \sum_{j=1}^{n} w_{i j} f_{i j}
minZ=i=1∑nj=1∑nwijfij
s.t.
{
∑
j
=
1
n
f
1
j
=
1
∑
j
=
1
n
f
j
n
=
1
∑
j
=
1
n
f
j
i
=
∑
j
=
1
n
f
i
j
i
≠
1
,
n
\text { s.t. }\left\{\begin{array}{l} \sum_{j=1}^{n} f_{1 j}=1 \\ \sum_{j=1}^{n} f_{j n}=1 \\ \sum_{j=1}^{n} f_{j i}=\sum_{j=1}^{n} f_{i j} \quad i \neq 1, n \end{array}\right.
s.t. ⎩⎨⎧∑j=1nf1j=1∑j=1nfjn=1∑j=1nfji=∑j=1nfiji=1,n
model:
sets:
node/1..6/;
road(node,node)/1,2,1,3,2,4,2,5,3,4,3,5,4,6,5,6/:w,f;
end sets
data:
w=2,1,5,3,4,3,0,0;
end data
n=@size(node);
[obj]min=@sum(road(i,j):w(i,j)*f(i,j));
@for(node(i)|i#ne#1 #and# i#ne#n:@sum(road(j,i):f(j,i))=@sum(road(i,j):f(i,j)));
! 类型后添加 | 可以后加条件约束,只有满足条件约束的才运行后面的表达式,sum类似
@sum(road(i,j)|i#eq#1:f(i,j))=1;
@sum(road(j,i)|i#eq#n:f(j,i))=1;
end
从excel中读取数据
data
d=@ole("excel文件路径","区域名称");
end data
区域名称通过选中若干单元格按 C t r l + F 3 Ctrl+F3 Ctrl+F3命名即可读取。