1Lingo软件在求解数学优化问题的使用技巧LINGO是一种专门用于求解数学规划问题的软件包。由于LINGO执行速度快,易于方便地输入、求解和分析数学规划问题,因此在教学、科研和工业界得到广泛应用。LINGO主要用于求解线性规划、非线性规划、二次规划和整数规划等问题,也可以用于求解一些线性和非线性方程组及代数方程求根等。LINGO的最新版本为LINGO7.0,但解密版通常为4.0和5.0版本,本书就以LINGO5.0为参照而编写。1.LINGO编写格式LINGO模型以MODEL开始,以END结束。中间为语句,分为四大部分(SECTION):(1)集合部分(SETS):这部分以“SETS:”开始,以“ENDSETS”结束。这部分的作用在于定义必要的变量,便于后面进行编程进行大规模计算,就象C语言在在程序的第一部分定义变量和数组一样。在LINGO中称为集合(SET)及其元素(MEMBER或ELEMENT,类似于数组的下标)和属性(ATTRIBUTE,类似于数组)。LINGO中的集合有两类:一类是原始集合(PRIMITIVESETS),其定义的格式为:SETNAME/memberlist(or1..n)/:attribute,attribute,etc。另一类是是导出集合(DERIVEDSETS),即引用其它集合定义的集合,其定义的格式为:SETNAME(set1,set2,etc。):attribute,attribute,etc。如果要在程序中使用数组,就必须在该部分进行定义,否则可不需要该部分。(2)目标与约束:这部分定义了目标函数、约束条件等。一般要用到LINGO的内部函数,可在后面的具体应用中体会其功能与用法。求解优化问题时,该部分是必须的。(3)数据部分(DATA):这部分以“DATA:”开始,以“ENDDATA”结束。其作用在于对集合的属性(数组)输入必要的数值。格式为:attribut=value_list。该部分主要是方便数据的输入。(4)初始化部分(INIT):这部分以“INIT:”开始,以“ENDINIT”结束。作用在于对集合的属性(数组)定义初值。格式为:attribute=value_list。由于非线性规划求解时,通常得到的是局部最优解,而局部最优解受输入的初值影响。通常可改变初值来得到不同的解,从而发现更好的解。编写LINGO程序要注意的几点:1.所有的语句除SETS、ENDSETS、DATA、ENDDATA、INIT、ENDINIT和MODEL,END之外必须以一个分号“;”结尾。2.LINGO求解非线性规划时已约定各变量非负。LINGO内部函数使用详解。LINGO建立优化模型时可以引用大量的内部函数,这些函数以“@”符号打头。(1)常用数学函数@ABS(X)返回变量X的绝对数值。@COS(X)返回X的余弦值,X的单位为弧度@EXP(X)2返回xe的值,其中e为自然对数的底,即71828.2@FLOOR(X)向0靠近返回X的整数部分。如@FLOOR(3.7),则返回3;@FLOOR(-3.7),则返回-3。@LGM(X)返回函数的自然对数值。@LOG(X)返回变量X的自然对数值。@SIGN(X)返回变量X的符号值,当X0时为-1;当X0时为1。@SIN(X)返回X的正弦值,X的单位为弧度@SMAX(X1,X2,...,XN)返回一列值X1,X2,...,XN的最大值。@SMIN(X1,X2,...,XN)返回一列值X1,X2,...,XN的最小值。@TAN(X)返回X的正切值,X的单位为弧度(2)集合函数集合函数的用法如下:set_operator(set_name|condition:expression)其中set_oprator部分是集合函数名(见下),set_name是数据集合名,expression部分是表达式,|condition部分是条件,用逻辑表达式描述(无条件时可省略)。逻辑表达式中可以三种逻辑算符(#AND#(与),#OR#(或),#NOT#(非))和六种关系酸符(#EQ#(等于),#NE#(不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于))。常见的集合函数如下:@FOR(set_name:constraint_expressions)对集合(set_name)的每个元素独立地生成约束,约束由约束表达式(constraint_expressions)描述。@MAX(set_name:expression)返回集合上的表达式(expression)的最大值。@MIN(set_name:expression)返回集合上的表达式(expression)的最小值。@SUM(set_name:expression)返回集合上的表达式(expression)的和。@SIZE(set_name)返回数据集set_name中包含元素的个数。@IN(set_name,set_element)如果数据集set_name中包含元素set_element则返回1,否则返回0。(3)变量界定函数变量函数对变量的取值范围附加限制,共有四种。@BND(L,X,U)限制UXL@BIN(X)限制X为0或1。@FREE(X)取消对X的符号限制(即可取任意实数值)。@GIN(X)限制X为整数值。(4)财务函数),(@NIFPA返回如下情形下的净现值:单位时段利率为I,连续N个时段支付,每个3时段支付费用,即:),(@NIFPA=IIINNnn/))11(1()1(11),(@NIFPL返回如下情形下的净现值:单位时段利率为I,第N个时段支付单位费用,即:),(@NIFPL=NI)11((5)概率函数@PSN(X)标准正态分布的分布函数。@PSL(X)单位正态线性损失函数(即返回),0(XZMAX的期望值,其中Z为标准正态随机变量)@PPS(A,X)均值为A的Possion分布的分布函数(当X不是整数时,采用线性插值进行计算)。@PPL(X)Possion分布的线性损失函数(即返回),0(XZMAX的期望值,其中Z为Possion分布随机变量)@PBN(P,N,X)二项分布的分布函数当N或X不是整数时,采用线性插值进行计算)。@PHG(POP,G,N,X)超几何分布的分布函数(当POP,G,N或X不是整数时,采用线性插值进行计算)。@PFD(N,D,X)自由度为N和D的F分布的分布函数。@PCX(N,X)自由度为N的2分布的分布函数。@PTD(N,X)自由度为N的t分布的分布函数。@RAND(X)返回0与1之间的伪随机数(X为种子数,典型用法为U(I)=@RAND(U(I+1)))。1.某昼夜服务的公交路线每天各时间区段内需司机和乘务人员如下:班次时间最少需要人数16:00—10:0060210:00—14:0070314:00—18:0060418:00—22:0050522:00—2:002062:00—6:0030设司机和乘务人员分别在各时间区段一开始上班,并连续工作八小时,问该公交线路至少配备多少名司机和乘务人员?从第一班开始排,试建立线性模型。分析与求解:4注意在每一时间段里上班的司机和乘务人员中,既包括在该时间段内开始时报到的人员,还包括在上一时间段工作的人员。因为每一时间段只有四个小时,而每个司乘人员却要连续工作八个小时。因此每班的人员应理解为该班次相应时间段开始时报到的人员。设ix为第i班应报到的人员(6,,2,1i),则应配备人员总数为:61iixZ按所需人数最少的要求,可得到线性模型如下:61miniixZ0,,,60302050607060..6211655443322181xxxxxxxxxxxxxxxxtsLINGO程序如下:MODEL:min=x1+x2+x3+x4+x5+x6;x1+x6=60;x1+x2=70;x2+x3=60;x3+x4=50;x4+x5=20;x5+x6=30;x1=60;END得到的解为:x1=60,x2=10,x3=50,x4=0,x5=30,x6=0;配备的司机和乘务人员最少为150人。2某地区有三个农场共用一条灌渠,每个农场的可灌溉地及分配到的最大用水量如下表:农场可灌溉地(亩)最大用水量(百立方)1400600260080033003755各农场均可种植甜菜、棉花和高粱三种作物,各种作物的用水量、净收益及国家规定的该地区各种作物种植总面积最高限额如下表:作物种类种植限额(亩)耗水量(百立方/亩)净收益(元/亩)甜菜6003400棉花5002300高粱3251100三个农场达成协议,他们的播种面积与其可灌溉面积相等,而各种农场种何种作物并无限制。问如何制定各农场种植计划才能在上述限制条件下,使本地区的三个农场的总净收益最大。分析与求解:设农场1种植的甜菜、棉花和高粱分别为131211,,xxx亩,农场2种植的甜菜、棉花和高粱分别为232221,,xxx亩,农场3种植的甜菜、棉花和高粱分别为333231,,xxx亩。设农场可耕地为300,600,400321aaa,最大用水量为,6001b,8002b3753b,甜菜、棉花和高粱的种植限额为325,500,600321ccc,耗水量为31d,22d,13d,净收益为100,300,400321eee,根据题目条件,可建立如下线性模型:3131)(maxjiijjxeZ3131313,2,13,2,13,2,1..jiijjjiijijijibxdiaxjcxtsLINGO编程如下:MODEL:SETS:place/1..3/:a,b;kind/1..3/:c,d,e;plan(place,kind):x;ENDSETSDATA:a=400,600,300;b=600,800,375;c=600,500,325;d=3,2,1;6e=400,300,100;ENDDATAmax=@sum(kind(j):e(j)*@sum(place(i):x(i,j)));@for(kind(j):@sum(place(i):x(i,j))=c(j));@for(place(i):@sum(kind(j):x(i,j))=a(i));@for(place(i):@sum(kind(j):d(j)*x(i,j))=b(i));END得到结果如下:X(1,1)=0,X(1,2)=300,X(1,3)=0X(2,1)=258.3333,X(2,2)=12.5,X(2,3)=0X(3,1)=0,X(3,2)=187.5,X(3,3)=0最大总净收益为253333.3元。对本题来说,由于数据少,可以不采用数组形式,可直接采用变量,则建立模型如下:设农场1种植的甜菜、棉花和高粱分别为111,,zyx亩,农场2种植的甜菜、棉花和高粱分别为222,,zyx亩,农场3种植的甜菜、棉花和高粱分别为333,,zyx亩。根据题目条件,可建立如下线性模型:)(100)(300)(400max321321321zzzyyyxxxZ0,,,,,,,,375238002360023300600400325500600..321321321333222111333222111321321321zzzyyyxxxzyxzyxzyxzyxzyxzyxzzzyyyxxxtsLINGO程序如下:MODEL:max=400*(x1+x2+x3)+300*(y1+y2+y3)+100*(z1+z2+z3);x1+x2+x3=600;y1+y2+y3=500;z1+z2+z3=325;x1+y1+z1=400;x2+y2+z2=600;x3+y3+z3=300;3*x1+2*y1+z1=600;73*x