LINGO是Linear Interactive and General Optimizer的缩写,即“交互式的线性和通用优化求解器”,由美国LINDO系统公司(Lindo System Inc.)推出的,可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等,功能十分强大,是求解优化模型的最佳选择。
当你在win环境下打开LINGO系统时,会得到如下窗口
外层是主框架窗口,包含了所有菜单命令和工具条,其他所有窗口将被包含在主窗口之下。
在模型窗口中输入如下代码
min=2x1+3x2;
x1+x2>=350;
x1>=100;
2*x1+x2<=600;
然后点击工具条上的按钮就可以了
集
集是一群相联系的对象,这些对象也称为集的成员。一个集可能是一系列产品的特征,称为属性。
LINGO中有两种集:
原始集一些最基本的对象
派生集一个或多个其他集来定义的,也就是说,它的成员来自于其他已存在的集
模型的集部分
集部分是LINGO模型的一个可选部分。在LINGO模型使用集之前,都是以“sets”开始,“endsets”结束,一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中必须使用定义它们
定义原始集
先声明
集的名字
可选,集的成员
可选,集成员的属性
定义一个原始集,语法:
setname[ /member_list /] [:attribute_list]
隐式成员列表格式 | 实例 | 所产生集成员 |
---|---|---|
1…n | 1…5 | 1,2,3,4,5 |
StringM…StringN | Car2…Car14 | Car2,Car3,…,Car14 |
集成员不放在集定义中,而后在随后的数据部分来定义
sets:
students:sex,age;
endsets
data:
students,sex,age=John 1 16
Jill 0 14
endata
注意:开头用感叹号(!),末尾用分号(;)表示注释,可跨多行
LINGO具有9种逻辑运算符:
#not# 否定该操作数的逻辑值,#not#是一个一元运算符
#eq# 若两个运算数相等,则为true;否则为flase
#ne# 若两个运算符不相等,则为true;否则为flase
#gt# 若左边的运算符严格大于右边的运算符,则为true;否则为flase
#ge# 若左边的运算符大于或等于右边的运算符,则为true;否则为flase
#lt# 若左边的运算符严格小于右边的运算符,则为true;否则为flase
#le# 若左边的运算符小于或等于右边的运算符,则为true;否则为flase
#and# 仅当两个参数都为true时,结果为true;否则为flase
#or# 仅当两个参数都为false时,结果为false;否则为true
这些运算符的优先级由高到低为:高 #not#
#eq# #ne# #gt# #ge# #lt# #le#
低 #and# #or#
LINGO提供了大量的标准数学函数:
@abs(x) 返回x的绝对值
@sin(x) 返回x的正弦值,x采用弧度制
@cos(x) 返回x的余弦值
@tan(x) 返回x的正切值
@exp(x) 返回常数e的x次方
@log(x) 返回x的自然对数
@lgm(x) 返回x的gamma函数的自然对数
@sign(x) 如果x<0返回-1;否则,返回1
@floor(x) 返回x的整数部分。当x>=0时,返回不超过x的最大整数;当x<0时,返回不低于x的最大整数。
@smax(x1,x2,…,xn) 返回x1,x2,…,xn中的最大值
@smin(x1,x2,…,xn) 返回x1,x2,…,xn中的最小值
xij表示指派第i个人完成第j项任务,xij=0表示不分配
约束条件:每个人完成一项任务:
x11+x12+x13=1;
x21+x22+x23=1;
x31+x32+x33=1;
每项任务只能由一个人完成:
x11+x21+x31=1;
x12+x22+x32=1;
x13+x23+x33=1;
model:
min=8*x11+6*x12+10*x13+9*x21+12*x22+7*x23+7*x31+4*x32+3*x33;
x11+x21+x31=1;
x12+x22+x32=1;
x13+x23+x33=1;
x11+x12+x13=1;
x21+x22+x23=1;
x31+x32+x33=1;
!@bin(9);
@bin(x11);@bin(x12);@bin(x13);
@bin(x21);@bin(x22);@bin(x23);
@bin(x31);@bin(x32);@bin(x33);
end
MODEL:
SETS:
person/1..4/;
task/1..4/;
assign(person,task):a,x;
ENDSETS
DATA:
a=1100,800,1000,700,
600,500,300,800,
400,800,1000,900,
1100,1000,500,700;
ENDDATA
min=@sum(assign:a*x);
@for(task(j):@sum(person(i):x(i,j))=1);
@for(person(i):@sum(task(j):x(i,j))=1);
@for(assign(i,j):@bin(x(i,j)));
END