Lingo基本教程
这是lingo的基本教程,LINGO是Linear Interactive and General Optimizer的缩写,即“交互式的线性和通用优化求解器”,由美国LINDO系统公司(Lindo System Inc.)推出的,可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等,功能十分强大,是求解优化模型的最佳选择。数模编程队友必备。华南农业大学数学建模培训目录§1LING0快速入门e§2LING0中的集e2.1为什么使用集2.2什么是集2.3模型的集部分2.3.1定义原始集2.3.2定义派生集§3模型的数据部分和初始部分ψ3.Ⅰ模型的数据部分3.1.1数据部分入门3.1.2参数3.1.3实时数据处理3.1.4指定属性为一个值3.15数据部分的未知数值3.2模型的初始部分§亻LINo函数。A1基本运算符A.1.1算术运算符4.1.2逻辑运算符4.1.3关系运算符4.2数学函数4.3金融函数4.4概率函数4.5变量界定函数4.6集操作函数A.7集循环函数A.8输入和输出函数49辅助函数§5 LINGO Windows命令。5.1文件菜单5.2绽辑菜单5.3LING0菜单5.4窗口菜单5.5帮助菜单§6LIGO的命令行命令§7综合举例“§8LING0与外部文件之间的数据传递8.1通过 Windows剪贴板传递数据注意:章后有e表示该章内容可点击超链接到达此章节。华南农业大学数学建模培训L|NG快速入门当你在 windows卜廾始运行 LINGO系统时,会得到类似卜面的一个窗口:LIlGO -LIGo ode- LIGo下1e卫tT置icoe1p2LIHGO Iodel-LINGOl外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之在主窗口内的标题为 LINGO Model- LINGO1的窗口是L.INGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。下面举两个例子。例1.1如何在LING0中求解如下的LP问题+≥+≤在模型窗口中输入如下代码:minx1+x2>=350x1>-1002*x1+x2<=600然后点击工具条上的按钮即可。例1.2使用LING0软件汁算6个发点8个收点的最小费用运输问题。产销单位运价如表单位销地运B1B2B3 BA B6B8产地A162674960k495885825652197488aA767391432895726564华南农业大学数学建模培训2852销量35372321321338使用 LINGO软件,编制程序如下mode l!6发点8收点运输问题sets:warehouses/whl.wh6/: capacityvendors/v1.v8/: demandlinks(wareho ses vendors): cost, volumeendsets!日标函数;min=@sum(links: costxyolume)需求约束;sfor (vendors():dsum (warehouses(i): volume(I U))=demand(u))!产量约束cfor( warehouses(工)@ sum(vendors(J): volume(I, U))<=capacity(i))i!这里是数据;datcapacity=605551434152denand=3537223241324338;CoSt=626742954953858252197433757392712395726555228143;enddataend然后点击工具条上的按钮悉>即可为了能够使用 LINGO的强入功能,接着第二节的学习吧§2LING0中的集对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体父通工具和雇工等等。LING0允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥 LINGO0建模语言的优势。现在我们将深入介绍如何创建集,并用数据初始化集的属性。学完本节后,你对基于建模技术的集如何引入模型会有个基本的理解。2.1为什么使用集集是 LINGO建模语言的基础,是程序设计最强冇力的基木构件。借助于集,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型。22什么是集集是一群相联系的对象,这些对象也称为集的成员。一个集可能是一系列产品、卡车或雇员。每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。属性值可以预先给定,也可以是未知的,有待」 LINGO求解。例如,产品集中的每个产品可以有个价格属性;卡车集中的每辆卡车可以有一个牵引力属性:;雇员集中的每位雇员可以有一个薪水属性,也可以有一个生日属性等等。华南农业大学数学建模培训LINGO有两种类型的集:原始集( primitive set)和派生集( derived set)。个原始集是由一些最基本的对象组成的一个派牛集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的集23模型的集部分集部分是LING0模型的一个可选部分。在LING0模型中使用集之前,必须在集部分事先定义。集部分以关键字“sets:”开始,以“ endsets”结束。个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须定义了它们。2.3.1定义原始集为了定义一个原始集,必须详细声明集的名字可选,集的成员·可选,集成员的属性定义一个原始集,用下面的语法setname/member list/: attribute list I注意:用“”表示该部分内容可进。下同,不再赘述。Setname是你选择的来标记集的名字,最好具有较强的可读性。集名字必须严格符合标准命名规则:以拉丁字母或下划线()为首字符,其后由拉丁字母(A-Z)、下划线、阿拉伯数字(0,1,…,9)组成的总长度不超过32个字符的字符串,且不区分大小写。注意:该论名想则同样适用于集成员名别用国性名等的命名。Member list是集成员列表。如果集成员放在集定义中,那么对它们可采取显式罗列和隐式罗列两种方式。如果集成员不放在集定义中,那么可以在随后的数据部分定义它们①当显式罗列成员时,必须为每个成员输入个不同的名字,中间用空格或逗号搁开,允诈混合使用例2.1可以定义一个名为 students的原始集,它具有成员Joh、Ji11、Rose和Mike,属性有sex和age:setsstudents/John Jill, Rose Mike/: sex, age;endsets②当隐式罗列成员时,不必罗列出每个集成员。可采用如下语法:setname/member1. member/[: attribute list这里的 member1是集的第个成员名, member是集的最末个成员名。 LINGO将自动产生中间的所有成员名。LING0也接受一些特定的首成员名和末成员名,用于创建一些特殊的集列表如下隐式成员列表格式示例所产生集成员1,2,3,4,5StringY. StringCar2. car14Car2. car3. Car4.,. Car14DayM. dayNMon, friMon. Tue, Wed, Thu, friMonth, monthOct.JanOct Nov, Dec,janMonthYearM. MonthYearN Oct2001. Jan2002Oct2001,Nov2001,Dec2001,Jan2002③集成员不放在集定义中,而在随后的数据部分米定义。例2.2集部分;setsstudents: sex age;endsets!数据部分;华南农业大学数学建模培训datatudents, sex, age- John 1 16Ji11014Rose 0 17Mike13;enddata注意:开义用感号(!),末尾用分号(;)表示注释,可跨多行在集部分只定义了一个集 students,并未指定成员。在数据部分岁列了集成员JohrJi11、Rose和ike,并对属性sex和age分别给岀了值。集成员无论用何种字符标记,它的索引都是从1开始连续计数。在attrˉ ibute_ist可以指定一个或多个集成员的属性,属性之间必须用逗号隔开。叮以把集、集成员和集属性同C语言中的结构体作个类比。如卜图:集结构体集成员结构体的域集属性←→结构体实例LINGO内置的建模语言是一种描述性语言,用它可以描述现实世界中的一些问题,然后再借助于LING求解器求解。因此,集属性的值一日在模型中被确定,就不可能再更改。在LIvG0中,只有在初始部分中给出的集属性值在以后的求解中可更改。这与前面并不矛盾,初始部分是LNG0求解器的需要,并不是描述问题所必须的23.2定义派生集为了定义一个派生集,必须详细声明:集的名字父集的名字可选,集成员·可选,集成员的属性可用下面的语法定义一个派生集:setname(parent set list)/ member list/][: attribute list]setname是集的名字。 parent set list是已定义的集的列表,多个时必须用逗号隔开。如果没有指定成员列表,那么LⅠNG0会自动创建父集成员的所有组合作为派生集的成员。派生集的父集既可以是原始集,也可以是其它的派生集。例2.3setsproduct/AB/machine/M n/e≈k/1..2/;allowed(prcduct, machine, week):xendsetsLINGO生成了三个父集的所有组合共八组作为 allowed集的成员。列表如下:编号成员(A,M,1)(A,W,2)2345678(A,N,1)(A,N,2)(B,W,1)(B,N,1)(B,N,2)成员列表被忽略时,派生集成员由父集成员所有的组合构成,这样的派生集成为稠密集如果限制派生集的成员,使它成为父集成员所有组合构成的集合的一个子集,这样的派生集成为稀硫集。同原始集一样,派生集成员的声明也可以放在数据部分。一个派生集的成员列表有两种方式生成:①显式罗列;②设置成员资格过滤器。当采用方式①时,必须显式罗列出所有要包含在派生集中的成员,并且罗列的每个成员必须属于稠密集。使用前面的例子式罗列派生集的成员:华南农业大学数学建嗅培训allowed(product, machine, week)/A M 1, A N 2,B N 1/如果需要生成一个大的、稀疏的集,那么显式罗列就很讨厌。幸运地是许多稀疏集的成员都满足一些条件以和非成员相区分。我们可以把这些逻辑条件看作过滤器,在ⅠING生成派生集的成员时把使逻辑条件为假的成员从稠密集中过滤掉例2.4sets!学牛集:性别属性sex,1表示男性,0表示女性;年龄属性age.;students/John, Jill, Rose, Mike/: sex, age;!男学生和女学生的联系集:友好程度属性 friend,[0,1]之间的数。linkrmf (students, students)I sex(&1) #eg# 1 #and# sex(&2)#ea# 0: friend;!男学牛和女学生的友好程度大于0.5的集linkmf2(linkmt)| friend(&l,&2)#ge 0.5 :xendsetsdatasex, age =1 16014017friend=0.30.50.6;enddata用竖线()来标记一个成员资格过滤器的开始刂#eq是辑运算符,用来判断是香“相等”,可参考§4.&1可看作派生集的第1个原始父集的索引,它取遍该原始父集的所有成员;&2可看作派生集的第2个原始父集的索引,它取遍该原始父集的所有成员;83,&4,……,以此类推。注意如果派生集B的父集是另外的派生集A,那么上面所说的原始父集是集A向前凵溯到最终的原始集,其顺序保持不变,并且派生集A的过滤器对派生集B仍然有效。因此,派生集的索引个数是最终原始父集的个数,索引的取值是从原始父集到当前派生集所作限制的总和。总的来说,LⅠNGO可识别的集只有两种类型:原始集和派生集。在一个模型中,原始集是基本的对象,不能再被拆分成更小的组分。原始集可以由显式罗列和隐式罗列两种方式来定义。当用显式罗列方式时,需在集成员列表中逐个输入每个成员。当用隐式罗列方式时,只需在集成员列表中输入首成员和末成员,而中间的成员由 LINGO产生。另一方面,派牛集是由其它的集来创建。这些集被称为该派生集的父集(原始集或其它的派生集)。一个派生集既可以是稀疏的,也可以是稠密的。稠密集包含了父集成员的所有组合(有时也称为父集的篚卡尔乘积)。稀统集仪包含了父集的笛卡尔乘积的个了集,可通过显式罗列和成员资格过滤器这两种方式来定义。显式罗列法就是逐个罗列稀疏集的成员。成员资格过滤器方法通过使用稀疏集成员必须满烂的逻辑条件从稠密集成员中过滤岀桸疏集的成员。不同集类型的关系见下图集派生集原始集稀疏集稠密集显式罗列过滤器LINGO集类型华南农业大学数学建模培训§3模型的数据部分和初始部分在处模型的数据时,需要为集指派一些成员并且在LING0求解模型之前为集的某些属性指定值。为此, LINGO为用户提供了两个可选部分:输入集成员和数据的数据部分(DataSection)和为决策变量设置初始值的初始部分( Init section)3.1模型的数据部分3.1.1数据部分入门数据詺分提供了模型相对静止部分和数据分离的可能性。显然,这对模型的维护和维数的缩放非常便利。数据部分以关键字“data:”开始,以关键字“ enddata”结束。在这里,可以指定集成员、集的属性。其语法如下:object list= value li对象列( object list)包含要指定值的属性名、要设置集成员的集名,用逗号或空格隔开。一个对象列中至多有一个集名,而属性名可以有任意多。如果对象列中有多个属性名,那么它们的类型必须一致。如果对象列中有一个集名,那么对象列中所有的属性的类型就是这个集数值列( value list)包含要分给对象列中的对象的值,用逗号或空格隔廾。注意属性值的个数必须等于集成员的个数。看下面的例子。例3.1setsset1/A, B,c/: X,YendsetsdataY=4,5,6enddata在集set1中定义了两个属性X和Y。X的三个值是1、2和3,Y的三个值是4、5和6。也可米用如下例」中的复合数据声明( data statement)实现同样的功能例3.2setsset1/A,B c/: Xy;endsetsdata,Y=14enddata看到这个例了,可能会认为Ⅹ被指定了1、4和2三个值,因为它们是数值列中前三个而正确的答案是1、2和3。假设对象列有n个对象, LINGO在为对象指定值时,首先在n个对象的第1个索引处依次分配数值列中的前n个对象,然后在n个对象的第2个索引处依次分忾数值列中紧接着的n个对象,……,以此类推。模型的所有数据属性值和集成员被单独放在数据部分,这可能是最规范的数据输入方式。3.1.2参数在数据部分也可以指定一些标量变量( scalar variables)。当一个标量变量在数据部分确定时,称之为参数。看一例,假设模型中用利率8.5%作为一个参数,就可以象下面样输入一个利率作为参数。例3.3datainterest rate085;enddata也可以同时指定多个参数。例3.4data华南农业大学数学建模培训interest rateinflation rate85.03;enddata3.1.3实时数据处理在某些情况,对于模型中的某些数据并不是定值。譬如模型中有一个迸货膨胀率的参数,我们想在2%至6范围内,对不同的佰求解模型,来观察模型的结果对通货膨胀的依赖有多么敏感。我们把这种情况称为实时数据处理( what if analysis)。LINi0有个特征可方便地做到这件事。在本该放数的地方输入一个问号(?)。例3.5datanterest raterinflation rate =.085 ?1enddata每一次求解馍型时, LINGO都会提示为参数 inflation rate输入一个值。在 WINDOWS操作系统下,将会接收到一个类似下面的对话框LIHGO Runtime InputFLe回色1 Iput a过是EY工 FLATTO RATECancel直接输入一个值再氐击OK按钮, LINGO就会把输入的值指定给 inflation rate,然后继续求解模型除了参数之外,也可以实时输入集的属性值,但不允诈实时输入集成员名3.1.4指定属性为一个值叮以在数据声明的右边输入一个值来把所有的成员的该属性指定为一个值。看下面的例例3.6etsdays /MO, TU, WE, TH, FR, SA, sU/: needs;endsetdataeds -20:enddataLIGO将用20指定days集的所有成员的 needs属性。对于多个属性的情形,见下例。例3.7setsdays /Mo, TU, WE, TH, FR, SA, sU/: needs, Cos=iendsetsdataneeds cost =20 100ienddata3.1.5数据部分的未知数值有时只想为一个集的部分成员的某个属性指定值,而让其余成员的该属性保持未知,以使让 LINGO去求出它们的最优值。在数据声明中输入两个相连的逗号表示该位置对应的集成员的属性值未知。两个逗号间可以有空格。例3.8setsyears/1. 5/: capacityendsetsdatacapacity -,34,20,,ienddata
用户评论