ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:143.53KB ,
资源ID:4443939      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4443939.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Lingo软件使用指南.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Lingo软件使用指南.docx

1、Lingo软件使用指南Lingo软件使用指南摘要:本文介绍了Lingo软件的基本使用方法。从最基本的使用到复杂问题的解决,本文给出了比较详细的介绍。Lingo软件是美国Lindo公司的产品,主要用来求解优化问题。它是一个非常强大的软件,可以求解大部分优化问题,包括线性规划、二次规划、整数规划、运输问题等,是目前全球应用最广泛的优化软件之一。这里我们简单介绍它的使用方法。一 进入Lingo如果你的计算机已经安装了Lingo,只需要在桌面上双击Lingo的快捷方式,就可以进入Lingo。为了使自己的程序易于阅读,经常需要有一些注释,因此在编写程序中,每一行前面有感叹号的表示这一行是注释行,在程序运

2、行中不起作用,希望初学者养成注释的好习惯。二 建立数学模型和 Lingo模型语言例1 在Lingo的命令窗口中输入下面的线性规划模型!目标函数;MAX = 100 * x1 + 150 * x2; !第一个约束;X1= 100; !第二个约束; X2 = 120; !第三个约束; X1 + 2 * x2= 160; !end可有可无;end 求解可得全局最优解: Objective value: 14500.00Variable Value X1 100.0000 X2 30.00000 从这个例子可以看出,用Lingo软件求解一个简单的优化问题是非常容易的。我们只需要输入优化问题的两个主要部

3、分:目标函数和约束,就可以直接求解。对于比较简单的问题,我们可以采取这种直接的方式去求解,但是,对于比较复杂的问题,用这种方式就不现实。比如下面的例2,这就必须要使用Lingo的模型语言。例2 一个运输问题假设WWW公司有6个仓库,储存着8个分厂生产所需要的原材料。要求每一个仓库的供应量不能超过储存量,而且每一个分厂的需求必须得到满足。问:如何组织运输,使总运输费用最小?已知从6个仓库到8个分厂的运输费用表。表1 供应 表2 需求分厂标号需求量V135V237V322V432V541V632V743V838仓库标号供应能力Wh160Wh255Wh351Wh443Wh541Wh652表3 运输费

4、用V1V2V3V4V5V6V7V8Wh162674259Wh249538582Wh352197433Wh476739271Wh523957265Wh655228143这个问题是一个典型的优化问题,通常称为运输问题。具体求解过程如下。第一步:写出模型语言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 + VOL

