Lingo软件教程

LINGO是Linear Interactive and General Optimizer的缩写,即“交互式的线性和通用优化求解器”,由美国LINDO系统公司(Lindo System Inc.)推出的,可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等,功能十分强大,是求解优化模型的最佳选择。

当你在win环境下打开LINGO系统时,会得到如下窗口
Lingo软件教程_第1张图片
外层是主框架窗口,包含了所有菜单命令和工具条,其他所有窗口将被包含在主窗口之下。
Lingo软件教程_第2张图片
在模型窗口中输入如下代码
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软件教程_第3张图片
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中的最小值

Lingo软件教程_第4张图片

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;

Lingo软件教程_第5张图片

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

Lingo软件教程_第6张图片
Lingo软件教程_第7张图片
Lingo软件教程_第8张图片

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

Lingo软件教程_第9张图片
Lingo软件教程_第10张图片

你可能感兴趣的:(数学建模,MATLAB)