




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LINGO入门LINGO 入 门2LINGO入门目 录目 录21 LINGO基础11.1 LINGO软件的安装过程11.2 在LINGO中使用LINDO模型11.3 编写一个简单的LINGO程序21.4 敏感性分析52 在LINGO中使用集合82.1 集合的基本用法和LINGO模型的基本要素82.2 基本集合与派生集合112.3 稠密集合与稀疏集合132.4 集合的使用小结143 运算符和函数154 LINGO软件与外部文件的接口164.1 通过Windows剪贴板传递数据164.2通过文本文件传递数据164.3通过Excel电子表格文件传递数据17附 录191 LINGO基础1.1 LINGO软件的安装过程LINGO软件非常容易安装,只需要在Windows操作系统下将安装光盘(或USB盘)插入光驱(或USB接口),运行其中的安装程序(通常是setup.exe)就可以了。目前从LINDO系统公司或其他渠道得到的安装程序,多数情况下是一个自解压的可执行性文件(如lingo8.exe,大致是20M左右),可以直接运行这个程序进行安装。LINGO 9.0 for Windows软件安装完成前,会出现一个对话框,询问你希望采纳的默认的建模(即编程)语言,系统推荐的是采用LINGO语法,即选项“LINGO(recommended)”;你也可以选择“LINDO”将LINDO语法作为默认的设置。安装后你也可以随时通过“LINGO|Options|Interface|File Format”命令来修改默认的建模语言。第一次运行刚安装的LINGO软件时,系统会弹出一个对话框,要求你输入许可证(licence)。如果你买的是正版软件,请在密码框中输入LINGO公司提供给你的许可证(如果密码已经被复制(Ctrl+C)到Windows剪贴板中,则可以使用粘贴(Ctrl+V)命令从Windows剪贴板中将密码拷贝到密码框中),然后按“OK”按钮即可。否则,按下“Demo”按钮使用演示版(即试用版)。演示版与正式版的基本功能是类似的,只是演示版能够求解问题的规模(即决策变量和约束的个数)受到严格限制,对于规模稍微大些的问题就不能求解了。任何时候你都可以使用菜单命令“File|Licence”打开这个密码对话框,通过输入许可证成为正式版用户。查看LINGO软件的安装目录,通常可以看到其中有一个名为Samples的子目录,该子目录下有很多名为“*.lg4”的文件,后缀lg4表明这些文件是LINGO格式的模型文件。这些小例子对初学者学习LINGO很有帮助。1.2 在LINGO中使用LINDO模型LINDO与LINGO都是LINDO系统公司开发的专门用于求解最优化问题的软件包。与LINDO相比,LINGO软件主要具有两大优点:(1)除具有LINDO的全部功能外,还可用于求解非线性规划问题,包括非线性整数规划问题。(2)LINGO包含了内置的建模语言,允许以简练、直观的方式描述较大规模的优化问题,模型中所需的数据可以以一定格式保存在独立的文件中。所以LINDO公司已经将LINDO软件从其产品目录中删除。我们不提倡再使用LINDO软件,这里只简单介绍一下如何在LINGO中使用原有的LINDO模型。LINGO 9.0完全支持LINDO模型程序的书写格式。在LINGO 9.0模型窗口中选择菜单命令“File|Open (F3)”,屏幕上显示如图1-1所示的“打开文件”对话框,可以看到以下几种不同的“文件类型”:后缀“lg4”表示LINGO格式的模型文件,是一种特殊的二进制格式文件,保存了我们在模型窗口中能够看到的所有文件和其他对象及其格式信息,只有LINGO能读出它,用其他系统打开这种文件时会出现乱码;后缀“lng”表示文本格式的模型文件,并且以这个格式保存模型时LINGO将给出警告,因为模型中的格式信息(如字体、颜色、嵌入对象等)将会丢失;后缀“ldt”表示LINGO数据文件;后缀“ltf”表示LINGO命令脚本文件;后缀“lgr”表示LINGO报告文件;后缀“ltx”表示LINDO格式的模型文件;后缀“mps”表示MPS(数学规划系统)格式的模型文件;“*.*”表示所有文件。(除“lg4”文件外,另外几种格式的文件其实都是普通的文本文件,可以用任何文本编辑器打开和编辑。)图 1-1 在LINGO 9.0中打开LINDO文件只需将“文件类型”选为“*.ltx”,就可以直接在Lingo 9.0中打开使用LINDO语法编写的优化模型(即优化程序)了。此时,我们可以选择“LINGO|Solve (Ctrl+S)”命令来运行这个程序。注意 在LINGO 9.0以前的版本中(如LINGO 8.0),一般不能直接用“File|Open”命令直接打开LINDO模型,但有一个“File|Import LINDO File (F12)”命令可以将LINDO模型文件转化成LINGO模型。这个菜单命令的意思是“导入LINDO文件”(在LINGO 9.0中已无必要,所以该命令已经被取消了)。1.3 编写一个简单的LINGO程序下面通过一个产品生产销售计划实例,说明如何用LINGO求解二次规划模型。例1.1 某厂生产的一种产品有甲、乙两个牌号,讨论在产销平衡的情况下如何确定各自的产量,使总的利润最大。所谓产销平衡指工厂的产量等于市场上的销量,没有卖不出去的产品的情况。显然,销售总利润既取决于两种牌号产品的销量和(单件)价格,也依赖于产量和(单件)成本,按照市场经济规律,甲的价格p1固然会随其销量x1的增长而降低,同时乙的销量x2的增长也会使甲的价格有稍微的下降,可以简单地假设价格与销量成线性关系,即p1=b1a11x1a12x2,b1,a11,a120,a11a12;类似地,乙的价格p2遵循同样的规律,即有p2=b2a21x1a22x2,b2,a21,a220,a22a21.例如,假定实际中b1=100,a11=1,a12=0.1,b2=280;a21=0.2,a22=2。此外,假设工厂的生产能力有限,两种牌号产品的产量之和不可能超过100件,且甲的产量不可能超过乙的产量的两倍,甲乙的单件生产成本分别是q1=2和q2=3(假定为常数)。求甲、乙两个牌号的产量 x1,x2使总利润最大。优化模型 决策变量:决策变量就是甲、乙两个牌号的产量(也是销量)x1,x2目标函数:显然,目标函数就是总利润z(x1,x2),即z(x1,x2)(p1q1)x1(p2q2)x2 (100x10.1x2)x1(2800.2x12x23)x2 98 x1277 x2x120.3 x1 x22x22约束条件:题中假设工厂的生产能力有限,两种产品的产量之和不可能超过100件,且产品甲的产量不可能超过乙的产量的两倍。写成数学表达式,就是x1x2100, x12x2于是,可以得到如下数学规划模型: max 98 x1277 x2x120.3 x1 x22x22; (1.1)st x1x2100, (1.2)x12x2 (1.3)x1,x2 (1.4)由于目标函数(1.1)是一个二次函数,而约束(1.2)(1.4)都是线性函数,所以这是一个二次规划(QP)。该QP模型输入LINGO模型窗口后的形式见图1-2。 图 1-2 例1.1的LINGO优化模型我们看到这段程序(LINGO优化模型)有以下特点:(1)LINGO中模型以“MODEL:”开始,以“END”结束。对简单的模型,这两个语句也可以省略;(2)将目标函数的表示方式从“MAX”变成了“MAX=”。我们故意不把目标函数放在程序的最前面,是为了表明LINGO中的语句的顺序是不重要的,因为LINGO总是根据“MAX=”或“MIN=”语句寻找目标函数,而其他语句都是约束条件(注释语句和TITLE语句除外),所以语句的顺序不重要;(3)LINGO中的变量名由字母和数字组成,但必须以字母开头,长度不能超过32个字符(只能是英文字符,不能含有中文字符),LINGO中不区分大小写字母,包括LINGO中本身的关键字(如MAX、MIN等)也不区分大小写字母;(4)LINGO中对优化模型的目标和约束用行号(行名)进行标识,它被放在一对方括号“”中(如con)。这些行号标识会在将来的求解结果报告中用到。行号以字母或下划线开头。用户没有指定行号时,系统将自动生成行号。我们怎么知道哪个约束对应哪个行号呢?通过“LINGO|Generate|Display Model (Ctrl+G)”命令可以看到完整的模型(见图1-3),以及每行语句对应的行号了。不过,用户最好还是主动对每个约束进行命名,这会使程序更清晰;图1-3 例1.1的完整模型(5)在LINGO模型的任何地方都可以用“TITLE”来对模型命名。模型命名类似于对模型的注释和说明,它会出现在求解结果报告的顶部,用来区分不同模型的求解结果报告。此外,LINGO模型中以感叹号(“!”符号)开头的是注释语句,可以帮助他人或以后自己理解这个模型。注释语句中可以包含汉字,但是领头的感叹号(“!”符号)必须是英文字符,否则会出现错误。总之,行号、“TITLE”语句和注释语句是LINGO中唯一可以使用汉字字符的地方;(6)在每个系数与变量之间的运算符不能省略。(7)目标、约束和说明语句必须以“;”作为结束标志。(8)LINGO中已假定所有变量非负(除非用限定变量取值范围的函数free,bnd另行说明);(9)约束条件中的“=”可分别用“”代替;输入的多余空格和回车也会被忽略;(10)在LINGO中,以“”开头的都是函数调用。gin(x1)表明x1是一个整形变量;(11)可使用“LINGO|Picture”命令检查模型中的简单错误,该命令将目标函数和约束表达式中的非零系数通过列表(或图形)显示出来。这时我们可以用“LINGO|Solve (Ctrl+S)”命令来运行这个程序,屏幕上显示的运行状态窗口如图1-4所示,运行结果显示在报告窗口中(见图1-5)。(如果想要了解运行状态窗口中各项的含义,可先点击工具栏上的图标,再点击运行状态窗口,屏幕上自动弹出运行状态窗口的帮助信息。) 图1-4 例1.1的LINGO状态窗口图1-5 例1.1的LINGO求解结果报告窗口1.4 敏感性分析敏感性分析的作用是给出“Ranges in which the basis is unchanged”,即研究当目标函数的系数和约束右端项在什么范围变化(此时假定其他系数保持不变)时,最优基(矩阵)保持不变。下面我们通过一个例子来说明。例1.2 一奶制品加工厂用牛奶生产A1,A2两种奶制品,1桶牛奶可以在甲车间用12h加工成3kgA1,或者在乙车间用8h加工成4kg A2。根据市场需求,生产出的A1,A2全部能售出,且每千克A1获利24元,每千克A2获利16元。现在加工厂每天能得到50桶牛奶的供应,每天正式工人总的劳动时间为480h,并且甲车间的设备每天至多能加工100kg A1,乙车间的设备的加工能力可以认为没有上限限制(即加工能力足够大)。试为该厂制定一个生产计划,使每天获利最大,并进一步讨论以下3个附加问题:(1)若用35元可以买到1桶牛奶,是否作这项投资?若投资,每天最多购买多少桶牛奶?(2)若可以聘用临时工人以增加劳动时间,付给临时工人的工资最多是每小时几元? (3)由于市场需求变化,每千克A1的获利增加到30元,是否应该改变生产计划?优化模型决策变量:设每天用x1桶牛奶生产A1,用x2桶牛奶生产A2目标函数:设每天获利为z(元),x1桶牛奶生产3x1(kg)A1,获利243x1,x2桶牛奶生产4x2(kg) A2,获利164x1,故z=72x1+64x2.约束条件原料供应:生产A1,A2的原料(牛奶)总量不得超过每天的供应,即x1+x250(桶);劳动时间:生产A1,A2的总加工时间不得超过每天正式工人总的劳动时间,即 12x1+8x2480(h);设备能力:A1的产量不得超过甲车间设备每天的加工能力,即3x1100;非负约束:x1,x2均不能为负值。综上可得max z=72x1+64x2;s.t. x1+x250, 12x1+8x2480, 3x1100, x1,x20由于牛奶是任意可分的,我们可以假设决策变量是在实数范围内取值,因此这是一个连续规划。又由于目标函数和约束条件对于决策变量而言都是线形的,所以这是一个(连续)线性规划(LP)问题。首先在LINGO模型窗口中输入模型,见图1-6。 图1-6 例1.2的LINGO优化模型通过菜单命令“LINGO|Solve (Ctrl+S)”运行程序,如图1-7所示,求解结果为:x1=20,x2=30,最优值为z=3360,即用20桶牛奶生产A1,30桶牛奶生产A2,可获得最大利润3360元。输出中除了告诉我们问题的最优解和最优值外,还有很多对分析结果有用的信息,下面结合题目中的3个附加问题给予说明。3个约束条件的右端不妨看作3种“资源”:原料、劳动时间、车间甲的加工能力。输出中“Slack or Surplus”(松弛或剩余)给出这3种资源在最优解下是否有剩余:原料、劳动时间的剩余均为零(即约束为紧约束),车间甲尚余40kg加工能力(不是紧约束)。 目标函数可以看作“效益”,成为紧约束的“资源”一旦增加,“效益”必然跟着增长。输出中Dual Price给出这3种资源在最优解下“资源”增加1个单位时“效益”的增量:原料增加1个单位(1桶牛奶)时利润增长48(元),劳动时间增加1个单位(1h)时利润增长2(元),而增加非紧约束车间甲的能力显然不会使利润增长。这里,“效益”的增量可以看作“资源”的潜在价值,经济学上称为影子价格(shadow price),即1桶牛奶的影子价格为48元,1h劳动的影子价格为2元,车间甲生产能力的影子价格为零。用影子价格的概念很容易回答附加问题(1):用35元可以买到1桶牛奶,低于1桶牛奶的影子价格48,当然应该作这项投资。回答附加问题(2):聘用临时工人以增加劳动时间,付给的工资低于劳动时间的影子价格才可以增加利润,所以工资最多是2元/h。要回答附加问题(3)需要进行敏感性分析。图1-7 例1.2的求解结果报告注意:这里LINGO不询问是否进行敏感性分析。如果需要进行敏感性分析,必须用“LINGO|Options”命令打开系统选项对话框,在“General Solver”标签下的“Dual Computations”下拉列表中选中“Prices & Range”,再按下“OK”按钮激活敏感性分析功能。修改了系统选项后,以后只需调用“LINGO|Range”命令即可进行敏感性分析了。图1-8例1.2的敏感性分析报告由图1-8分析报告给出了最优基不变条件下目标函数系数及约束的右端项的允许变化范围:x1的系数范围为72-8,72+24=64,96;x2的系数范围为64-16,64+8=48,72。注意:x1系数的允许范围需要x2的系数64不变,反之亦然。由于目标函数的系数变化并不影响约束条件,因此此时最优基不变可以保证最优解也不变,但最优值变化。用这个结果很容易回答附加问题(3):若每千克A1的获利增加到30元,则x1系数变为303=90,在允许的范围内,所以不应改变生产计划,但最优值变为9020+6430=3720。下面对“资源”的影子价格作进一步的分析。影子价格的作用(即在最优解下“资源”增加1个单位时“效益”的增量)是有限的。每增加1桶牛奶利润增长48元(影子价格),但是,从上面输出中可以看出,约束的右端项(CURRENT RHS)的“允许增加”(ALLOWABLE INCREASE)和“允许减少”(ALLOWABLE DECREASE)给出了影子价格有意义条件下约束右端的限制范围(因为此时最优基不变,所以影子价格才有意义;如果最优基已经变了,那么结果中给出的影子价格也就不正确了;理解这一点可能需要多了解一些线性规划的有关知识)。具体对本例来说:milk)原料最多增加10桶牛奶,time)劳动时间最多增加53h。现在可以回答附加问题(1)的第2问:虽然应该批准用35元买1桶牛奶的投资,但每天最多购买10桶牛奶。此外,可以用低于2元/h的工资聘用临时工人以增加劳动时间,但最多增加53.3333h。需要注意的是:敏感性分析给出的只是最优基保持不变的充分条件,而不一定是必要条件。比如对于以上的问题,“原料最多增加10桶牛奶”的含义只能是“原料增加10桶牛奶”时最优基保持不变,所以影子价格有意义,即利润的增加大于牛奶的投资。反过来,原料增加超过10桶牛奶,最优基是否一定改变?影子价格是否一定没有意义?一般来说,这是不能从敏感性分析报告中直接得到的。此时,应该重新用新数据求解规划模型,才能做出判断。所以严格来说,我们上面回答“原料最多增加10桶牛奶”并不是完全科学的。2 在LINGO中使用集合2.1 集合的基本用法和LINGO模型的基本要素理解LINGO建模语言最重要的是理解集合(set)及其属性(attribute)的概念。什么是集合呢?我们通过下面的一个简单例子开始进行介绍。例 2.1 SAILCO公司需要决定下四个季度的帆船生产量。下四个季度的帆船需求量分别是40条,60条,75条,25条,这些需求必须按时满足。每个季度正常的生产能力是40条帆船,每条船的生产费用为400美元。如果加班生产,每条船的生产费用为450美元。每个季度末,每条船的库存费用为20美元,假定生产提前期为0,初始库存为10条船。如何安排生产可使总费用最小?我们用DEM,RP,OP,INV分别表示需求量、正常生产的产量、加班生产的产量、库存量,则DEM,RP,OP,INV对每个季度都应该有一个对应的值,也就是说他们都应该是一个由4个元素组成的数组,其中DEM是已知的,而RP,OP,INV是未知数。现在我们可以写出这个问题的模型。首先,目标函数是所有费用的和: (2.1)约束条件主要有两个:(1) 能力限制RP(I)40,I=1,2,3,4 (2.2)(2) 产品数量的平衡方程INV(I)INV(I1)RP(I)OP(I)DEM(I) , (2.3)INV()10; (2.4)当然,还要加上变量的非负约束,构成了这个问题的模型(可用看出是LP模型)。如果利用数组的概念,这个模型是比较容易建立的。记4个季度组成集合QUARTERS=1,2,3,4,它们就是上面数组的下标集合,而数组DEM,RP,OP,INV对集合QUARTERS中的每个元素1,2,3,4分别对应于一个值。LINGO正是充分利用了这种数组及其下标的关系,引入了“集合”及其“属性”的概念,把QUARTERS=1,2,3,4称为集合,把DEM,RP,OP,INV称为该集合的属性(即定义在该集合上的属性)。表2.1清楚地列出了集合元素及其属性所确定的所有变量。表2.1 集合元素及集合的属性确定的所有变量集合QUARTERS的元素1234定义在集合QUARTERS上的属性DEMDEM(1)DEM(2)DEM(3)DEM(4)RPRP(1)RP(2)RP(3)RP(4)OPOP(1)OP(2)OP(3)OP(4)INVINV(1)INV(2)INV(3)INV(4)下面我们看看在LINGO中是如何定义集合及其属性的。例2的LP模型在LINGO中的一个典型输入方式见图2-1。我们可以看到这个输入以“MODEL:”开始,以“END”结束,它们之间由语句组成,可以分成三个部分:图2-1 例2.1的LINGO优化模型(1) 集合定义部分(从“SETS:”到“ENDSETS”):定义集合及其属性,语句“QUARTERS/1,2,3,4/:DEM,RP,OP,INV;”就是定义了上面所说的集合QUARTERS=1,2,3,4,以及对应于该集合的属性DEM,RP,OP,INV,其结果正是定义了表1所列出的16个变量名(并不一定都是决策变量,如下面马上就看到DEM对应的4个变量是已知的)。(2) 数据输入部分(从“DATA:”到“ENDDATA”):“DEM=40,60,75,25;”给出常量DEM(给定的需求量)的值,即DEM(1)=40,DEM(2)=60,DEM(3)=75,DEM(4)=25。(3) 其他部分:给出优化目标和约束。目标函数(“MIN=”后面所接的表达式)是用求和函数“SUM(集合(下标):关于集合的属性的表达式)”的方式定义的,这个函数的功能是对语句中的冒号“:”后面的表达式,按照冒号前面的集合指定的下标(元素)进行求和。本例中目标函数也可以等价地写成“SUM(QUARTERS(i): 400*RP(i)+450*OP(i)+20*INV(i)”,这里“SUM”相当于求和符号“”,而“QUARTERS(i)”相当于“iQUARTERS”的含义(请与目标函数的数学表达式(2.1)比较一下,你会发现它们几乎是一样的!)只是由于本例中目标函数对集合QUARTERS的所有元素(下标)都要求和,所以我们在图2-1的相应语句中可以将下标i省去。约束是用循环函数“FOR(集合(下标):关于集合的属性的约束关系式)”的方式定义的,意思是对冒号“:”前面的集合的每个元素(下标),冒号“:”后面的约束关系式都要成立。我们先看能力限制(2.2),即每个季度正常的生产能力是40条帆船,这正是语句“FOR(QUARTERS(I):RP(I)40);”的含义。由于对所有元素(下标I),约束的形式是一样的,所以也可以象上面定义目标函数时一样,将下标I省去,即这个语句可以简化成“FOR(QUARTERS:RP1;“#GT#”是逻辑运算符,意思是“大于(greater than的字首字母缩写)”。 现在运行菜单命令“LINGO|Solve (Ctrl+S)”,可以得到图2-2所示的解答报告,全局最优解RP=(40,40,40,25),OP=(0,10,35,0),最小成本=78450。下面小结一下LINGO模型最基本的组成要素。LINGO中建立的优化模型除了上面例子给出的三大部分语句外,还可以包括一个“初值设定(INIT)”部分;此外,从LINGO 9.0开始,还可以增加一个“计算(CALC)”部分。因此,一般来说,LINGO中建立的优化模型可以由5个部分组成,或称为5段(section):(1)集合段(SETS):这部分要以“SETS:”开始,以“ENDSETS”结束,作用在于定义必要的集合变量(SET)及其元素(member,含义类似于数组的下标)和属性(attribute,含义类似于数组)。如上例中用语句“QUARTERS/1,2,3,4/:DEM,RP,OP,INV;”定义集合QUARTERS=1,2,3,4,以及对应于该集合的属性DEM,RP,OP,INV(这些量的具体数值如果是常量,则可在数据段输入;如果是未知数,则可在初始段输入初值)。自然,当QUARTERS的元素数目不是4而是1000,可以如下定义QUARTERS集合: QUARTERS/1.1000/:DEM,RP,OP,INV;“1.1000”的意思就是从1到1000的所有整数。(2)目标与约束段:这部分实际上定义了目标函数、约束条件等,但这部分并没有段的开始和结束标记,因此实际上就是除其他4个段(都有明确的段标记)外的LINGO模型。(3)数据段(DATA):这部分要以“DATA:”开始,以“ENDDATA”结束,作用在于对集合的属性(数组)输入必要的常数数据。格式为: attribute(属性)=value_list(常数列表);常数列表(value_list)中数据之间可以用逗号“,”分开,也可以用空格分开(回车的作用也等价于一个空格)。在LINGO模型中,如果想在运行时才对参数赋值,可以在数据段使用输入语句。但这仅用于对单个变量赋值,而不能用于属性变量(数组),输入语句格式为:“变量名=?;”。 图2-2 例2.1的求解结果报告窗口(4)初始段(INIT):这部分要以“INIT:”开始,以“ENDINIT”结束,作用在于对集合的属性(数组)定义初值(因为求解算法一般都是迭代算法,所以用户如果能给出一个比较好的迭代初值,对提高算法的计算效率是有益的)。定义初值的格式为: attribute(属性)=value_list(常数列表);这与数据段中的用法是类似的。(5)计算段(CALC):这部分要以“CALC:”开始,以“ENDCALC”结束,作用在于对一些原始数据进行“预处理”(这种处理是在数据段的数据输入完成以后、LINGO开始正式求解模型之前进行的)。注意,在计算段中,语句是顺序执行的。此外,在计算段中只能直接使用赋值语句,而不能包含需要经过解方程或经过求解优化问题以后才能决定的变量。2.2 基本集合与派生集合例2.2 建筑工地的位置(用平面坐标a,b表示,距离单位:km)及水泥日用量d(单位:t)由表2.2给出。目前有两个临时料场位于P(5,1),Q(2,7),日储量各有20t。求从A,B两料场分别向各工地运送多少吨水泥,使总的吨公里数最小。两个新的料场应建在何处,节省的吨公里数有多大?优化模型记工地的位置为(ai,bi)水泥日用量为di,i=1,2,6;料场位置为(xj,yj),日储量为ej,j=1,2;从料场j向工地i的运送量为cij(非负)。表2.2 工地的位置(a,b)及水泥日用量的d123456a1.258.750.55.7537.25b1.250.754.7556.57.75d3547611这个优化问题的数学规划模型为s.t. 当使用现有的临时料场时,决策变量只有cij,所以这是个LP模型;当为新建料场选址时,决策变量为cij和xj,yj,由于目标函数f对xj,yj是非线性的,所以在新建料场时是NLP模型。我们先解NLP模型,而把现有临时料场的位置作为初始解告诉LINGO。我们前面说过,集合的属性相当于以集合的元素为下标的数组。显然可以定义需求点demand和供应点supply两个集合,分别有6个和2个元素(下标)。而这里的cij相当于二维数组,它的两个下标分别来自集合demand和supply,这就启发我们可以利用集合demand和supply,定义一个由二元数对组成的新的集合,然后将cij定义成这个新集合的属性。图2-3 例2.2的NLP优化模型具体的输入程序如图2-3所示。我们在集合段中定义了三个集合,其中demand和supply集合的属性的含义与上例2.1类似,而link则是在前两个集合的基础上定义的一个新集合。语句link(demand,supply):c;表示集合link中的元素就是集合demand和supply的元素组合成的有序二元组,从数学上看link就是demand和supply的笛卡儿积,也就是说link=(s,t)|sdemand,tsupply 因此,其属性c就是一个62的矩阵(或者说是含有12个元素的二维数组)。类似于demand和supply这种直接把元素列举出来的集合,称为基本集合(primary set,也可译为“原始集合”),而把link这种基于其他集合而派生出来的二维或多维集合称为派生集合(derived set,也可译为“导出集合”),由于是demand和supply生成了派生集合link,所以demand和supply称为link的父集合。本模型中还包括了初始段,请特别注意其中“x,y=5,1,2,7;”语句的实际赋值顺序是x=(5,2),y=(1,7),而不是x=(5,1),y=(2,7)。也就是说,LINGO对数据是按列赋值,而不是按行。当然,直接写成两个语句“x=5,2;y=1,7;”也是等价的。同样道理,a,b的赋值语句也可以写成a,b= 1.25,1.25,8.75, 0.75,0.5,4.75,5.75,5,3,6.5,7.25,7.75;这时,分割数据的空格与逗号“,”或“回车”的作用是等价的。程序接下来定义目标函数和约束。由于新建料场的位置理论上讲可以是任意的,所以我们在约束的最后(模型的“END”语句上面的一行)用free函数取消了变量x,y的非负限制。此外,对目标行(OBJ)和两类约束(DEMAND_CON和SUPPLY_CON)分别命名了行号(通过“LINGO|Generate|Display Model (Ctrl+G)”命令可以查看约束的行号)。运行菜单命令“LINGO|Solve (Ctrl+S)”,很快得到求解报告:局部最优解是X(1)= 5.695945,X(2)=7.250000,Y(1)=4.928613,Y( 2)=7.750000,c(略)。最小运量= 89.88347(tkm)。要验证这个问题的NLP模型的最小运量89.88347是不是全局最优,可以考虑用全局最优求解器验证(如果你使用的是试用版软件,则可能不能用全局求解器求解本例,因为问题的规模已经太大了)。激活全局最优求解程序的方法是用“LINGO|Options”菜单命令打开选项对话框,在“Global Solver”选项卡上选择“Use Global Solver”。运行NLP模型,发现全局最优求解程序花费的时间相当长。如果要把料场P(5,1),Q(2,7)的位置看成是已知并且固定的,这时是LP模型,只需要把图2-3中初始段的语句“x,y=5,1,2,7;”移到数据段就可以了。此时求得全局最优解为136.2275(tkm)(c的取值略)。2.3 稠密集合与稀疏集合例2.2中,我们把派生集合link的元素定义为demand和supply的笛卡儿积,即包含了两个基本集合构成的所有二元有序对。这种派生集合称为稠密集合(简称稠集)。其实,在LINGO中,派生集合的元素可以定义为只是这个笛卡儿积的一个真子集合,这种派生集合称为稀疏集合(简称疏集)。表.3 二维数组a学生S1S2S3S4S5S1S2S3S4S5例如,在LINGO中可以用稀疏集合把表2.3中的数组a表示出来:SETS: STUDENTS /S1.S5/; PAIRS( STUDENTS, STUDENTS) | &2 #GT# &1: a; ENDSETSDATA: a = 8 5 7 0 1 9 5 11 3 4 ENDDATA其中STUDENTS集合的元素列表“S1.S5”等价于写成“S1 S2 S3 S4 S5”,它没有相关的属性列表,只用于表示一个下标集合。我们应该特别注意,在派生集合PAIRS的定义中,增加了过滤条件,即逻辑关系式“&2 #GT# &1”,意思是第2个父集合的元素的索引值(用“&2”表示)大于第1个父集合的元素的索引值(用“&1”表示)。这样,PAIRS中的元素就正好对应于上面表2.3中的严格上三角部分的二维下标(共10个元素)。a是这个集合的属性,在数据段中按照列的顺序对属性a的元素进行赋值。在LINGO中,除了可以用“元素过滤”法定义稀疏集合外,还可以用枚举的方式来定义。例如,上例中的语句“PAIRS( STUDENTS, STUDENTS) | &2 #GT# &1: a;”等价于:PAIRS( STUDENTS, STUDENTS) /S1,S2 S1,S3 S1,S4 S1,S5S2,S3 S2,S4 S2,S5S3,S4 S3,S5 S4,S5/: a;2.4 集合的使用小结下面把前面介绍的关于集合的不同类型及其关系小结一下,表示在图2-4中。基本集合的定义格式为(以下语法中凡是在方括号“”中的内容,表示是可选的项,即该项可以有也可以没有):setname /member_list/ : attribute_list;其中setname为定义的集合名,member_list为元素列表,attribute_list为属性列表。元素列表可以采用显式列举法(即直接将所有元素全部列出,元素之间用逗号或空格分开),也可以采用隐式列举法。隐式列举法可以有几种不同格式(请自行查阅LINGO帮助手册的“Using sets”帮助主题)。集合派生集合基本集合稀疏集合稠密集合元素列表法元素过滤法直接列举法隐式列举法图2-4 集合的不同类型及其关系派生集合的一般定义格式为:setname (parent_set_list) /member_list/ : attribute_list;其中与基本集合的定义相比较只是多了一个parent_set_list(父集合列表)。父集合列表中的集合称为派生集合setname的父集合,它们本身也可以是派生集合。当元素列表(member_list)不在集合定义中出现时,还可以在程序的数据段以赋值语句的方式给出元素列表;若在程序的数据段也不以赋值语句的方式给出元素列表,则认为定义的是稠密集合,即父集合中所有元素的有序组合(笛卡儿积)都是setname的元素。当元素列表在集合定义中出现时,又有“元素列表法”(直接列出元素)和“元素过滤法”(利用过滤条件)两种不同方式。3 运算符和函数LINGO中有三类运算符:算术运算符、逻辑运算符和关系运算符。它们的优先级如下所示(同一优先级按从左到右的顺序执行;如果有括号“()”,则括号内的表达式优先进行计算):优先级运算符Highest#NOT# - (negation) * / + - #EQ# #NE# #GT# #GE# #LT# #LE# #AND# #OR#Lowest=(=()LINGO中还提供了大量的内部函数帮助我们求解优化模型,这些函数以符号“”打头。关于LINGO的运算符和函数的详细内容,请自行参阅LINGO帮助手册中的“LINGOs Operators and Functions”帮助主题。注意:LINGO 9.0与之前的版本相比,增加了很多新的内部函数。使用这些新函数的优化模型在LINGO 9.0之前的各种版本中无法执行。我们可以使用下拉菜单“Edit | Paste Function”在LINGO的模型窗口下直接输入所需的各种内部函数。此外,可先点击工具栏上的图标,再点击“Edit | Paste Function”下你所感兴趣的函数,屏幕上将弹出该函数功能的帮助信息。4 LINGO软件与外部文件的接口4.1 通过Windows剪贴板传递数据通过Windows剪贴板传递数据是Windows应用程序之间传递数据的一种最简单的方式,不过这种方式传递数据实际上是通过人工干预进行的,严格来说算不上通过文件传递数据。LINGO软件的两个菜单命令“Edit|Paste (Ctrl+V)”和“Edit|Paste Special (Ctrl+V)”,都是将Windows剪贴板中的内容粘贴到LINGO模型的当前光标处,不同之处在于:(1) “Edit|Paste (Ctrl+V)”是通常的粘贴命令,它一般仅用于剪贴板中的内容是文本(包括多信息文本,即RTF格式的文本)的情形。(2) “Edit|Paste Special (Ctrl+V)”是特殊粘贴命令,可以用于剪贴板中的内容不是文本的情形,如可以嵌入(插入)其他应用程序中生成的对象(object)或对象的链接(link)。如果希望直接将某个文件的全部内容完整地作为一个对象“嵌入”或“链接”到LINGO模型中,可以不通过Windows剪贴板,而是直接使用LINGO软件的“Edit|Insert New Objects”命令。4.2 通过文本文件传递数据在LINGO软件中,通过文本文件输入数据使用的是FILE函数,输出结果采用的是TEXT,下面介绍这两个函数的详细用法。(1)FILE函数通常可以在集合段和数据段使用,但不允许嵌套使用。这个函数的一般用法是:FILE (filename);当模型引用其他ASCII码文件中的数据或文本时可以采用该语句,其中filename为存放数据的文件名(可以包含完整的路径名,没有指定路径时表示在当前目录下寻找这个文件),该文件中记录之间必须用“”分开。(2)TEXT函数通常只在数据段使用。这个函数的一般用法是:TEXT( filename )它用于数据段中将解答结果送到文件filename中,当省略filename时,结果送到标准的输出设备(通常就是屏幕)。filename中可以包含完整的路径名,没有指定路径时表示在当前目录下生成这个文件(如果这个文件已经存在,将会被覆盖)。例4.1 假设存放数据的文本文件myfile.txt的内容如下: a,b,c,d var1,var2,x 1 2 3 4 5,6,7,8在LINGO模型窗口中建立如下LINGO模型(存放在文件exam0401.lg4中):model:sets: myset/ FILE( myfile.txt)/: FILE( myfile.txt);endsetsdata: var1=FILE( myfile.txt); var2=FILE( myfile.txt); x=100,200,300,400; TEXT( output.txt)=var1,var2; TEXT( output.txt)=x;enddata end运行结果如图4-1所示,而output.txt文件的内容见图4-2。上述模型主要是用来说明FILE函数和TEXT函数的功能,为了简单起见,没有给出目标函数。图4-1 例4.1的求解报告窗图4-1 output.txt文件的内容4.3 通过Excel电子表格文件传递数据通常使用OLE函数在Excel文件与LINGO模型之间传递数据。与FILE函数一样,该函数只能在LINGO模型的集合段、数据段和初始段使用。无论用于输入或输出数据,这个函数的使用格式都是:OLE( xlsFile, range1, ., rangen)其中xlsFile是电子表格文件的名称,应当包括扩展名(如 *.xls),还可以包含完整的路径名,只要字符数不超过64均可;range列表是指文件中包含数据的单元范围(单元范围的格式与Excel中工作表的单元范围格式一致)。具体来说,当从Excel文件中向LINGO模型中输入数据时,在集合段可以直接采用“OLE(.)”的形式,但在数据段和初始段应当采用“属性(或变量)=OLE(.)”的赋值形式;当从LINGO向Excel中输出数据时,应当采用“OLE(.)=属性(或变量)”的赋值形式(自然,输出语句
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 关爱老人具体活动策划方案
- 服务型公司营销管理方案
- 药品安全宣传培训情况课件
- 薪酬改革方案咨询
- 管理咨询工资方案
- 吴忠聚脲地坪施工方案
- 初二政治考试题目及答案
- 摩登建筑婚礼策划方案设计
- 胃镜室护理工作制度
- 宠物店营销方案海报创意
- 机械厂设备使用维护细则
- 国企人力资源岗笔试模拟试题及参考答案
- 遵守规则课件-2025-2026学年统编版道德与法治八年级上册
- 全科医学(副高)高级职称考试题库及答案
- 康复辅助技术咨询师理论知识考核试卷及答案
- 实验室室内质控年度总结
- 房地产精装修工程质量管控措施
- GB/T 46004-2025动物油脂牛油
- 2025年高考【数学】真题及答案(新高考Ⅱ卷)
- 2025至2030年中国花岗岩制品行业市场发展现状及投资策略咨询报告
- 小学生海姆立克急救法
评论
0/150
提交评论