lingo学习笔记1

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));

如有错误请指出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值