lingo初级入门手册.ppt

上传人:小飞机 文档编号:6511096 上传时间:2023-11-08 格式:PPT 页数:127 大小:3.38MB
返回 下载 相关 举报
lingo初级入门手册.ppt_第1页
第1页 / 共127页
lingo初级入门手册.ppt_第2页
第2页 / 共127页
lingo初级入门手册.ppt_第3页
第3页 / 共127页
lingo初级入门手册.ppt_第4页
第4页 / 共127页
lingo初级入门手册.ppt_第5页
第5页 / 共127页
点击查看更多>>
资源描述

《lingo初级入门手册.ppt》由会员分享,可在线阅读,更多相关《lingo初级入门手册.ppt(127页珍藏版)》请在三一办公上搜索。

1、LINGO软件使用,LINGO是美国LINDO系统公司开发的一套专门用于求解最优化问题的软件它为求解最优化问题提供了一个平台,主要用于求解线性规划、非线性规划、整数规划、二次规划、线性及非线性方程组等问题它是最优化问题的一种建模语言,包含有许多常用的函数供使用者编写程序时调用,并提供了与其他数据文件的接口,易于方便地输入,求解和分析大规模最优化问题,且执行速度快由于它的功能较强,所以在教学、科研、工业、商业、服务等许多领域得到了广泛的应用,目录,3.1 LINGO操作界面简介3.2 LINGO模型的基本特征3.3 LINGO的运算符和函数3.4 LINGO软件求解案例,LINGO操作界面简介,

2、图1.1中最外层的窗口是LINGO软件的主窗口(LINGO软件的用户界面),所有其他窗口都在这个窗口之内主窗口有:标题栏、菜单栏、工具栏和状态栏目前,状态栏最左边显示的是“Ready”,表示准备就绪,右下角显示的是当前时间,时间前面是当前光标的位置“Ln 1,Col 1”(即1行1列)将来用户可以用选项命令(LINGO|Options|Interface菜单命令)决定是否需要显示工具栏和状态栏,在Windows操作系统下启动LINGO软件,屏幕上首先显示如图1.1所示的窗口.,图1.1,LINGO有5个主菜单:,File(文件)Edit(编辑)LINGO(LINGO系统)Windows(窗口)

3、Help(帮助),这些菜单的用法与Windows下其他应用程序的标准用法类似,下面只对主菜单中LINGO系统的主要命令进行简要介绍,LINGO系统(LINGO)的主菜单,LINGO|Solve(Ctrl-S)LINGO|Solve(Ctrl-S)(求解)命令对当前模型进行编译并求解如果当前模型输入有错误,编译时将报告错误求解时会显示一个求解器运行状态窗口 LINGO|Solution(Ctrl-O)LINGO|Solution(Ctrl-O)(解答)命令显示当前解 LINGO|Range(Ctrl-R)LINGO|Range(Ctrl-R)(灵敏度分析)命令显示当前解的灵敏度分析结果(你必须在

4、此之前求解过当前模型),LINGO|Options(Ctrl-I)LINGO|Options(Ctrl-I)(选项)命令将打开一个含有7个选项卡的对话框窗口,你可以通过它修改LINGO系统的各种控制参数和选项修改完以后,你如果单击“应用”按钮,则新的设置马上生效;如果单击“OK”按钮,则新的设置马上生效,并且同时关闭该窗口;如果单击“Save”按钮,则将当前设置变为默认设置,下次启动LINGO时这些设置仍然有效;如果单击“Default”按钮,则恢复LINGO系统定义的原始默认设置;如果单击“Cancel”按钮将废弃本次操作,退出对话框;单击“Help”按钮将显示本对话框的帮助信息LINGO|

5、Generate和LINGO|Picture LINGO|Generate和LINGO|Picture命令都是在模型窗口下才能使用,他们的功能是按照LINGO模型的完整形式分别以代数表达式形式和矩阵图形形式显示目标函数和约束,LINGO|Debug(Ctrl+D)LINGO|Debug(Ctrl+D)命令分析线性规划无解或无界的原因,建议如何修改.LINGO|Model Statistics(Ctrl+E)LINGO|Model Statistics(Ctrl+E)命令显示当前模型的统计信息LINGO|Look(Ctrl+L)LINGO|Look(Ctrl+L)命令显示当前模型的文本形式,显示

