如何用 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