用Lingo软件编程求解规划问题.ppt

上传人:laozhun 文档编号:2551125 上传时间:2023-02-20 格式:PPT 页数:77 大小:3.36MB
返回 下载 相关 举报
用Lingo软件编程求解规划问题.ppt_第1页
第1页 / 共77页
用Lingo软件编程求解规划问题.ppt_第2页
第2页 / 共77页
用Lingo软件编程求解规划问题.ppt_第3页
第3页 / 共77页
用Lingo软件编程求解规划问题.ppt_第4页
第4页 / 共77页
用Lingo软件编程求解规划问题.ppt_第5页
第5页 / 共77页
点击查看更多>>
资源描述

《用Lingo软件编程求解规划问题.ppt》由会员分享,可在线阅读,更多相关《用Lingo软件编程求解规划问题.ppt(77页珍藏版)》请在三一办公上搜索。

1、用Lingo软件编程求解规划问题,什么是规划问题?,求目标函数在约束条件下的最大值或最小值的问题,统称为规划问题。决策变量、约束条件、目标函数是线性规划的三要素.主要解决最优生产计划、最优分配、最优设计、最优决策、最佳管理等最优化问题。,线性规划非线性规划实数规划整数规划0-1规划,例1加工奶制品的生产计划,50桶牛奶,时间480小时,至多加工100公斤A1,每天:,一奶制品加工厂用牛奶生产 A1,A2两种奶制品,1 桶牛奶可以在甲车间用12 小时加工成 3 公斤 A1,或者在乙车间用 8 小时加工成 4 公斤 A2。根据市场需求,生产的 A1,A2全部能售出,且每公斤 A1获利 24 元,每

2、公斤 A2获利 16 元。现在加工厂每天能得到 50 桶牛奶的供应,每天正式工人总的劳动时间 480 小时,并且甲车间每天至多能加工 100 公斤 A1,乙车间的加工能力没有限制。试为该厂制订一个生产计划,使每天获利最大.,并进一步讨论以下3个附加问题:1)若用35元可以买到1桶牛奶,应否作这项投资?若投资,每天最多购买多少桶牛奶?2)若可以聘用临时工人以增加劳动时间,付给临时工人的工资最多是每小时几元?3)由于市场需求变化,每公斤A1的获利增加到30元,应否改变生产计划?,例1加工奶制品的生产计划,50桶牛奶,时间480小时,至多加工100公斤A1,每天:,x1桶牛奶生产A1,x2桶牛奶生产

3、A2,获利 243x1,获利 164 x2,原料供应,劳动时间,加工能力,决策变量,目标函数,每天获利,约束条件,非负约束,线性规划模型(LP),例1加工奶制品的生产计划,求 的最大值?,求 的最大值?,用Lingo软件求解,Lingo结果中其它项的意思!更多信息,例1加工奶制品的生产计划,max=sin(x)*2*exp(-x);x0;,max=sin(x)*2*exp(-x);bnd(0,x,8);,Lingo软件,LINGO Help:LINGO is a simple tool for utilizing the power of linear and nonlinear optimi

4、zation to formulate large problems concisely,solve them,and analyze the solution.Optimization helps you find the answer that yields the best result;attains the highest profit,output,or happiness;or the one that achieves the lowest cost,waste,or discomfort.Often these problems involve making the most

5、 efficient use of your resourcesincluding money,time,machinery,staff,inventory,and more.,Lingo 是一个可以简洁地阐述、解决和分析复杂问题的简便工具。其特点是程序执行速度很快,易于输入、修改、求解和分析一个数学规划问题。,lingo软件擅长于解决运筹问题,即最有问题,常见的是线性规划。而matlab则功能比较多,主要是以矩阵为基础的运算,也能解决运筹问题。matlab 的功能更强大一些,也比较难学,东西多lingo主要用于优化问题,matlab功能强大,几乎什么都能做,但是碰到循环时速度较慢,而且对机器

6、要求较高,lingo主要用以解线性规划,方程之类,使用比matlab简单,解决线性问题速度也不错,有些东西不能做。不过现在国外有将2者结合的。matlab都能解,就是麻烦点LINGO是使建立和求解线性、非线性和整数最佳化模型更快更简单更有效率的综合工具。LINGO提供强大的语言和快速的求解引擎来阐述和求解最佳化模型。,原则上还是lingo要快,特别是变量较多的时候,但是这里面不能比较非线性规划,因为非线性规划的求解速度不仅取决于问题的规模,还要看非线性程度以及初始.简单的模型表示LINGO可以将线性、非线性和整数问题迅速得予以公式表示,并且容易阅读、了解和修改。方便的数据输入和输出选择LING