6、时对所有行按顺序编号,图1.2给出了工具栏的简要功能说明,当前光标所在的窗口(窗口标题栏上标有“LINGO Model-LINGO1”),就是模型窗口(model windows),也就是用于输入LINGO优化模型(即LINGO程序)的窗口,LINGO模型的基本特征,LINGO模型(程序)从LINGO模型窗口输入,它以语句“MODEL:”开始,以语句“END”结束它是由一系列语句组成,每个语句都是以分号“;”结束,语句是组成LINGO模型的基本单位每行可以写多个语句,为了保持模型的可读性,最好一行只写一个语句,并且按照语句之间的嵌套关系对语句安排适当的缩进,增强层次感以感叹号“!”开始的语句是

7、注释语句(注释语句也需要以分号“;”结束),LINGO模型(程序)一般由5个部分(或称5段)组成:,(1)集合段(SETS)(2)数据段(DATA)(3)初始化段(INIT)(4)计算段(CALC)(5)目标与约束段,(1)集合段(SETS)这部分要以“SETS:”开始,以“ENDSETS”结束,作用在于定义必要的集合变量(SET)及其元素(member,含义类似于数组的下标)和属性(attribute,含义类似于数组)格式有基本集和派生集两种,基本集:Setname(集合变量名)/member_list(元素列表)/:attribute_list(属性列表);元素列表可以全部一一列出,也可以

