Lingo(linear interactive and general optimiuzer)的基本含义是交互式的线性和离散化求解器,是主要用来求解优化问题的软件
最大特色:允许优化问题中的决策变量为整数,可求解整数规划,而且执行速度快
2.求解线性规划问题:例1:
解:
min=2*x1+3*x2;
x1+x2>=350;
x1>=100;
2*x1+x2<=600;
x2>=0;
例2:
解:切割模式共七种如下:
xi 代表第 i 种切割模式所需要的数量
min=x1+x2+x3+x4+x5+x6+x7;
4*x1+3*x2+2*x3+x4+x5>=50;
x2+2*x4+x5+3*x6>=20;
x3+x5+2*x7>=15;
@gin(x1);
@gin(x2);
@gin(x3);
@gin(x4);
@gin(x5);
@gin(x6);
@gin(x7);
3.Lingo中的集
集是一群相联系的对象,这些对象也称为集的成员
每个集成员可以有一个或多个与之有关联的属性
Lingo有两种类型的集:原始集和派生集
(1)定义原始集
sets:
setname(集名)/merber_list(集成员列表)/:attribute_list(成员属性列表);
endsets
集成员列表
有显式罗列和隐式罗列两种方式
- 显示罗列:将集成员一个一个写出,中间用逗号隔开,如:
sets:
niu/A,C,F/:x;
endsets - 隐式罗列:只需要写出第一个集成员和最后一个集成员,中间用省略号连接,如:
sets:
yang/1..8/:x,y;
endsets
(2)定义派生集
由其他集(父集)定义的集合称为派生集,如:
sets:
niu1/1..5/;
niu2/2,4,7/;
nn(niu1,niu2):x;
endsets
注:属性 x 类似于 x[ i ][ j ] ,其中 i ∈ [ 1 , 5 ] , j = { 2 , 4 , 7 }
若派生集成员由父集成员所有的组合构成,称该集为稠密集
若派生集的成员为父集成员所有组合构成的一个子集,这样的派生集称为稀疏集
稠密集
稠密集的定义方法:
setname(parent_set_list):attribute_list;
例:定义以下变量:a[ i ] , b[ j ] , c[ i ][ j ] , x[ i ][ j ] ,其中 i ∈ [ 1 , 9 ] , j ∈ [ 1 , 7 ]
sets:
nu1/1..9/:a;
nu2/1..7/:b;
nn(nu1,nu2):c,x;
endsets
稀疏集
稀疏集的定义方法:
setname(parent_set_list)/member_list/:attribute_list;
- 显示罗列:
sets:
niu1/1..5/;
niu2/2,4,7/;
nn(n1,n2)/1,2,4,2,5,7/:x;
endsets - 隐式罗列:(定义二维数组)
sets:
nu1/1..5/;
nu2/1..4/;
nn(nu1,nu2)|&1#gt#2#and#&2#lt#3:x
(3)数据部分
<1>对成员属性赋值
格式:
data:
object_list=value_list;
enddata
例:建立一个有4个成员的集合,其中成员由两个属性 t 和 w ,其值为 13 , 16 , 19 , 15 与 42 , 51 , 61 , 53
解:
sets:
red/a,b,c,d/:t,w;
endsets
data:
t=13,16,19,15;
w=42,51,61,53;
enddata
若指定属性为一个值,则赋值格式为:
data:
t,w=40,9;
enddata
若只需要给某几个数赋值,则用逗号表示不需要赋值的位置:
sets:
num/1..6/:x;
endsets
data:
x=40,9,,,,5;
enddata
<2>参数赋值
data:
p,q=0.85,?;
enddata
4.运算符
运算符优先级
优先级 | 运算符 |
最高 | #NOT# , -(负号) |
^ | |
* , / | |
+ , -(减法) | |
#EQ# , #NE# , #GT# , #GE# , #LT# , #LE# | |
#AND# , #OR# | |
最低 | < , <= , = , > , >= |
逻辑运算符
5.数学函数 6.其他常用函数
例:
解:
min=fx+gy;
fx=@if(x#gt#0,100,0)+2*x;
gy=@if(y#gt#0,60,0)+3*y;
x+y>=30;
7.集循环函数
@for,@sum,@max,@min