您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > Lingo软件使用指南
Lingo软件使用指南摘要:本文介绍了Lingo软件的基本使用方法。从最基本的使用到复杂问题的解决,本文给出了比较详细的介绍。Lingo软件是美国Lindo公司的产品,主要用来求解优化问题。它是一个非常强大的软件,可以求解大部分优化问题,包括线性规划、二次规划、整数规划、运输问题等,是目前全球应用最广泛的优化软件之一。这里我们简单介绍它的使用方法。一进入Lingo如果你的计算机已经安装了Lingo,只需要在桌面上双击Lingo的快捷方式,就可以进入Lingo。为了使自己的程序易于阅读,经常需要有一些注释,因此在编写程序中,每一行前面有感叹号的表示这一行是注释行,在程序运行中不起作用,希望初学者养成注释的好习惯。二建立数学模型和Lingo模型语言例1在Lingo的命令窗口中输入下面的线性规划模型!目标函数;MAX=100*x1+150*x2;!第一个约束;X1=100;!第二个约束;X2=120;!第三个约束;X1+2*x2=160;!end可有可无;end求解可得全局最优解:Objectivevalue:14500.00VariableValueX1100.0000X230.00000从这个例子可以看出,用Lingo软件求解一个简单的优化问题是非常容易的。我们只需要输入优化问题的两个主要部分:目标函数和约束,就可以直接求解。对于比较简单的问题,我们可以采取这种直接的方式去求解,但是,对于比较复杂的问题,用这种方式就不现实。比如下面的例2,这就必须要使用Lingo的模型语言。例2一个运输问题假设个仓库,储存着8个分厂生产所需要的原材料。要求每一个仓库的供应量不能超过储存量,而且每一个分厂的需求必须得到满足。问:如何组织运输,使总运输费用最小?已知从6个仓库到8个分厂的运输费用表。表1供应表2需求分厂标号需求量V135V237V322V432V541V632V743V838表3运输费用这个问题是一个典型的优化问题,通常称为运输问题。具体求解过程如下。第一步:写出模型语言1构造目标函数。根据问题要求,可以设VOLUME_I_J表示从第I个仓库到第J个分厂运输原材料数。那么,总运费最小的目标函数为MIN=6*VOLUME_1_1+2*VOLUME_1_2+6*VOLUME_1_3+7*VOLUME_1_4+4*VOLUME_1_5+···8*VOLUME_6_5+VOLUME_6_6+4*VOLUME_6_7+仓库标号供应能力Wh160Wh255Wh351Wh443Wh541Wh652V1V2V3V4V5V6V7V8Wh162674259Wh249538582Wh352197433Wh476739271Wh523957265Wh6552281433*VOLUME_6_8;很显然,这样输入太麻烦,如果用Lingo模型语言来描述则简洁的多。首先将目标函数表示为我们熟悉的数学语言MinimizeVOLUMEijijCOSTij*然后将其转化为Lingo模型语言MIN=@SUM(LINKS(I,J):COST(I,J)*VOLUME(I,J));数学语言和Lingo模型语言之间的关系为:数学语言Lingo模型语言MinimizeMIN=ij@SUM(LINKS(I,J):)COSTijCOST(I,J)**VOLUMEijVOLUME(I,J)2构造约束函数。第j个分厂的需求:VOLUME_1_j+VOLUME_2_j+VOLUME_3_j+VOLUME_4_j+VOLUME_5_j+VOLUME_6_j=35;则每一个分厂的需求用数学语言描述为iVOLUMEij=DEMANDj,对所有j分厂Lingo模型语言描述为@FOR(VENDORS(J):@SUM(WAREHOUSES(I):VOLUME(I,J))=DEMAND(J));数学语言和Lingo模型语言之间的关系为:数学语言Lingo模型语言foralljinVENDORS@FOR(VENDORS(J):)i@SUM(WAREHOUSES(I):)VOLUMEijVOLUME(I,J)==DEMANDjDEMAND(J)第i个仓库的供应:jVOLUMEij=CAPi,每一个仓库的供应能力约束为jVOLUMEij=CAPi,对所有i仓库Lingo模型语言描述为@FOR(WAREHOUSES(I):@SUM(VENDORS(J):VOLUME(I,J))=CAPACITY(I));这样,我们就把运输问题的两个约束都用Lingo模型语言写出来了。从而就得到了一个完整的模型:MODEL:MIN=@SUM(LINKS(I,J):COST(I,J)*VOLUME(I,J));@FOR(VENDORS(J):@SUM(WAREHOUSES(I):VOLUME(I,J))=DEMAND(J));@FOR(WAREHOUSES(I):@SUM(VENDORS(J):VOLUME(I,J))=CAPACITY(I));END但是,我们还没有定义模型中的变量,且没有把已知数据传进来。第二步:定义变量集合在这个问题中,我们要定义三个集合,即:仓库集合、分厂集合及运输集合。定义方式如下:SETS:WAREHOUSES/WH1WH2WH3WH4WH5WH6/:CAPACITY;VENDORS/V1V2V3V4V5V6V7V8/:DEMAND;LINKS(WAREHOUSES,VENDORS):COST,VOLUME;ENDSETS在这个定义中,三个变量集合包含在SETS和ENDSETS之间。仓库集合命名为WAREHOUSES,其中包含六个元素WHi(即六个仓库),且每个元素都有一个共同属性是供应量,命名为CAPACITY。分厂集合命名为VENDORS,其中包含八个元素Vj(即八个分厂),每个元素都有一个共同属性是需求量,命名为DEMAND。运输集合是由前两个集合派生出来的,用LINKS(WAREHOUSES,VENDORS)来表示这种派生关系,它中间包含48个元素,表示了从6个仓库到8个分厂之间的运输情况,其中每一个元素有两个属性,运输费用COST和运输量VOLUME。这样,我们就把模型中需要的所有变量都定义过了。第三步:输入模型数据按照所定义的变量,输入数据,格式如下:DATA:CAPACITY=605551434152;DEMAND=3537223241324338;COST=626742594953858252197433767392712395726555228143;ENDDATA可以看出,所有输入的数据都必须包含在DATA和ENDDATA之间。经过这三步之后,我们就可以得到一个完整的Lingo文件。MODEL:!六个仓库供应八个分厂的一个运输问题;SETS:WAREHOUSES/WH1WH2WH3WH4WH5WH6/:CAPACITY;VENDORS/V1V2V3V4V5V6V7V8/:DEMAND;LINKS(WAREHOUSES,VENDORS):COST,VOLUME;ENDSETS!目标函数;MIN=@SUM(LINKS(I,J):COST(I,J)*VOLUME(I,J));!分厂需求约束;@FOR(VENDORS(J):@SUM(WAREHOUSES(I):VOLUME(I,J))=DEMAND(J));!仓库供应约束;@FOR(WAREHOUSES(I):@SUM(VENDORS(J):VOLUME(I,J))=CAPACITY(I));!输入数据;DATA:CAPACITY=605551434152;DEMAND=3537223241324338;COST=626742594953858252197433767392712395726555228143;ENDDATAEND求解可得:Optimalsolutionfoundatstep:16Objectivevalue:664.0000求解报告(非零解)VariableValueReducedCostVOLUME(WH1,V2)19.000000.0000000VOLUME(WH1,V5)41.000000.0000000VOLUME(WH2,V4)32.000000.0000000VOLUME(WH2,V8)1.0000000.0000000VOLUME(WH3,V2)12.000000.0000000VOLUME(WH3,V3)22.000000.0000000VOLUME(WH3,V7)17.000000.0000000VOLUME(WH4,V6)6.0000000.0000000VOLUME(WH4,V8)37.000000.0000000VOLUME(WH5,V1)35.000000.0000000VOLUME(WH5,V2)6.0000000.0000000VOLUME(WH6,V6)26.000000.0000000VOLUME(WH6,V7)26.000000.0000000通过前面两个例题,我们已经知道了如何利用Lingo软件去求解简单优化问题和比较复杂的优化问题。但是,这还不够,在变量集合的定义中,如果集合中的元素比较多,那么,采用枚举的定义方式就显得不合适;在输入数据时,如果数据量比较大,那么,采用在命令窗口中直接输入的方式就不可取,因此,我们必须去寻找更好的方法。下面我们就针对这两个问题来展开讨论。三.定义变量集合在Lingo模型语言中,变量集合分为两种类型:原始集合(Primitive)和派生集合(Derived)。在前面的例2中,仓库集合WAREHOUSES和分厂集合VENDORS就是原始集合,而运输集合是由这两个原始集合派生出来的,通常用LINKS(WAREHOUSES,VENDORS)来表示这个派生集合,这种派生属于完全派生,集合中包含了所有两个原始集合元素之间的各种可能搭配,因此,在例题中,这个派生集合中就包含了68=48个元素。1.原始集合一个原始集合的定义包含三部分,即集合名称setname,集合元素member,集合元素的属性attribute.定义原始集合的语法为:setname/member_list/[:attribute_list];[]表示可选项,以下相同。原始集合命名按照一般程序设计语言的命名规则。元素列表中罗列出了集合中的元素,有两种方式,一是详细列表,即给每一个元素一个名字,把所有元素罗列出来,就象例2中仓库集合元素列表一样。WAREHOUSES/WH1WH2WH3WH4WH5WH6/:CAPACITY;另一种是简略列表,在简略列表中,不把集合中的元素按名字一一列出,而是采用下面的方式:setname/1..n/[:attribute_list];仓库集合定义可以表示为WAREHOUSES/1..6/:CAPACITY;对于元素比较多的集合,采用这样的方式是比较好的,但是,缺点就是元素名字只是用1,2…给出,不够直观。元素属性列表中罗列出了集合中元素的所有属性,属性命名时按照一般程序设计语言的命名规则。属性可以有多个,例如我们对仓库集合元素增加一个位置属性LOCATION,则仓库集合定义可以表示为WAREHOUSES/1..6/:CAPACITY,LOCATION;2派生集合一个派生集合的定义包含四部分,即集合名称setname,父亲集合,集合元素列表,集合元素的属性attribute.定义派生集合的语法为:setname(parent_set_list)[/member_list/][:attribute_list];我们用下面的例子来说明,SETS:PRODUCT/AB/;MACHINE/MN/;WEEK/1..2/;ALLOWED(PRODUCT,MACHINE,WEEK);ENDSETS集合PRODUCT,MACHINE和WEEK是原始集合,集合ALLOWED是由父亲集合PRODUCT,MACHINE和WEEK派生出来的.它的元素为ALLOWEDSetMembership:IndexMember1(
本文标题:Lingo软件使用指南
链接地址:https://www.777doc.com/doc-2880798 .html