7、O建立的模型可以直接从数据库或工作表获取资料。同样地,LINGO可以将求解结果直接输出到数据库或工作表。强大的求解引擎LINGO内建的求解引擎有线性、非线性(convex and nonconvex)、二次、二次限制和整数最佳化。Model Interactively or Create Turn-key ApplicationsLINGO提供完全互动的环境供您建立、求解和分析模型。LINGO也提供DLL和OLE界面可供使用者由撰写的程序中呼叫。,0 Global Optimum(全局最优)1 Infeasible(不可行)2 Unbounded(无界)3 Undetermined(不确定)4

8、 Feasible(可行)5 Infeasible or Unbounded(通常需要关闭“预处理”选项后重新求解模型,以确定模型究竟是不可行还是无界)6 Local Optimum(局部最优)7 Locally Infeasible(局部不可行,尽管可行解可能存在,但是LINGO并没有找到一个)8 Cutoff(目标函数的截断值被达到)9 Numeric Error(求解器因在某约束中遇到无定义的算术运算而停止),GIN(X):限制X为整数BIN(X):限定变量X为0 或 1。FREE(X):取消对x的符号限制(即可取任意实数包括负数)BND(L,X,U):限制 L=X=U,LP:线性规划

9、linear programming QP 二次规划 NLPNONLINEAR PROGRAMMINGILP 线性整数 IQP 二次整数PILP 线性纯整数PIQP 二次纯整数NLP 非线性 NLPNONLINEAR PROGRAMMINGINLP 整数非线性PINLP 纯整数非线性,例2军队供给问题,军队有某种先进武器302台分别放在6个补给站(depot)中,现由于战争需要,8个军团(corps)分别需要此种武器数目如表中所示,并且给出了从各补给站送一台武器到任一军团的费用,问如何运输可使成本最小?,number(i,j)n(i,j),例2军队供给问题,例2军队供给问题,用Lingo软件求

10、解,结果,Lingo软件,集合段(SETS ENDSETS)目标与约束段 数据段(DATA ENDDATA)初始段(INIT ENDINIT),LINGO模型的构成:4个段,Lingo 是一个可以简洁地阐述、解决和分析复杂问题的简便工具。其特点是程序执行速度很快,易于输入、修改、求解和分析一个数学规划问题。,Lingo软件集合,概念 集是相联系的对象的集合,比如工厂、消费者群体、交通工具和雇工等等;集是 LINGO 建模语言的基础,是程序设计最强有力的基本构件目标与约束段;借助于集,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型;集有成员和属性

11、。,集部分是LINGO模型的一个可选部分。在LINGO模型中使用集之前,必须在集部分事先定义。集部分以关键字“sets:”开始,以“endsets”结束。一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须定义了它们。,Lingo软件基本集合元素的列举,setname/member_list/:attribute_list;,sets:students/John Jill,Rose Mike/:sex,age;endsets,一个原始集是由一些最基本的对象组成的。,集、集成员和集属性,集成员无论用何种字符

12、标记,它的索引都是从1开始连续计数。在attribute_ list可以指定一个或多个集成员的属性,属性之间必须用逗号隔开。,定义一个原始集,用下面的语法:setname/member_list/:attribute_list;注意:用“”表示该部分内容可选。下同,不再赘述。Setname是你选择的来标记集的名字,最好具有较强的可读性。集名字必须严格符合标准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母(AZ)、下划线、阿拉伯数字(0,1,9)组成的总长度不超过32个字符的字符串,且不区分大小写。注意:该命名规则同样适用于集成员名和属性名等的命名。,Member_list是集成员列

13、表。采取显式罗列和隐式罗列两种方式。,当显式罗列成员时,必须为每个成员输入一个不同的名字,中间用空格或逗号搁开,允许混合使用。例2.1 可以定义一个名为students的原始集,它具有成员John、Jill、Rose和Mike,属性有sex和age:sets:students/John Jill,Rose Mike/:sex,age;endsets 当隐式罗列成员时,不必罗列出每个集成员。可采用如下语法:setname/member1.memberN/:attribute_list;这里的member1是集的第一个成员名,memberN是集的最末一个成员名。LINGO将自动产生中间的所有成员名