5、UME_6_6 + 4 * VOLUME_6_7 +3 * VOLUME_6_8; 很显然,这样输入太麻烦,如果用Lingo模型语言来描述则简洁的多。首先将目标函数表示为我们熟悉的数学语言Minimize 然后将其转化为Lingo模型语言MIN = SUM( LINKS(I,J): COST(I,J) * VOLUME(I,J);数学语言和Lingo模型语言之间的关系为:数学语言 Lingo模型语言 Minimize MIN =SUM( LINKS( I, J): )COST ij COST(I,J)* *VOLUME ij VOLUME(I,J)2 构造约束函数。第j个分厂的需求:VOLUM

6、E_1_j + VOLUME_2_j + VOLUME_3_j +VOLUME_4_j + VOLUME_5_j + VOLUME_6_j = 35;则每一个分厂的需求用数学语言描述为VOLUMEij = DEMANDj, 对所有j 分厂Lingo模型语言描述为FOR( VENDORS( J): SUM( WAREHOUSES( I): VOLUME( I, J) = DEMAND( J);数学语言和Lingo模型语言之间的关系为:数学语言 Lingo模型语言for all j inVENDORS FOR( VENDORS( J): )SUM( WAREHOUSES( I): )VOLUME

7、ij VOLUME( I, J)= =DEMAND j DEMAND( J)第i个仓库的供应:VOLUME ij = CAP i , 每一个仓库的供应能力约束为VOLUME ij = CAP i , 对所有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( VEND

8、ORS( J): SUM( WAREHOUSES( I): VOLUME( I, J) =DEMAND( J);FOR( WAREHOUSES( I): SUM( VENDORS( J): VOLUME( I, J) =CAPACITY( I);END但是,我们还没有定义模型中的变量,且没有把已知数据传进来。第二步:定义变量集合在这个问题中,我们要定义三个集合,即:仓库集合、分厂集合及运输集合。定义方式如下:SETS:WAREHOUSES / WH1 WH2 WH3 WH4 WH5 WH6/: CAPACITY;VENDORS / V1 V2 V3 V4 V5 V6 V7 V8/ : DEMA

9、ND;LINKS( WAREHOUSES, VENDORS): COST, VOLUME;ENDSETS在这个定义中,三个变量集合包含在SETS和ENDSETS之间。仓库集合命名为WAREHOUSES,其中包含六个元素WHi(即六个仓库),且每个元素都有一个共同属性是供应量,命名为CAPACITY。分厂集合命名为VENDORS,其中包含八个元素Vj(即八个分厂),每个元素都有一个共同属性是需求量,命名为DEMAND。运输集合是由前两个集合派生出来的,用LINKS( WAREHOUSES, VENDORS)来表示这种派生关系,它中间包含48个元素,表示了从6个仓库到8个分厂之间的运输情况,其中每

10、一个元素有两个属性,运输费用COST和运输量VOLUME。这样,我们就把模型中需要的所有变量都定义过了。第三步:输入模型数据按照所定义的变量,输入数据,格式如下:DATA:CAPACITY = 60 55 51 43 41 52;DEMAND = 35 37 22 32 41 32 43 38;COST = 6 2 6 7 4 2 5 94 9 5 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;ENDDATA可以看出,所有输入的数据都必须包含在DATA和ENDDATA之间。经过这三步之后,我们就可以得

11、到一个完整的Lingo文件。MODEL:!六个仓库供应八个分厂的一个运输问题;SETS:WAREHOUSES/ WH1 WH2 WH3 WH4 WH5 WH6/: CAPACITY;VENDORS/ V1 V2 V3 V4 V5 V6 V7 V8/: 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

12、) =DEMAND( J);!仓库供应约束;FOR( WAREHOUSES( I): SUM( VENDORS( J): VOLUME( I, J) =CAPACITY( I);!输入数据;DATA:CAPACITY = 60 55 51 43 41 52;DEMAND = 35 37 22 32 41 32 43 38;COST = 6 2 6 7 4 2 5 9 4 9 5 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;ENDDATA END求解可得:Optimal solution found

13、at step: 16Objective value: 664.0000求解报告(非零解) Variable Value Reduced CostVOLUME( WH1, V2) 19.00000 0.0000000VOLUME( WH1, V5) 41.00000 0.0000000VOLUME( WH2, V4) 32.00000 0.0000000VOLUME( WH2, V8) 1.000000 0.0000000VOLUME( WH3, V2) 12.00000 0.0000000VOLUME( WH3, V3) 22.00000 0.0000000VOLUME( WH3, V7)

14、17.00000 0.0000000VOLUME( WH4, V6) 6.000000 0.0000000VOLUME( WH4, V8) 37.00000 0.0000000VOLUME( WH5, V1) 35.00000 0.0000000VOLUME( WH5, V2) 6.000000 0.0000000VOLUME( WH6, V6) 26.00000 0.0000000VOLUME( WH6, V7) 26.00000 0.0000000通过前面两个例题,我们已经知道了如何利用Lingo软件去求解简单优化问题和比较复杂的优化问题。但是,这还不够,在变量集合的定义中,如果集合中的元

15、素比较多,那么,采用枚举的定义方式就显得不合适;在输入数据时,如果数据量比较大,那么,采用在命令窗口中直接输入的方式就不可取,因此,我们必须去寻找更好的方法。下面我们就针对这两个问题来展开讨论。三 定义变量集合在Lingo模型语言中,变量集合分为两种类型:原始集合(Primitive)和派生集合(Derived)。在前面的例2中,仓库集合WAREHOUSES和分厂集合VENDORS就是原始集合,而运输集合是由这两个原始集合派生出来的,通常用LINKS( WAREHOUSES, VENDORS)来表示这个派生集合,这种派生属于完全派生,集合中包含了所有两个原始集合元素之间的各种可能搭配,因此,在

16、例题中,这个派生集合中就包含了68=48个元素。1原始集合一个原始集合的定义包含三部分,即 集合名称setname, 集合元素member, 集合元素的属性attribute.定义原始集合的语法为:setname / member_list / : attribute_list; 表示可选项,以下相同。原始集合命名按照一般程序设计语言的命名规则。元素列表中罗列出了集合中的元素,有两种方式,一是详细列表,即给每一个元素一个名字,把所有元素罗列出来,就象例2中仓库集合元素列表一样。WAREHOUSES / WH1 WH2 WH3 WH4 WH5 WH6/: CAPACITY;另一种是简略列表,在简

17、略列表中,不把集合中的元素按名字一一列出,而是采用下面的方式:setname / 1.n / : attribute_list;仓库集合定义可以表示为 WAREHOUSES / 1.6/: CAPACITY;对于元素比较多的集合,采用这样的方式是比较好的,但是,缺点就是元素名字只是用1,2给出,不够直观。元素属性列表中罗列出了集合中元素的所有属性,属性命名时按照一般程序设计语言的命名规则。属性可以有多个,例如我们对仓库集合元素增加一个位置属性LOCATION,则仓库集合定义可以表示为 WAREHOUSES / 1.6/: CAPACITY,LOCATION;2 派生集合一个派生集合的定义包含四

18、部分,即 集合名称setname, 父亲集合, 集合元素列表, 集合元素的属性attribute.定义派生集合的语法为:setname( parent_set_list) / member_list / : attribute_list;我们用下面的例子来说明,SETS:PRODUCT / A B/;MACHINE / M N/;WEEK / 1.2/;ALLOWED( PRODUCT, MACHINE, WEEK);ENDSETS集合PRODUCT, MACHINE 和 WEEK是原始集合,集合ALLOWED 是由父亲集合 PRODUCT, MACHINE 和 WEEK派生出来的.它的元素为

19、ALLOWED Set Membership:Index Member1 (A,M,1)2 (A,M,2)3 (A,N,1)4 (A,N,2)5 (B,M,1)6 (B,M,2)7 (B,N,1)8 (B,N,2)元素列表是可选项,如果省略掉,则默认为集合包含所有由父亲集合派生出来的元素,这种派生集合称之为稠密集合。就象上面的例子,包含8个元素。有时不需要派生集合中的所有元素,我们可以采用所谓的稀疏集合的方法,这时只需要指定派生集合的一个子集合即可。可以用两种方式来实现,一是详细列出子集合的所有元素,如ALLOWED( PRODUCT, MACHINE, WEEK) / A M 1, A N

20、2, B N 1/;这时,派生集合中的元素只有三个,即(A,M,1), (A,N,2), 和(B,N,1). 另一种是采用过滤技术来实现,我们仍然用一个例子来说明。考虑一个汽车集合TRUCKS,它是原始集合,集合中元素有属性CAPACITY,表示汽车的最大运载量,我们想得到运载量超过50000的所有汽车,这时可以采用过滤技术来实现。HEAVY_DUTY( TRUCKS) | CAPACITY( &1) #GT# 50000;集合 HEAVY_DUTY是由TRUCKS派生出来的,它中的元素都是运载量超过50000的汽车, 是元素过滤的开始标志;&1 表示在过滤时把第一个父亲集合的元素放在其中,如

21、果有第二个父亲集合,可以把第二个父亲集合的元素放在&2中;#GT#表示过滤的条件是大于;50000是过滤的下界。上面的语句表示了由父亲集合TRUCKS派生出集合HEAVY_DUTY,它中间的元素的属性(即汽车的运载量)都是满足大于50000的。LINGO 中的逻辑运算符包括:#EQ# equal#NE# not equal#GE# greater than or equal to#GT# greater than#LT# less than#LE# less than or equal to我们简单的总结集合之间的关系如下:四输入原始数据在LINGO中,一个重要的部分就是数据部分,我们要输入的

22、所有原始数据都要在这部分完成。数据部分以DATA:开始,以ENDDATA结束,所有输入数据包含在其中。数据输入的格式是:attribute_list = value_list;即我们需要把在变量集合部分定义好的集合赋以初值,给每一个集合属性列表赋以初值列表。我们以下面的例子来说明。SETS:SET1 /1.3/: X, Y;ENDSETSDATA:X = 1 2 3;Y = 4 5 6;ENDDATA首先定义了集合SET1,其中包含三个元素1,2,3,每个元素有两个属性X,Y。在数据部分,我们分别给两个属性赋初值,结果是元素1的X属性为1,Y属性为4,元素2的X属性为2,Y属性为5,元素3的X

23、属性为3,Y属性为6。我们也可以采用下面的紧凑格式:SETS:SET1 /1.3/: X, Y;ENDSETSDATA:X Y = 1 42 53 6;ENDDATA这样的数据输入方式对于比较小的问题是可行的,但是,对于规模比较大的问题,采用这样的数据输入方式显然是不可取的。LINGO提供了OLE 连接到 Excel, ODBC 连接到 databases, 以及与文本类型的数据文件的连接。1 与文本型数据文件的连接LINGO 与文本数据文件的连接函数中的数据载入函数是FILE,使用这个函数可以把外部的文本型数据文件传入LINGO模型语言中来,它的语法为:FILE( filename)。我们仍

24、然以运输问题为例来说明。在前面的例题中,模型语言如下:MODEL:!六个仓库供应八个分厂的一个运输问题;SETS:WAREHOUSES/ WH1 WH2 WH3 WH4 WH5 WH6/: CAPACITY;VENDORS/ V1 V2 V3 V4 V5 V6 V7 V8/: DEMAND;LINKS (WAREHOUSES, VENDORS): COST, VOLUME;ENDSETS!目标函数;MIN = SUM( LINKS( I, J): COST( I, J) * VOLUME( I, J);!分厂需求约束;FOR( VENDORS( J): SUM( WAREHOUSES( I):

25、 VOLUME( I, J) =DEMAND( J);!仓库供应约束;FOR( WAREHOUSES( I): SUM( VENDORS( J): VOLUME( I, J) =CAPACITY( I);!输入数据;DATA:CAPACITY = 60 55 51 43 41 52;DEMAND = 35 37 22 32 41 32 43 38;COST = 6 2 6 7 4 2 5 94 9 5 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;ENDDATAEND我们使用函数FILE来简化模型语言

26、的书写MODEL:!六个仓库供应八个分厂的一个运输问题;SETS:WAREHOUSES / FILE( WIDGETS2.LDT)/: CAPACITY;VENDORS / FILE( WIDGETS2.LDT)/ : 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);!

27、仓库供应约束;FOR( WAREHOUSES( I): SUM( VENDORS( J): VOLUME( I, J) =CAPACITY( I);!输入数据;DATA:CAPACITY = FILE( WIDGETS2.LDT);DEMAND = FILE( WIDGETS2.LDT);COST = FILE( WIDGETS2.LDT);ENDDATAEND原始数据存放在文本型数据文件WIDGETS2.LDT中,该文件的内容如下:!仓库列表;WH1 WH2 WH3 WH4 WH5 WH6 !分厂列表;V1 V2 V3 V4 V5 V6 V7 V8 !仓库储存量列表;60 55 51 43 41 52 !分厂需求列表;35 37 22 32 41 32 43 38 !单位运输费用列表;6 2 6 7 4 2 5 94 9 5 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3文件WIDGETS2.LDT的结构最好按照模型中的调用顺序来组织。文件中经常出现的符号 是记录结束标志,每一次调用文件WIDGETS2.LDT传进去一条记录,最后一条记录没有结束标志 ,调用结束后系统会自动关闭文件,如果给最后一条记录加上记录结束标志 ,那么调用结束后系统不会关闭数据文件,这

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1