《LINGO使用教程.docx》由会员分享,可在线阅读,更多相关《LINGO使用教程.docx(56页珍藏版)》请在第一文库网上搜索。
1、1INGO使用教程1INGO是用来求解线性和非线性优化问题的简易工具。11NGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用11NGo高效的求解器可快速求解并分析结果。mode1:sets:A/1.8/:d;B1.4/:n;!n(j)=1代表该候选地址成功作为物流中心;AB(A,B):vc,ven;!vcn(i,j)代表物料中心i运输到j城市的货物量;endsetsdata:d=10050120802007060100;!这里d(i)我理解成需求运输量,不知道是不是你要表达的意思;vc=124206102251043161456921218734144930202111224
2、622;enddatamin=um(B(i,j):n(j)*vc(i,j)*vcn(i,j);sum(B:n)=2;for(A(i):SUm(B(j):n(j)*vcn(i,j)=d(i);for(B:gin(n);end1 1INGo快速入门当你在windows下开始运行1INGO系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为1NGOMOde1-11NG(H的窗口是1INGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。下面举两个例子。例1.1如何在1INGO中求解如下的1P问题:min2x1+3x
3、2s.t.x1+x2350x11002xi+x2600x1,x20在模型窗口中输入如下代码:min=2*x1+3*x2;x1+x2=350;x1=100;2*x1+x2=600;然后点击工具条上的按钮0I即可。例12使用1INGO软件计算6个发点8个收点的最小费用运输问题。产销单位运价如下表。单位销地产地BiB2B3BiB5B6B7&产量A16267425960Az4953858255Aa5219743351A.,7673927143As2395726541A65522814352销量3537223241324338使用11NGo软件,编制程序如下:mode1:!6发点8收点运输问题;sets
4、:warehouses/wh1.wh6:capacity;vendors/v1.v8:demand;1inks(warehouses,vendors):cost,vo1ume;endsets!目标函数;min=SUm(Iinks:cost*vo1ume);!需求约束;for(vendors(J):sum(warehouses(I):vo1ume(I,J)=demand(J);!产量约束;for(warehouses(I):sum(vendors(J):vo1ume(I,J)=capacity(I);!这里是数据;data:capacity=605551434152;demand=3537223
5、241324338;cost=626742954953858252197433767392712395726555228143;enddata%点击工具条上的按钮松;即可。为了能够使用1INGO的强大功能,接着第二节的学习吧。2 1INGo中的集对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。11NGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥1INGO建模语言的优势。现在我们将深入介绍如何创建集,并用数据初始化集的属性。学完本节后,你对基于建模技术的集如何引入模型会有一个基本的理解。2.1 为什
6、么使用集集是1INGO建模语言的基础,是程序设计最强有力的基本构件。借助于集,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型。2.2 什么是集集是一群相联系的对象,这些对象也称为集的成员。一个集可能是一系列产品、卡车或雇员。每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。属性值可以预先给定,也可以是未知的,有待于11NGO求解。例如,产品集中的每个产品可以有一个价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位雇员可以有一个薪水属性,也可以有一个生日属性等等。1INGo有两种类型的集:原始集(PrinIi1iV
7、eSet)和派生集(derivedset)。一个原始集是由一些最基本的对象组成的。一个派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的集。2.3 模型的集部分集部分是1INGO模型的一个可选部分。在1INGO模型中使用集之前,必须在集部分事先定义。集部分以关键字“sets:开始,以“endsets”结束。一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须定义了它们。2.3.1 定义原始集为了定义一个原始集,必须详细声明:集的名字可选,集的成员可选,集成员的属性定义一个原始集,用下
8、面的语法:setnamemember-1ist/:attributeist;注意:用“口”表示该部分内容可速。下同,不再赘忘SetnanIe是你选择的来标记集的名字,最好具有较强的可读性。集名字必须严格符合标准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母(AZ)、下划线、阿拉伯数字(0,1,,9)组成的总长度不超过32个字符的字符串,且不区分大小写。注意:该命名规则同样适用于集成员名和属性名等的命名。MemberIiS1是集成员列表。如果集成员放在集定义中,那么对它们可采取显式罗列和隐式罗列两种方式。如果集成员不放在集定义中,那么可以在随后的数据部分定义它们。当显式罗列成员时,必
9、须为每个成员输入一个不同的名字,中间用空格或逗号搁开,允许混合使用。例2.1可以定义一个名为StUdentS的原始集,它具有成员John、JiI1、ROSe和Mike,属性有SeX和age:sets:students/JohnJi11,RoseMike/:sex,age;endsets当隐式罗列成员时,不必罗列出每个集成员。可采用如下语法:Setna1ne/member1.memberN/:attribute_1ist;这里的member1是集的第一个成员名,InemberN是集的最末一个成员名。1INGO将自动产生中间的所有成员名。1INGO也接受一些特定的首成员名和末成员名,用于创建一些特
10、殊的集。列表如下:隐式成员列表格式示例所产生集成员1.n1.51,2,3,4,5StringM.StringNCar2.car14Car2,Car3,Car4,Car14DayM.DayNMon.FriMon,Tue,Wed,Thu,FriMonthM.MonthNOct.JanOct,Nov,Dec,JanMonthYearM.MonthYearN0ct2001.Jan20020ct2001,Nov2001,Dec2001,Jan2002集成员不放在集定义中,而在随后的数据部分来定义。例22!集部分:sets:Studentsisex,age;endsets!数据部分;data:studen
11、ts,sex,age=John116Ji11014Rose017Mike113;enddata注意:开头用感叹号(!),末尾用分号(;)表示注释,可跨多行。在集部分只定义了一个集StUdents,并未指定成员。在数据部分罗列了集成员JOhn、Ji11xRoseMike,并对属性SeX和age分别给出了值。集成员无论用何种字符标记,它的索引都是从1开始连续计数。在attribute.IiSt可以指定一个或多个集成员的属性,属性之间必须用逗号隔开。可以把集、集成员和集属性同C语言中的结构体作个类比。如下图:集.-*结构体集成员一结构体的域集属性-一结构体实例1INGO内置的建模语言是一种描述性语言
12、,用它可以描述现实世界中的一些问题,然后再借助于11NGO求解器求解。因此,集属性的值一旦在模型中被确定,就不可能再更改。在11NGO中,只有在初始部分中给出的集属性值在以后的求解中可更改。这与前面并不矛盾,初始部分是11NGO求解器的需要,并不是描述问题所必须的。2.3.2 定义派生集为了定义一个派生集,必须详细声明: 集的名字 父集的名字 可选,集成员 可选,集成员的属性可用下面的语法定义一个派生集:setname(parent_set_1ist)member-1ist:attribute_1ist;setname是集的名字。parent_set_1ist是已定义的集的列表,多个时必须用逗
13、号隔开。如果没有指定成员列表,那么1INGO会自动创建父集成员的所有组合作为派生集的成员。派生集的父集既可以是原始集,也可以是其它的派生集。例2.3product/AB/;machine/MN/;week1.2/;a11owed(product,machine,week):x;endsets1INGO生成了三个父集的所有组合共八组作为a11owed集的成员。列表如下:编号成员1 (A,M,1)2 2(A,M,2)3 3(A,N,1)4 4(A,N,2)电电电M,1)M, 2)N, 1)88(B,N,2)成员列表被忽略时,派生集成员由父集成员所有的组合构成,这样的派生集成为稠密集。如果限制派生集
14、的成员,使它成为父集成员所有组合构成的集合的一个子集,这样的派生集成为稀疏集同原始集一样,派生集成员的声明也可以放在数据部分。一个派生集的成员列表有两种方式生成:显式罗列;设置成员资格过滤器。当采用方式时,必须显式罗列出所有要包含在派生集中的成员,并且罗列的每个成员必须属于稠密集。使用前面的例子,显式罗列派生集的成员:a11owed(product,machine,week)/AM1,AN2,BN1/;如果需要生成一个大的、稀疏的集,那么显式罗列就很讨厌。幸运地是许多稀疏集的成员都满足一些条件以和非成员相区分。我们可以把这些逻辑条件看作过滤器,在11NGo生成派生集的成员时把使逻辑条件为假的成员从稠密集中过渡掉。例2.4sets:!学生集:性别属性sex,1表示男性,。表示女性;年龄属性age.students/John,Ji11,Rose,Mike/:sex,age;!男学生和女学生的联系集:友好程度属性friend,0,1之间的数。1inkmf(students,students)sex(&1)#eq#1#and#sex(&2)#eq#O:fr