Lingo

如何用 Lingo 处理规划问题。

Lingo 可以高效处理各种线性规划、非线性规划问题,是求解优化模型的最佳选择。
特色在于:提供大量内置函数,可以自由决定决策变量的类型,灵活、执行速度快。

开始前,找到:目标函数决策变量约束条件

小朋友用法

1
2
3
4
5
!那么 Lingo 的代码就长这样, 浅白易懂;
max = 72*x1 + 64*x2;
x1 + x2 < 50;
12*x1 + 8*x2 < 480;
3*x1 < 100;
1
2
3
4
5
6
!运行结果
Objective value: 3360.000

Variable Value Reduced Cost
X1 20.00000 0.000000
X2 30.00000 0.000000

正经大学生用法

集合

大概和数组是一个概念吧,定义方式如下:
(第4行表示衍生二维数组)

1
2
3
4
5
sets:
集合(类)名称/成员列表/:集合(成员)1,集合(成员)2,...;
...(其他集合);
集合(二维)名称(集合名称1,集合名称2):集合(成员)1,集合(成员)2,...;
endset

数据赋值

1
2
3
data:
中间放变量,按行序赋初值。
enddata

集循环函数

1
2
3
@for:该函数用来产生对集成员的约束。
@sum:该函数返回遍历指定的集成员的一个表达式的和。
@min 和@max:返回指定的集成员的一个表达式的最小值或最大值。

数学函数

1
2
3
4
5
6
7
8
9
10
11
@abs(x)返回 x 的绝对值。
@sin(x)返回 x 的正弦值,x 采用弧度制。
@cos(x)返回 x 的余弦值。
@tan(x)返回 x 的正切值。
@exp(x)返回常数 e 的 x 次方。
@log(x)返回 x 的自然对数。
@mod(x,y)返回 x 除以 y 的余数。
@sign(x)如果 x>=0 时返回 1,当 x=0 时返回 0。
@floor(x)返回 x 的整数部分。当 x>=0 时,返回不超过 x 的最大整数;当 x<0 时,返回不低于 x 的最大整数。
@smax(x1,x2,…,xn)返回 x1,x2,…,xn 中的最大值。
@smin(x1,x2,…,xn)返回 x1,x2,…,xn 中的最小值。

变量界定函数

在 Lingo 中变量默认是大于0的实数,这时候就需要变量界定函数来决定其他变量类型。

1
2
3
4
@free(x)             x取任意实数
@gin(x) x取整数
@bin(x) x取0或1
@bnd(L,x,R) L<x<R

实战

1
2
3
4
5
6
7
8
9
10
11
12
13
model:

sets:
var/1..100/:x;
endsets

min = @sqrt(@sum(var(i):x(i)^2));

@sum(var(i):x(i))=1;
x(100)=@sum(var(i)|i#le#99:x(i)^2);
@for(var(i)|i#le#99:@free(x(i)));

end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
model:

sets:
var/1..5/;
link(var,var):c,x;
endsets

data:
c = 3 8 2 10 3
8 7 2 9 7
6 4 2 7 5
8 4 2 3 5
9 10 6 9 10;
enddata

min = @sum(link:c*x);

@for(var(i):@sum(var(j):x(i,j))=1);
@for(var(j):@sum(var(i):x(i,j))=1);
@for(link:@bin(x));

end