8、用格式“/元素1.元素N/”列出,例如SETS:STUDENTS/1,2,3,4,5/:NAME,AGE;ENDSETSSETS:STUDENTS/1.5/:NAME,AGE;ENDSETS,派生集:Setname(parent_set_list(源集列表)/member_list/:attribute_list;例如SETS:PRODUCT/A B/;MACHINE/M N/;WEEK/1.2/;ALLOWED(PRODUCT,MACHINE,WEEK);ENDSETS列表可以用逗号“,”分开,也可以用空格分开,(2)数据段(DATA),这部分要以“DATA:”开始,以“ENDDATA”结束

9、,作用在于对集合的属性(数组)输入必要的常数数据格式为:attribute_list(属性列表)=value_list(常数列表);例如SETS:SET1/A,B,C/:X,Y;ENDSETSDATA:X=1 2 3;Y=4 5 6;ENDDATA,(2)数据段(DATA),这部分要以“DATA:”开始,以“ENDDATA”结束,作用在于对集合的属性(数组)输入必要的常数数据格式为:attribute_list(属性列表)=value_list(常数列表);例如SETS:SET1/A,B,C/:X,Y;ENDSETSDATA:X=1 2 3;Y=4 5 6;ENDDATA,(3)初始化段(IN

10、IT),这部分要以“INIT:”开始,以“ENDINIT”结束,作用在于对集合的属性(数组)给出初值格式为:attribute_list(属性列表)=value_list(常数列表);与数据段的用法类似,(4)计算段(CALC),这部分要以“CALC:”开始,以“ENDCALC”结束,作用在于对一些原始数据进行计算处理因为在实际问题中,输入的数据往往是原始数据,不一定能在模型中直接使用,可以在这个段对这些原始数据进行一定的“预处理”,得到模型中真正需要的数据在计算段中语句是顺序执行的,(5)目标与约束段,这部分没有段的开始和结束标记,作用在于给定目标函数与约束条件可见除这一段外,其他4个段都有

11、明确的段标记这一段是模型的主要部分,其他段是为这一段服务的其他四段可以没有,这一段必须要有否则不称其为模型这一段一般要用到LINGO的运算符和各种函数,LINGO的运算符和函数,LINGO包含有大量的运算符和函数,供程序(建立优化模型)调用,其功能很强充分利用这些函数,对解决问题将是非常方便的下面给出部分函数及简要功能介绍,全部函数及详细功能说明可进一步参考LINGO的使用手册,一、运算符及其优先级二、基本的数学函数三、集合循环函数四、集合操作函数五、变量定界函数六、财务会计函数七、概率中的相关函数八、文件输入输出函数,运算符及其优先级,LINGO的运算符有三类:算数运算符、逻辑运算符和关系运

12、算符,1算术运算符:,LINGO中提供了二元运算符的算术运算符有以下5种:+(加法),-(减法或负号),*(乘法),/(除法),(求幂)算术运算是数与数之间的运算,运算结果仍是数,2逻辑运算符:,LINGO中的逻辑运算符有以下9种,可以分成两类:(1)#AND#(与),#OR#(或),#NOT#(非):这三个运算是逻辑值之间的运算,也就是它们操作的对象本身必须已经是逻辑值或逻辑表达式,计算结果也是逻辑值(2)#EQ#(等于),#NE#(不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于):这6个操作实际上是“数与数之间”的比较,也就是它们操作的对象本身必须是

13、两个数,而逻辑表达式计算的结果是逻辑值,3关系运算符:,LINGO中的关系运算符有以下3种:(即,小于等于),(等于),(即,大于等于)这三个运算符虽然也是“数与数之间”的比较,但在LINGO中只用来表示优化模型的约束条件,所以不是真正意义上的运算,这些运算符的优先级如表3.1所示(同一优先级按左到右的顺序执行;如果有括号“()”,则括号内的表达式优先进行计算),表3.1,基本的数学函数,在LINGO中写程序时可以调用大量的内部函数,这些函数以“”符号打头(类似调用命令)LINGO中数学函数的用法与其它语言中的数学函数的用法类似,主要有以下函数:ABS(X):绝对值函数,返回X的绝对值COS(

14、X):余弦函数,返回X的余弦值(X的单位是弧 度)EXP(X):指数函数,返回ex的值FLOOR(X):取整函数,返回X的整数部分(向最靠近0的方向取整)LGM(X):返回X的伽马(Gamma)函数的自然对数 值,LOG(X):自然对数函数,返回X的自然对数值MOD(X,Y):模函数,返回X对Y取模的结果 POW(X,Y):指数函数,返回XY的值SIGN(X):符号函数,返回X的符号值(X0时返回-1,X0返回1)SIN(X):正弦函数,返回X的正弦值SMAX(list):最大值函数,返回列表(list)中的最大值SMIN(list):最小值函数,返回列表(list)中的最小值SQR(X):平

15、方函数,返回X的平方值SQRT(X):平方根函数,返回X的正的平方根的值TAN(X):正切函数,返回X的正切值,集合循环函数,集合循环函数是指对集合上的元素(下标)进行循环操作的函数,主要有FOR,MAX,MIN,SUM,PROD五种,其用法如下:function(setname(set_index_list)|conditional_qualifier:expression_list);其中:Function是集合函数名;Setname是集合名;set_index_list是集合索引列表(不需要使用索引时可以省略);|conditional_qualifier是用逻辑表达式给出的过滤条件(无

16、条件时可以省略);:expression_list是一个表达式(对FOR函数,可以是一组表达式),集合循环函数,四个集合循环函数:FOR、SUM、MAX、MINfunction(setname(set_index_list)|condition:expression_list);,objective MAX=SUM(PAIRS(I,J):BENEFIT(I,J)*MATCH(I,J);FOR(STUDENTS(I):constraints SUM(PAIRS(J,K)|J#EQ#I#OR#K#EQ#I:MATCH(J,K)=1);FOR(PAIRS(I,J):BIN(MATCH(I,J);MA

17、XB=MAX(PAIRS(I,J):BENEFIT(I,J);MINB=MIN(PAIRS(I,J):BENEFIT(I,J);,Example:,程序与数据分离,文本文件,使用外部数据文件,Cut(or Copy)Paste 方法FILE 输入数据、TEXT输出数据(文本文件)OLE函数与电子表格软件(如EXCEL)连接ODBC函数与数据库连接LINGO命令脚本文件,LG4(LONGO模型文件)LNG(LONGO模型文件)LTF(LONGO脚本文件)LDT(LONGO数据文件)LRP(LONGO报告文件),常用文件后缀,FILE和TEXT:文本文件输入输出,MODEL:SETS:MYSET/

18、FILE(myfile.txt)/:FILE(myfile.txt);ENDSETSMIN=SUM(MYSET(I):SHIP(I)*COST(I);FOR(MYSET(I):CON1 SHIP(I)NEED(I);CON2 SHIP(I)SUPPLY(I);DATA:COST=FILE(myfile.txt);NEED=FILE(myfile.txt);SUPPLY=FILE(myfile.txt);TEXT(result.txt)=SHIP,DUAL(SHIP),DUAL(CON1);ENDDATAEND,myfile.txt文件的内容、格式:Seattle,Detroit,Chicago

19、,DenverCOST,NEED,SUPPLY,SHIP12,28,15,201600,1800,1200,10001700,1900,1300,1100,演示 MyfileExample.lg4,OLE:与EXCEL连接,MODEL:SETS:MYSET:COST,SHIP,NEED,SUPPLY;ENDSETSMIN=SUM(MYSET(I):SHIP(I)*COST(I);FOR(MYSET(I):CON1 SHIP(I)NEED(I);CON2 SHIP(I)SUPPLY(I);DATA:MYSET=OLE(D:JXIEBJ2004MCMmydata.xls,CITIES);COST,

20、NEED,SUPPLY=OLE(mydata.xls);OLE(mydata.xls,SOLUTION)=SHIP;ENDDATAEND,mydata.xls文件中必须有下列名称(及数据):CITIES,COST,NEED,SUPPLY,SOLUTION,在EXCEL中还可以通过“宏”自动调用LINGO(略)也可以将EXCEL表格嵌入到LINGO模型中(略),演示 MydataExample.lg4,ODBC:与数据库连接,输入基本集合元素:setname/ODBC(datasource,tablename,columnname)/输入派生集合元素:setname/ODBC(source,ta

21、ble,column1,column2)/,目前支持下列DBMS:(如为其他数据库,则需自行安装驱动)ACCESS,DBASE,EXCEL,FOXPRO,ORACLE,PARADOX,SQL SERVER,TEXE FILES,使用数据库之前,数据源需要在ODBC管理器注册,输入数据:Attr_list=ODBC(source,table,column1,column2)输出数据:ODBC(source,table,column1,column2)=Attr_list,具体例子略,LINGO软件求解案例,MODEL:MIN=66.8*x11+75.6*x12+87*x13+58.6*x14+6

22、7.4*x51+71*x52+83.8*x53+62.4*x54;x11+x12+x13+x14=1;x41+x42+x43+x44=1;x11+x21+x31+x41+x51=1;x14+x24+x34+x44+x54=1;BIN(x11);BIN(x54);END,MODEL:SETS:xb1/1.4/:;xb2/1.5/:;bl(xb1,xb2):c,x;ENDSETSMIN=SUM(bl(i,j):c(i,j)*x(i,j);FOR(xb1(i):SUM(xb2(j):x(i,j)=1);FOR(xb2(j):SUM(xb1(i):x(i,j)=1);FOR(bl(I,j):BIN(x

23、(i,j);END,MODEL:SETS:xb1/1.4/:;xb2/1.5/:;bl(xb1,xb2):c,x;ENDSETSMIN=SUM(bl(i,j):c(i,j)*x(i,j);FOR(xb1(i):SUM(xb2(j):x(i,j)=1);FOR(xb2(j):SUM(xb1(i):x(i,j)=1);FOR(bl(I,j):BIN(x(i,j);END,一、生产管理问题,1问题实例 某厂有5种设备A1,A2,A5,用来加工7种零部件B1,B2,B7,每种设备的数量、每种零部件的单位成本及所需各设备的加工工时(以小时计)见表1,表1,在其后的半年中,工厂有设备检修计划(停工检修时间

24、一个月)见表2,工厂在半年中有订单(必须按时交货)见表3,表3,表2,每种零部件库存最多可到100件,现每种零部件有库存80件,库存费用每件每月为0.5元,要求到六月底每种零部件有存货50件,每种零部件生产至少50件工厂每周工作5天,每天2班,每班8小时试回答如下问题:(1)工厂如何安排各月份各种零部件的加工数量?(2)单位成本有10%的变化,对计划有什么影响?(3)设备各增加1台对计划有什么的影响,2模型建立,设:为第 种零部件在第种设备上的单位加工工时;为第 种设备在第月的数量;为第 月第 种零部件的定单数量;为第 种零部件的单位成本;为第 月第 种零部件的生产数量;为第 月末第 种零部件

25、的库存数量;为初始库存,假设每月以20天计,有以下模型,3模型求解,(1)计算结果有:目标函数:,(2)目标的灵敏度分析:Objective Coefficient Ranges(目标系数的灵敏度分析),(3)约束条件的灵敏度分析:,从以上灵敏度分析可见,提高1台,没有超出允许范围的,所以对计划没有影响也可以将数据与模型分离,先准备数据文件exam01.ldt:!单耗;0.5 0.7 0.0 0.0 0.3 0.2 0.50.1 0.2 0.0 0.3 0.0 0.6 0.00.2 0.0 0.8 0.0 0.0 0.0 0.60.05 0.03 0 0.07 0.1 0 0.080 0 0.

26、01 0 0.05 0 0.05!设备数量;3 4 4 4 3 42 2 1 1 1 23 1 3 3 3 21 1 1 1 1 11 1 1 1 1 1!需求;250 500 150 150 400 100 100300 250 100 0 200 150 100150 300 0 0 250 200 100100 150 200 250 100 0 1000 100 250 100 500 150 0250 250 100 300 550 250 100!单位成本;100 60 80 40 110 90 30,再写程序如下:,model:sets:cp/1.7/:c;yf/1.6/:;sb

27、/1.5/:;sl1(yf,cp):x,d,s;sl2(sb,cp):a;sl3(sb,yf):b;endsets data:a=file(exam01.ldt);b=file(exam01.ldt);d=file(exam01.ldt);c=file(exam01.ldt);enddata min=sum(sl1(k,j):c(j)*x(k,j)+0.5*s(k,j);for(yf(k):for(sb(i):sum(cp(j):a(i,j)*x(k,j)=50);end,二、下料问题,1问题实例 有某种材料一根长19米现需用其切割4米长毛坯50根、5米长毛坯10根、6米长毛坯20根、8米长毛

28、坯15根如何切割使其用料最省?要求切割模式不能超过3种,2模型建立,设:分别表示4米长,5米长,6米长,8米长的毛坯;为第 种毛坯的长度;为第 种毛坯的需要量;为第 种切割模式所用的材料数量;为第 种切割模式切割第 种毛坯的数量,一种合理的切割模式应满足:其余料长度不应该大于或等于需要切割毛坯的最小长度于是有模型如下,3模型求解,为了便于运算,我们先来缩小可行域由于3种切割模式的排列顺序是无关紧要的,所以不妨增加以下约束:又注意到用料的总量有明显的上界和下界首先,无论如何,用料总量不可能少于其次,考虑一种特殊的下料计划:模式1:切割成4根4米钢管,需13根;模式2:切割成1根5米和2根6米钢管

29、,需10根;模式3:切割成2根8米钢管,需8根这样需要 13+10+8=31于是可得到解的一个上界所以又可增加约束:,利用LINGO软件计算,输入,model:sets:needs/1.4/:a,b;cuts/1.3/:x;patterns(needs,cuts):r;endsets data:a=4 5 6 8;b=50 10 20 15;enddata min=sum(cuts(j):x(j);!用料目标;for(needs(i):sum(cuts(j):x(j)*r(i,j)b(i);!需要量要求;for(cuts(j):sum(needs(i):a(i)*r(i,j)16);!合理模式

30、;sum(cuts(j):x(j)26;!用料下限;sum(cuts(j):x(j)x(j+1);!人为约束;for(cuts(j):gin(x(j);!整数约束;for(patterns(i,j):gin(r(i,j);!整数约束;end,经过LINGO求解,得到输出如下:,Objective value:28.00000Variable Value Reduced CostX(1)10.00000 0.000000X(2)10.00000 2.000000X(3)8.000000 1.000000R(1,1)3.000000 0.000000R(1,2)2.000000 0.000000R

31、(1,3)0.000000 0.000000R(2,1)0.000000 0.000000R(2,2)1.000000 0.000000R(2,3)0.000000 0.000000R(3,1)1.000000 0.000000R(3,2)1.000000 0.000000R(3,3)0.000000 0.000000R(4,1)0.000000 0.000000R(4,2)0.000000 0.000000R(4,3)2.000000 0.000000,即按照模式1、2、3分别切割10、10、8根材料,使用材料总根数为28根第一种切割模式下1根材料切割3根4米的和1根6米的;第二种切割模式下

32、1根材料切割2根4米的、1根5米的和1根6米的;第三种切割模式下1根材料切割2根8米的,三、投资组合问题,1问题实例有三种股票A,B,C,其前12年的价值每年的增长情况如表所示,表中还给出了相应年份的500种股票的价格指数的增长情况假设目前你有一笔资金准备投资这三种股票,并期望年收益率达到15%,那么你应如何投资?,2模型建立,设:分别表示表示A,B,C三种股票;为第 种股票的价值;为第 种股票第 年的价值;为指数;为第 年的指数;为投资第 种股票比例,股票指数反映的是股票市场的大势信息,对每只股票的涨跌是有影响的假设每只股票的收益与股票指数成线性关系即或其中 是待定系数,是一个随机误差,其均

33、值为 方差为,此外假设随机误差 与其他股票和股票指数都是独立的,所以 先根据所给数据回归计算,即使误差的平方和最小:,可用Matlab软件做该回归计算,也可用LINGO软件分别来做每只股票的回归计算,输入,model:sets:year/1.12/:M,R,a,b,e;endsets data:R=1.300 1.103 1.216 0.954 0.929 1.056 1.038 1.089 1.090 1.083 1.035 1.176;M=1.258997 1.197526 1.364361 0.919287 1.057080 1.055012 1.187925 1.317130 1.24

34、0164 1.183675 0.990108 1.526236;enddata calc:mean0=sum(year(j):M(j)/size(year);s20=sum(year(j):sqr(M(j)-mean0)/(size(year)-1);s0=sqrt(s20);endcalc min=s2;s2=sum(year(j):sqr(e(j)/(size(year)-2);s=sqrt(s2);for(year(j):e(j)=R(j)-a-b*M(j);for(year(j):free(e(j);free(a);free(b);End,对上面的程序,注意以下几点:,(1)只给了一种

35、股票的价值R;(2)在CALC段直接计算了M的均值mean0和方差s20以及标准差s0(为了使这个估计是无偏估计,分母是11而不是12);(3)程序中用到平方函数sqr和平方根函数sqrt;(4)除了计算回归系数外,同时估计了回归误差s2和标准差s,为了使这个估计是无偏估计,分母是10而不是11和12,这是因为此时已经假设保持误差的均值为0,所以自由度又少了一个;(5)free(a),free(b),free(e)三个语句不能少,因为它们不一定是非负的;,运行这个LINGO模型,结果为:,Objective value:0.5748320E-02 Variable Value Reduced

36、Cost MEAN0 1.191458 0.000000 S20 0.2873661E-01 0.000000 S0 0.1695188 0.000000 S2 0.5748320E-02 0.000000 S 0.7581767E-01 0.000000 A 0.5639761 0.000000 B 0.4407264 0.000000也就是说:M的均值,方差,标准差,对股票A,回归系数 误差的方差,误差的标准差,同理,可以得到:对股票B,回归系数 误差的方差,误差的标准差 对股票C,回归系数,误差的方差,误差的标准差,于是,年投资收益为收益的期望为收益的方差为进一步,令 则模型应该为,3模

37、型求解,利用LINGO软件计算,输入model:sets:stocks/1.3/:u,b,s2,x;endsets data:mean0=1.191458;s20=0.02873661;s2=0.005748320,0.01564263,0.03025165;u=0.5639761,-0.2635059,-0.5809590;b=0.4407264,1.239802,1.523798;enddata min=s20*sqr(y)+sum(stocks(i):s2(i)*sqr(x(i);sum(stocks(i):b(i)*x(i)=y;sum(stocks(i):x(i)=1;sum(sto

38、cks(i):(u(i)+b(i)*mean0)*x(i)1.15;end,运算这个LINGO模型,输出结果如下,Objective value:0.2465621E-01 Y 0.8453449 0.000000 X(1)0.5266052 0.000000 X(2)0.3806461 0.000000 X(3)0.9274874E-01 0.000000根据运算结果可知:A大约占初始时刻总资产的53%,B占38%,C占9%,四、最小费用最大流问题,1问题实例 需要将某地 的天然气通过管道输送到另一地,中间有4个中转站 由于输气管道的长短粗细不一或地质等原因,使得每条管道上的运输量及费用不同

39、下图给出了这两地与中转站的连接以及管道的容量、费用:,图中括号里第一个数字是管道容量,第二个数字是管道单位运费考虑地到地如何输送天然气,使得费用最小流量最大,2模型建立,设:为网络顶点集,为网络的弧集;为弧 上的流量;为弧 上的单位运费;为弧 上的容量;为发点处的净流量 根据最大流的定义,我们有模型如下:,3模型求解,先考虑最大流模型,LINGO软件输入如下model:sets:nodes/s,1,2,3,4,t/;arcs(nodes,nodes)/s,1 s,2 1,2 1,3 2,4 3,2 3,t 4,3 4,t/:c,f;endsets data:c=8 7 5 9 9 2 5 6

40、10;enddata max=flow;for(nodes(i)|i#ne#1#and#i#ne#size(nodes):sum(arcs(i,j):f(i,j)-sum(arcs(j,i):f(j,i)=0);sum(arcs(i,j)|i#eq#1:f(i,j)=flow;for(arcs(i,j):bnd(0,f(i,j),c(i,j);end,计算结果如下:,Objective value:14.00000 Variable Value Reduced Cost FLOW 14.00000 0.000000 F(S,1)7.000000 0.000000 F(S,2)7.000000

41、0.000000 F(1,2)2.000000 0.000000 F(1,3)5.000000 0.000000 F(2,4)9.000000-1.000000 F(3,2)0.000000 0.000000 F(3,T)5.000000-1.000000 F(4,3)0.000000 1.000000 F(4,T)9.000000 0.000000,其次考虑最小费用最大流模型,LINGO软件输入如下,model:sets:nodes/s,1,2,3,4,t/;arcs(nodes,nodes)/s,1 s,2 1,2 1,3 2,4 3,2 3,t 4,3 4,t/:b,c,f;endset

42、s data:b=2 8 5 2 3 1 6 4 7;c=8 7 5 9 9 2 5 6 10;flow=14;enddata min=sum(arcs(i,j):b(i,j)*f(i,j);for(nodes(i)|i#ne#1#and#i#ne#size(nodes):sum(arcs(i,j):f(i,j)-sum(arcs(j,i):f(j,i)=0);sum(arcs(i,j)|i#eq#1:f(i,j)=flow;for(arcs(i,j):bnd(0,f(i,j),c(i,j);end,计算结果如下:,Objective value:205.0000 Variable Value

43、 Reduced Cost F(S,1)8.000000-1.000000 F(S,2)6.000000 0.000000 F(1,2)1.000000 0.000000 F(1,3)7.000000 0.000000 F(2,4)9.000000 0.000000 F(3,2)2.000000-3.000000 F(3,T)5.000000-8.000000 F(4,3)0.000000 11.00000 F(4,T)9.000000 0.000000,附录 LINGO出错信息,在LINGO程序求解时,系统首先会对程序进行编译系统在编译或执行其他命令时,会因程序中的错误或运行错误,弹出一个出错报告窗口,显示其错误代码,并简要指出错误的原因这些错误报告信息能够提示用户发现程序中的错误,以便能尽快修改下面我们给出出错信息的一个简要说明,仅供参考 LINGO错误编号及原因对照表,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号