14、。,Lingo软件基本集合元素的隐式列举,集成员不放在集定义中,而在随后的数据部分来定义。,sets:students:sex,age;endsets data:students,sex,age=John 1 16 Jill 0 14 Rose 0 17 Mike 1 13;enddata,注意:开头用感叹号(!),末尾用分号(;)表示注释,可跨多行。,Lingo软件派生集,setname(parent_set_list)/member_list/:attribute_list;,一个派生集是用一个或多个其它集来定义的。也就是说,它的成员来自于其它已存在的集。,稠密集:派生集成员由父集成员所有

15、组合构成;稀疏集:其成员为父集成员所有组合构成的集合的一个子集。,显式:links(depot,corps)/d1 c2,d2 c3,d3 c6,d4 c3,d5 c1,d6 c8/:cost,number;过滤:links(depot,corps)|capacity(,派生集的成员列表有两种方式生成:显式罗列;设置成员资格过滤器。,sets:product/A B/;machine/M N/;week/1.2/;allowed(product,machine,week):x;endsetsLINGO生成了三个父集的所有组合共八组作为allowed集的成员。列表如下:编号 成员1(A,M,1)

16、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),例sets:!学生集:性别属性sex,1表示男性,0表示女性;年龄属性age.;students/John,Jill,Rose,Mike/:sex,age;!男学生和女学生的联系集:友好程度属性friend,0,1之间的数。;linkmf(students,students)|sex(enddata用竖线(|)来标记一个成员资格过滤器的开始。#eq#是逻辑运算符,用来判断是否“相等”,可参考4.&1可看作派生集的第1个原始父集的索引,它取遍该原始父集的所有成员;&2可看作派生集的第

17、2 个原始父集的索引,它取遍该原始父集的所有成员;&3,&4,以此类推。,集合 派生集合 基本集合 稀疏集合 稠密集合 元素列表法 元素过滤法 直接列举法 隐式列举法,Lingo软件集合,setname/member_list/:attribute_list;,setname(parent_set_list)/member_list/:attribute_list;,Lingo软件数据段与初始段,数据段:输入集成员和数据,提供了模型相对静止部分和数据分离的可能性。object_list=value_list;对象列数值列;,初始段:为决策变量设置初始值。,在初始部分输入的值仅被 LINGO 求

18、解器当作初始点来用,并且仅仅对非线性模型有用。和数据部分指定变量的值不同,LINGO求解器可以自由改变初始部分初始化的变量的值。以“init:”开始,以“endinit”结束。初始部分的初始声明规则和数据部分的数据声明规则相同。,sets:set1/A,B,C/:X,Y;endsetsdata:X,Y=1 4 2 5 3 6;enddata,data:X=1,2,3;Y=4,5,6;enddata,data:interest_rate=.085;enddatadata:interest_rate,inf=.085.03;enddata,实时数据处理:data:interest_rate,inf

19、=.085?;enddata,指定属性为一个值:sets:days/MO,TU,WE,TH,FR,SA,SU/:needs;endsetsdata:needs=20;enddata,和数据部分指定变量的值不同,LINGO求解器可以自由改变初始部分初始化的变量的值。,例init:X,Y=0,.1;endinitY=log(X);X2+Y2=1;,三类运算符:算术运算符 逻辑运算符 关系运算符,Lingo软件运算符与优先级,#not#否定该操作数的逻辑值,not是一个一元运算符#eq#若两个运算数相等,则为true;否则为flase#ne#若两个运算符不相等,则为true;否则为flase#gt#

20、若左边的运算符严格大于右边的运算符,则为true;否则为flase#ge#若左边的运算符大于或等于右边的运算符,则为true;否则为flase#lt#若左边的运算符严格小于右边的运算符,则为true;否则为flase#le#若左边的运算符小于或等于右边的运算符,则为true;否则为flase#and#仅当两个参数都为true时,结果为true;否则为flase#or#仅当两个参数都为false时,结果为false;否则为true,Lingo软件函数,数学函数,Lingo软件函数,变量定界函数,min和max返回指定的集成员的一个表达式的最小值或最大值。,qrand(seed)产生服从(0,1)

21、区间的拟随机数。qrand只允许在模型的数据部分使用,它将用拟随机数填满集属性。通常,声明一个mn的二维表,m表示运行实验的次数,n表示每次实验所需的随机数的个数。在行内,随机数是独立分布的;在行间,随机数是非常均匀的。这些随机数是用“分层取样”的方法产生的。例4.5 model:data:M=4;N=2;seed=1234567;enddatasets:rows/1.M/;cols/1.N/;table(rows,cols):x;endsetsdata:X=qrand(seed);enddataend如果没有为函数指定种子,那么LINGO将用系统时间构造种子。,data:N=6;enddat

22、asets:number/1.N/:x;endsetsdata:x=5 1 3 4 6 10;enddata minv=min(number(I)|I#le#5:x);end,输入和输出函数,1file函数 该函数用从外部文件中输入数据,可以放在模型中任何地方。该函数的语法格式为file(filename)。这里filename是文件名,可以采用相对路径和绝对路径两种表示方式。,例 以例1.2来讲解file函数的用法。注意到在例1.2的编码中有两处涉及到数据。第一个地方是集部分的6个warehouses集成员和8个vendors集成员;第二个地方是数据部分的capacity,demand和co

23、st数据。为了使数据和我们的模型完全分开,我们把它们移到外部的文本文件中。修改模型代码以便于用file函数把数据从文本文件中拖到模型中来。修改后(修改处代码黑体加粗)的模型代码如下:model:!6发点8收点运输问题;sets:warehouses/file(1_2.txt)/:capacity;vendors/file(1_2.txt)/:demand;links(warehouses,vendors):cost,volume;endsets!目标函数;min=sum(links:cost*volume);!需求约束;for(vendors(J):sum(warehouses(I):volu

24、me(I,J)=demand(J);!产量约束;for(warehouses(I):sum(vendors(J):volume(I,J)=capacity(I);!这里是数据;data:capacity=file(1_2.txt);demand=file(1_2.txt);cost=file(1_2.txt);enddataend,模型的所有数据来自于1_2.txt文件。其内容如下:!warehouses成员;WH1 WH2 WH3 WH4 WH5 WH6!vendors成员;V1 V2 V3 V4 V5 V6 V7 V8!产量;60 55 51 43 41 52!销量;35 37 22 32

25、 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,把记录结束标记()之间的数据文件部分称为记录。如果数据文件中没有记录结束标记,那么整个文件被看作单个记录。,2 text函数该函数被用在数据部分用来把解输出至文本文件中。它可以输出集成员和集属性值。其语法为text(filename)这里filename是文件名,可以采用相对路径和绝对路径两种表示方式。如果忽略filename,那么数据就被输出到标准输出设备(大多数情形都

26、是屏幕)。text函数仅能出现在模型数据部分的一条语句的左边,右边是集名(用来输出该集的所有成员名)或集属性名(用来输出该集属性的值)。我们把用接口函数产生输出的数据声明称为输出操作。输出操作仅当求解器求解完模型后才执行,执行次序取决于其在模型中出现的先后。,例 借用例4.12,说明text的用法。model:sets:days/mon.sun/:required,start;endsetsdata:!每天所需的最少职员数;required=20 16 13 16 19 14 12;text(d:out.txt)=days 至少需要的职员数为 start;enddata!最小化每周所需职员数;

27、min=sum(days:start);for(days(J):sum(days(I)|I#le#5:start(wrap(J+I+2,7)=required(J);end,例 Lingo与Excel的连接,3、ole函数 是从 EXCEL 中引入或输出数据的接口函数,它是基于传输的 OLE 技术。OLE传输直接在内存中传输数据,并不借助于中间文件。,例3Lingo与Excel的连接,OLE 可以同时读集成员和集属性(读写),OLE 只能读一维或二维的 Ranges,绝对路径 ole(data.xls);相对路径 ole(D:data.xls);,例题,C,x为下三角矩阵,例8,MODEL:S

28、ETS:QUART/1.4/:p,d;LINK(QUART,QUART)|end,d,s为下三角矩阵 N=10,例9,MODEL:SETS:city/1.10/;link(city,city)|,求 的最大值?,用Lingo软件求解,Lingo结果中其它项的意思!更多信息,例1加工奶制品的生产计划,Global optimal solution found at iteration:3 Objective value:280.0000 Variable Value Reduced Cost DESKS 2.000000 0.000000 TABLES 0.000000 5.000000 CHA

29、IRS 8.000000 0.000000 Row Slack or Surplus Dual Price 1 280.0000 1.000000 2 24.00000 0.000000 3 0.000000 10.00000 4 0.000000 10.00000 5 5.000000 0.000000,“Reduced Cost”列出最优单纯形表中判别数所在行的变量的系数,表示当变量有微小变动时,目标函数的变化率。其中基变量的reduced cost值应为0,对于非基变量 Xj,相应的 reduced cost值表示当某个变量Xj 增加一个单位时目标函数减少的量(max型问题)。本例中:变

30、量tables对应的reduced cost值为5,表示当非基变量tables的值从0变为 1时(此时假定其他非基变量保持不变,但为了满足约束条件,基变量显然会发生变化),最优的目标函数值=280-5=275。,“Value”给出最优解中各变量的值:造2个书桌(desks),0个餐桌(tables),8个椅子(chairs)。所以desks、chairs是基变量(非0),tables是非基变量(0)。,灵敏度的分析,灵敏度分析的结果是Ranges in which the basis is unchanged:Objective Coefficient Ranges Current Allow

31、able Allowable Variable Coefficient Increase Decrease DESKS 60.00000 20.00000 4.000000 TABLES 30.00000 5.000000 INFINITY CHAIRS 20.00000 2.500000 5.000000 Righthand Side Ranges Row Current Allowable Allowable RHS Increase Decrease 2 48.00000 INFINITY 24.00000 3 20.00000 4.000000 4.000000 4 8.000000

32、2.000000 1.333333 5 5.000000 INFINITY 5.000000,(56,80),(,35),48-24,48+=24,,文件菜单(File Menu)1 新建(New)从文件菜单中选用“新建”命令、单击“新建”按钮或直接按F2键可以创建一个新的“Model”窗口。在这个新的“Model”窗口中能够输入所要求解的模型。2 打开(Open)从文件菜单中选用“打开”命令、单击“打开”按钮或直接按F3键可以打开一个已经存在的文本文件。这个文件可能是一个Model文件。3 保存(Save)从文件菜单中选用“保存”命令、单击“保存”按钮或直接按F4键用来保存当前活动窗口(最前

33、台的窗口)中的模型结果、命令序列等保存为文件。4 另存为(Save As)从文件菜单中选用“另存为”命令或按F5键可以将当前活动窗口中的内容保存为文本文件,其文件名为你在“另存为”对话框中输入的文件名。利用这种方法你可以将任何窗口的内容如模型、求解结果或命令保存为文件。5 关闭(Close)在文件菜单中选用“关闭”(Close)命令或按F6键将关闭当前活动窗口。如果这个窗口是新建窗口或已经改变了当前文件的内容,LINGO系统将会提示是否想要保存改变后的内容。6 打印(Print)在文件菜单中选用“打印”(Print)命令、单击“打印”按钮或直接按F7键可以将当前活动窗口中的内容发送到打印机。7

34、 打印设置(Print Setup)在文件菜单中选用“打印设置”命令或直接按F8键可以将文件输出到指定的打印机。8 打印预览(Print Preview)在文件菜单中选用“打印预览”命令或直接按Shift+F8键可以进行打印预览。12退出(Exit)从文件菜单中选用“Exit”命令或直接按F10键可以退出LINGO系统。,例7.7 分配问题(指派问题,Assignment Problem)这是个给n个人分配n项工作以获得某个最高总效果的问题。第i个人完成第j项工作需要平均时间。要求给每个人分配一项工作,并要求分配完这些工作,以使完成全部任务的总时间为最小。该问题可表示如下:,如果把婚姻看作分配

35、问题,丹茨证明,整数性质证明一夫一妻会带来最美满幸福的生活!显然,分配问题可以作为线性规划问题来求解,尽管模型可能很大。例如,给100人分配100项工作将使所得的模型具有10000个变量。这时,如采用专门算法效果会更好。时间复杂度为的匈牙利算法便是好选择,这是由Kuhu(1955)提出的。,model:!7个工人,7个工作的分配问题;sets:workers/w1.w7/;jobs/j1.j7/;links(workers,jobs):cost,volume;endsets!目标函数;min=sum(links:cost*volume);!每个工人只能有一份工作;for(workers(I):sum(jobs(J):volume(I,J)=1;);!每份工作只能有一个工人;for(jobs(J):sum(workers(I):volume(I,J)=1;);,data:cost=6 2 6 7 4 2 5 4 9 5 3 8 5 8 5 2 1 9 7 4 3 7 6 7 3 9 2 7 2 3 9 5 7 2 6 5 5 2 2 8 11 4 9 2 3 12 4 5 10;enddataend,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号