Lingo软件在求解数学优化问题的使用技巧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,类似于数组的下标)和属性(A TTRIBUTE,类似于数组)。
LINGO中的集合有两类:一类是原始集合(PRIMITIVE SETS),其定义的格式为:SETNAME/member list(or 1..n)/:attribute,attribute,etc。
另一类是是导出集合(DERIVED SETS),即引用其它集合定义的集合,其定义的格式为:SETNAME(set1,set2,etc。
):attribute,attribute,etc。
如果要在程序中使用数组,就必须在该部分进行定义,否则可不需要该部分。
(2)目标与约束:这部分定义了目标函数、约束条件等。
一般要用到LINGO的内部函数,可在后面的具体应用中体会其功能与用法。
求解优化问题时,该部分是必须的。
(3)数据部分(DA TA):这部分以“DA TA:”开始,以“END DA TA”结束。
其作用在于对集合的属性(数组)输入必要的数值。
格式为:attribut=value_list。
该部分主要是方便数据的输入。
(4)初始化部分(INIT):这部分以“INIT:”开始,以“END INIT”结束。
作用在于对集合的属性(数组)定义初值。
格式为:attribute=value_list。
由于非线性规划求解时,通常得到的是局部最优解,而局部最优解受输入的初值影响。
通常可改变初值来得到不同的解,从而发现更好的解。
编写LINGO程序要注意的几点:1.所有的语句除SETS、ENDSETS、DA TA、ENDDA TA、INIT、ENDINIT和MODEL,END 之外必须以一个分号“;”结尾。
2.LINGO求解非线性规划时已约定各变量非负。
LINGO内部函数使用详解。
LINGO建立优化模型时可以引用大量的内部函数,这些函数以“@”符号打头。
(1)常用数学函数@ABS(X) 返回变量X的绝对数值。
@COS( X)返回X的余弦值,X的单位为弧度@EXP( X)返回x e 的值,其中e 为自然对数的底,即 71828.2@FLOOR( X)向0靠近返回X 的整数部分。
如@FLOOR(3.7),则返回3;@FLOOR(-3.7),则返回-3。
@LGM( X)返回Γ函数的自然对数值。
@LOG( X)返回变量X 的自然对数值。
@SIGN( X)返回变量X 的符号值,当X<0时为-1;当X>0时为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 )限制U X L ≤≤ @BIN (X )限制X 为0或1。
@FREE (X )取消对X 的符号限制(即可取任意实数值)。
@GIN (X )限制X 为整数值。
(4)财务函数),(@N I FPA 返回如下情形下的净现值:单位时段利率为I ,连续N 个时段支付,每个时段支付费用,即:),(@N I FPA =I II NNn n/))11(1()1(11+-=+∑=),(@N I FPL 返回如下情形下的净现值:单位时段利率为I ,第N 个时段支付单位费用,即:),(@N I FPL =NI)11(+(5)概率函数@PSN(X)标准正态分布的分布函数。
@PSL(X)单位正态线性损失函数(即返回),0(X Z MAX -的期望值,其中Z 为标准正态随机变量)@PPS(A ,X)均值为A 的Possion 分布的分布函数(当X 不是整数时,采用线性插值进行计算)。
@PPL(X)Possion 分布的线性损失函数(即返回),0(X Z MAX -的期望值,其中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.某昼夜服务的公交路线每天各时间区段内需司机和乘务人员如下:设司机和乘务人员分别在各时间区段一开始上班,并连续工作八小时,问该公交线路至少配备多少名司机和乘务人员?从第一班开始排,试建立线性模型。
分析与求解:注意在每一时间段里上班的司机和乘务人员中,既包括在该时间段内开始时报到的人员,还包括在上一时间段工作的人员。
因为每一时间段只有四个小时,而每个司乘人员却要连续工作八个小时。
因此每班的人员应理解为该班次相应时间段开始时报到的人员。
设i x 为第i 班应报到的人员(6,,2,1 =i ),则应配备人员总数为:∑==61i ixZ按所需人数最少的要求,可得到线性模型如下:==61min i i x Z⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎨⎧≥≥≥+≥+≥+≥+≥+≥+0,,,60302050607060..6211655443322181x x x x x x x x x x x x x x x x t s LINGO 程序如下: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 某地区有三个农场共用一条灌渠,每个农场的可灌溉地及分配到的最大用水量如下表:各农场均可种植甜菜、棉花和高粱三种作物,各种作物的用水量、净收益及国家规定的该地区各种作物种植总面积最高限额如下表:三个农场达成协议,他们的播种面积与其可灌溉面积相等,而各种农场种何种作物并无限制。
问如何制定各农场种植计划才能在上述限制条件下,使本地区的三个农场的总净收益最大。
分析与求解:设农场1种植的甜菜、棉花和高粱分别为131211,,x x x 亩,农场2种植的甜菜、棉花和高粱分别为232221,,x x x 亩,农场3种植的甜菜、棉花和高粱分别为333231,,x x x 亩。
设农场可耕地为300,600,400321===a a a ,最大用水量为,6001=b ,8002=b3753=b ,甜菜、棉花和高粱的种植限额为325,500,600321===c c c ,耗水量为31=d ,22=d ,13=d ,净收益为100,300,400321===e e e ,根据题目条件,可建立如下线性模型:∑∑===3131)(max j i ijjxe Z⎪⎪⎪⎩⎪⎪⎪⎨⎧=≤=≤=≤∑∑∑===3131313,2,13,2,13,2,1..j i ij j j i ij i j ij i b x d i a x j c x t sLINGO 编程如下: MODEL: SETS:place/1..3/:a,b; kind/1..3/:c,d,e; plan(place,kind):x; ENDSETS DATA:a=400,600,300; b=600,800,375; c=600,500,325; d=3,2,1;e=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)=0 X(2,1)=258.3333,X(2,2)=12.5,X(2,3)=0 X(3,1)=0,X(3,2)=187.5,X(3,3)=0 最大总净收益为253333.3元。