lingo模型有4个段
目标与约束段: model: end
集合段: sets: endsets
数据段: data: enddata
初始段: init: endinit
1、举个简单的例子
求z的最大值
z = 2x + 3y
x + y = 5
x >= 2
x,y为整数
model:
max = 2*x + 3*y; !求最大值;
x + y = 5;
x >= 2;
@gin(x); !@gin()表示x取整;
@gin(y);
end
运行后得到的结果为 x=2,y=3。
2、多变量示例处理
求z的最大值
z = 2*x1 + 3*x2 + 4*x3 + 5*x4 + 6*x5
x1 + 2*x2 + 3*x3 + 4*x4 + 5*x5 <= 10
x1 + x2 + x3 <= 2
x4 + x5 >= 1
xi = 0或1
法一:根据条件直接写出
model:
max = 2*x1 + 3*x2 + 4*x3 + 5*x4 + 6*x5;
x1 + 2*x2 + 3*x3 + 4*x4 + 5*x5 <= 10;
x1 + x2 + x3 <= 2;
x4 + x5 >= 1;
@bin(x1); !令x1=0 或 1;
@bin(x2);
@bin(x3);
@bin(x4);
@bin(x5);
end
运行结果:
这种方法显而易见,但是当变量和条件很多的时候,我们不可能一一列取
法二:法一的小优化,当变量多,条件不多的时候我们可以这样写
model:
sets:
var1/1..5/:x,b,c;
endsets
data:
c = 2 3 4 5 6;
b = 1 2 3 4 5;
enddata
max = @sum(var1(i):x(i)*c(i));
@sum(var1(i):x(i)*b(i)) <= 10;
@sum(var1(i)|i#le#3:x(i)) <= 2; ! le表示小于等于,lt表示小于;
@sum(var1(i)|i#gt#3:x(i)) >= 1; ! ge表示大于等于,gt表示大于;
@for(var1(i):@bin(x));
end
运行结果:
如果要表示 x2 + x3 <= 1:
@sum(var1(i)|i#ge#2#and#i#le#3:x(i)) <= 1;
法三:当变量和条件很多的时候,我们就可以利用@sum()和@for()函数很好的进行处理
model:
sets:
var1/1..5/:x,c;
var2/1..3/:b;
link(var2,var1):a;
endsets
data:
c = 2 3 4 5 6;
b = 10 2 1;
a = 1 2 3 4 5
1 1 1 0 0
0 0 0 -1 -1;
enddata
max = @sum(var1(i):x(i)*c(i));
@for(var2(i):@sum(var1(j):x(j)*a(i,j))<=b(i));
@for(var1(i):@bin(x(i))); !也可以把(i)去掉,表示遍历全部变量;
end
运行结果:
3、@if()函数应用
@if(A,B,C)
条件A成立时,值为B,否则为C。
设:F=5(0<x<=6),F=8(x>6)
F = @if(x#gt#0#and#x#le#6,5,8);
当有多个分段时
设:F=5(0<x<=6),F=8(6<x<=9),F=10(9<x)
F = @if(x#gt#0#and#x#le#6,5,@if(x#gt#6#and#x#le#9,8,10));
如有错误请指出。