LINGO是Linear Interactive and General Optimizer的缩写,即“交互式的线性和通用优化求解器”,由美国LINDO系统公司(Lindo System Inc.)推出的,可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等。
下面介绍一下我从网上总结学习到的一些lingo知识:
内置函数:
- @bin(x):限制x只能为0或1,通常在0-1规划中使用
- @gin(x):限制x只能为整数
- @free(x):在lingo软件中,x默认为负数,使用@free(x)可以取消x非负数的限制。
- @abs(x):取x的绝对值
- @exp(x):返回e^x的值
- @sin(x),@cos(x),@tan(x):返回对应三角函数的值
下面通过几个例题来实际介绍一下这些内置函数
第一题:
在lingo软件中,默认变量的值是大于等于零的,所以第四个约束条件可以省略不写,代码如下:
MODEL:
MAX =4*X1+3*X2;
2*X1+X2<=10;
X1+X2<=8;
X2<=7;
END
运行结果如下:
即X1=2,X2=6的时候,取得目标函数的最大值。
第二题:要求X1,X2均为整数:
在整数的要求下,可以使用@gin(x)这个函数,它要求变量X必须是整数。
MODEL:
MAX=40*X1+90*X2;
9*X1+7*X2<=56;
7*X1+20*X2<=70;
@gin(X1);@gin(X2);
END
运行截图:
第三题:0-1规划问题:要求变量只能是0或1。
Lingo软件提供了@bin(x)这个函数,它规定了变量只能是0或者1这两个量。
MODEL:
MAX=X1*X1+0.4*X2+0.8*X3+1.5*X4;
3*X1+2*X2+6*X3+10*X4<=10;
@BIN(X1);@BIN(X2);@BIN(X3);@BIN(X4);
END
第四题:非线性规划问题:
在lingo软件中,提供了绝对值函数@abs,可以直接使用来表示目标函数。
代码如下:
MODEL:
MIN=@ABS(X1)+2*@ABS(X2)+3*@ABS(X3)+4*@ABS(X4);
X1-X2-X3+X4=0;
X1-X2+X3-3*X4=1;
X1-X2-2*X3+3*X4=-0.5;
END
运行截图如下:
LINGO一个重要特质就是集合(SETS):分为原始集和派生集:
具体的格式为:
原始集名/1.2.3...n/:属性1,属性2,属性3;
派生集名(原始集名1,原始集名2):属性1,属性2;
其中集合操作函数有:@SUM,@FOR,@PROD等等。
利用lingo解决指派问题:已经知道下列工人完成指定的工作时间如下表:
MODEL:
SETS:
VAR/1..4/; !定义一个原始集;
LINK(VAR,VAR):C,X; !定义一个4*4的派生集,即为指派数组;
ENDSETS
DATA:
C=15 18 21 24
19 23 22 18
26 17 16 19
19 21 23 17;
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
运行截图如下所示:
即:甲——B,乙——A,丁——C,丙——D.
用LINGO解决0-1背包问题:
给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个,规定重量不能超过8,价值和重量如下:
v[]={2,1,4,3,5};
w[]={1,4,2,3,5};
代码如下:
MODEL:
SETS:
JIHE/1..5/:VALUE,WEIGHT,CHOOSE;
ENDSETS
DATA:
VALUE=2,1,4,3,5;
WEIGHT=1,4,2,3,5;
ENDDATA
MAX=@SUM(JIHE:VALUE*CHOOSE);
@SUM(JIHE:WEIGHT*CHOOSE)<=11;
@FOR(JIHE:@BIN(CHOOSE));
END
运行截图如下:
表示选择1,3,4,5的时候,总价值最大。