lingo初级入门手册.ppt

上传人:max****ui 文档编号:11549406 上传时间:2020-04-28 格式:PPT 页数:127 大小:4.26MB
返回 下载 相关 举报
lingo初级入门手册.ppt_第1页
第1页 / 共127页
lingo初级入门手册.ppt_第2页
第2页 / 共127页
lingo初级入门手册.ppt_第3页
第3页 / 共127页
点击查看更多>>
资源描述
LINGO软件使用,LINGO是美国LINDO系统公司开发的一套专门用于求解最优化问题的软件它为求解最优化问题提供了一个平台,主要用于求解线性规划、非线性规划、整数规划、二次规划、线性及非线性方程组等问题它是最优化问题的一种建模语言,包含有许多常用的函数供使用者编写程序时调用,并提供了与其他数据文件的接口,易于方便地输入,求解和分析大规模最优化问题,且执行速度快由于它的功能较强,所以在教学、科研、工业、商业、服务等许多领域得到了广泛的应用,目录,3.1LINGO操作界面简介3.2LINGO模型的基本特征3.3LINGO的运算符和函数3.4LINGO软件求解案例,LINGO操作界面简介,图1.1中最外层的窗口是LINGO软件的主窗口(LINGO软件的用户界面),所有其他窗口都在这个窗口之内主窗口有:标题栏、菜单栏、工具栏和状态栏目前,状态栏最左边显示的是“Ready”,表示准备就绪,右下角显示的是当前时间,时间前面是当前光标的位置“Ln1,Col1”(即1行1列)将来用户可以用选项命令(LINGO|Options|Interface菜单命令)决定是否需要显示工具栏和状态栏,在Windows操作系统下启动LINGO软件,屏幕上首先显示如图1.1所示的窗口.,图1.1,LINGO有5个主菜单:,File(文件)Edit(编辑)LINGO(LINGO系统)Windows(窗口)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)(灵敏度分析)命令显示当前解的灵敏度分析结果(你必须在此之前求解过当前模型),LINGO|Options(Ctrl-I)LINGO|Options(Ctrl-I)(选项)命令将打开一个含有7个选项卡的对话框窗口,你可以通过它修改LINGO系统的各种控制参数和选项修改完以后,你如果单击“应用”按钮,则新的设置马上生效;如果单击“OK”按钮,则新的设置马上生效,并且同时关闭该窗口;如果单击“Save”按钮,则将当前设置变为默认设置,下次启动LINGO时这些设置仍然有效;如果单击“Default”按钮,则恢复LINGO系统定义的原始默认设置;如果单击“Cancel”按钮将废弃本次操作,退出对话框;单击“Help”按钮将显示本对话框的帮助信息LINGO|Generate和LINGO|PictureLINGO|Generate和LINGO|Picture命令都是在模型窗口下才能使用,他们的功能是按照LINGO模型的完整形式分别以代数表达式形式和矩阵图形形式显示目标函数和约束,LINGO|Debug(Ctrl+D)LINGO|Debug(Ctrl+D)命令分析线性规划无解或无界的原因,建议如何修改.LINGO|ModelStatistics(Ctrl+E)LINGO|ModelStatistics(Ctrl+E)命令显示当前模型的统计信息LINGO|Look(Ctrl+L)LINGO|Look(Ctrl+L)命令显示当前模型的文本形式,显示时对所有行按顺序编号,图1.2给出了工具栏的简要功能说明,当前光标所在的窗口(窗口标题栏上标有“LINGOModel-LINGO1”),就是模型窗口(modelwindows),也就是用于输入LINGO优化模型(即LINGO程序)的窗口,LINGO模型的基本特征,LINGO模型(程序)从LINGO模型窗口输入,它以语句“MODEL:”开始,以语句“END”结束它是由一系列语句组成,每个语句都是以分号“;”结束,语句是组成LINGO模型的基本单位每行可以写多个语句,为了保持模型的可读性,最好一行只写一个语句,并且按照语句之间的嵌套关系对语句安排适当的缩进,增强层次感以感叹号“!”开始的语句是注释语句(注释语句也需要以分号“;”结束),LINGO模型(程序)一般由5个部分(或称5段)组成:,(1)集合段(SETS)(2)数据段(DATA)(3)初始化段(INIT)(4)计算段(CALC)(5)目标与约束段,(1)集合段(SETS)这部分要以“SETS:”开始,以“ENDSETS”结束,作用在于定义必要的集合变量(SET)及其元素(member,含义类似于数组的下标)和属性(attribute,含义类似于数组)格式有基本集和派生集两种,基本集:Setname(集合变量名)/member_list(元素列表)/:attribute_list(属性列表);元素列表可以全部一一列出,也可以用格式“/元素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/AB/;MACHINE/MN/;WEEK/1.2/;ALLOWED(PRODUCT,MACHINE,WEEK);ENDSETS列表可以用逗号“,”分开,也可以用空格分开,(2)数据段(DATA),这部分要以“DATA:”开始,以“ENDDATA”结束,作用在于对集合的属性(数组)输入必要的常数数据格式为:attribute_list(属性列表)=value_list(常数列表);例如SETS:SET1/A,B,C/:X,Y;ENDSETSDATA:X=123;Y=456;ENDDATA,(2)数据段(DATA),这部分要以“DATA:”开始,以“ENDDATA”结束,作用在于对集合的属性(数组)输入必要的常数数据格式为:attribute_list(属性列表)=value_list(常数列表);例如SETS:SET1/A,B,C/:X,Y;ENDSETSDATA:X=123;Y=456;ENDDATA,(3)初始化段(INIT),这部分要以“INIT:”开始,以“ENDINIT”结束,作用在于对集合的属性(数组)给出初值格式为:attribute_list(属性列表)=value_list(常数列表);与数据段的用法类似,(4)计算段(CALC),这部分要以“CALC:”开始,以“ENDCALC”结束,作用在于对一些原始数据进行计算处理因为在实际问题中,输入的数据往往是原始数据,不一定能在模型中直接使用,可以在这个段对这些原始数据进行一定的“预处理”,得到模型中真正需要的数据在计算段中语句是顺序执行的,(5)目标与约束段,这部分没有段的开始和结束标记,作用在于给定目标函数与约束条件可见除这一段外,其他4个段都有明确的段标记这一段是模型的主要部分,其他段是为这一段服务的其他四段可以没有,这一段必须要有否则不称其为模型这一段一般要用到LINGO的运算符和各种函数,LINGO的运算符和函数,LINGO包含有大量的运算符和函数,供程序(建立优化模型)调用,其功能很强充分利用这些函数,对解决问题将是非常方便的下面给出部分函数及简要功能介绍,全部函数及详细功能说明可进一步参考LINGO的使用手册,一、运算符及其优先级二、基本的数学函数三、集合循环函数四、集合操作函数五、变量定界函数六、财务会计函数七、概率中的相关函数八、文件输入输出函数,运算符及其优先级,LINGO的运算符有三类:算数运算符、逻辑运算符和关系运算符,1算术运算符:,LINGO中提供了二元运算符的算术运算符有以下5种:+(加法),-(减法或负号),*(乘法),/(除法),(求幂)算术运算是数与数之间的运算,运算结果仍是数,2逻辑运算符:,LINGO中的逻辑运算符有以下9种,可以分成两类:(1)#AND#(与),#OR#(或),#NOT#(非):这三个运算是逻辑值之间的运算,也就是它们操作的对象本身必须已经是逻辑值或逻辑表达式,计算结果也是逻辑值(2)#EQ#(等于),#NE#(不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于):这6个操作实际上是“数与数之间”的比较,也就是它们操作的对象本身必须是两个数,而逻辑表达式计算的结果是逻辑值,3关系运算符:,LINGO中的关系运算符有以下3种:(即,小于等于),(等于),(即,大于等于)这三个运算符虽然也是“数与数之间”的比较,但在LINGO中只用来表示优化模型的约束条件,所以不是真正意义上的运算,这些运算符的优先级如表3.1所示(同一优先级按左到右的顺序执行;如果有括号“()”,则括号内的表达式优先进行计算),表3.1,基本的数学函数,在LINGO中写程序时可以调用大量的内部函数,这些函数以“”符号打头(类似调用命令)LINGO中数学函数的用法与其它语言中的数学函数的用法类似,主要有以下函数:ABS(X):绝对值函数,返回X的绝对值COS(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):平方函数,返回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是用逻辑表达式给出的过滤条件(无条件时可以省略);:expression_list是一个表达式(对FOR函数,可以是一组表达式),集合循环函数,四个集合循环函数:FOR、SUM、MAX、MINfunction(setname(set_index_list)|condition:expression_list);,objectiveMAX=SUM(PAIRS(I,J):BENEFIT(I,J)*MATCH(I,J);FOR(STUDENTS(I):constraintsSUM(PAIRS(J,K)|J#EQ#I#OR#K#EQ#I:MATCH(J,K)=1);FOR(PAIRS(I,J):BIN(MATCH(I,J);MAXB=MAX(PAIRS(I,J):BENEFIT(I,J);MINB=MIN(PAIRS(I,J):BENEFIT(I,J);,Example:,程序与数据分离,文本文件,使用外部数据文件,Cut(orCopy)Paste方法FILE输入数据、TEXT输出数据(文本文件)OLE函数与电子表格软件(如EXCEL)连接ODBC函数与数据库连接LINGO命令脚本文件,LG4(LONGO模型文件)LNG(LONGO模型文件)LTF(LONGO脚本文件)LDT(LONGO数据文件)LRP(LONGO报告文件),常用文件后缀,FILE和TEXT:文本文件输入输出,MODEL:SETS:MYSET/FILE(myfile.txt)/:FILE(myfile.txt);ENDSETSMIN=SUM(MYSET(I):SHIP(I)*COST(I);FOR(MYSET(I):CON1SHIP(I)NEED(I);CON2SHIP(I)NEED(I);CON2SHIP(I)SUPPLY(I);DATA:MYSET=OLE(D:JXIEBJ2004MCMmydata.xls,CITIES);COST,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,table,column1,column2)/,目前支持下列DBMS:(如为其他数据库,则需自行安装驱动)ACCESS,DBASE,EXCEL,FOXPRO,ORACLE,PARADOX,SQLSERVER,TEXEFILES,使用数据库之前,数据源需要在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+67.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)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求解,得到输出如下:,Objectivevalue:28.00000VariableValueReducedCostX(1)10.000000.000000X(2)10.000002.000000X(3)8.0000001.000000R(1,1)3.0000000.000000R(1,2)2.0000000.000000R(1,3)0.0000000.000000R(2,1)0.0000000.000000R(2,2)1.0000000.000000R(2,3)0.0000000.000000R(3,1)1.0000000.000000R(3,2)1.0000000.000000R(3,3)0.0000000.000000R(4,1)0.0000000.000000R(4,2)0.0000000.000000R(4,3)2.0000000.000000,即按照模式1、2、3分别切割10、10、8根材料,使用材料总根数为28根第一种切割模式下1根材料切割3根4米的和1根6米的;第二种切割模式下1根材料切割2根4米的、1根5米的和1根6米的;第三种切割模式下1根材料切割2根8米的,三、投资组合问题,1问题实例有三种股票A,B,C,其前12年的价值每年的增长情况如表所示,表中还给出了相应年份的500种股票的价格指数的增长情况假设目前你有一笔资金准备投资这三种股票,并期望年收益率达到15%,那么你应如何投资?,2模型建立,设:分别表示表示A,B,C三种股票;为第种股票的价值;为第种股票第年的价值;为指数;为第年的指数;为投资第种股票比例,股票指数反映的是股票市场的大势信息,对每只股票的涨跌是有影响的假设每只股票的收益与股票指数成线性关系即或其中是待定系数,是一个随机误差,其均值为方差为,此外假设随机误差与其他股票和股票指数都是独立的,所以先根据所给数据回归计算,即使误差的平方和最小:,可用Matlab软件做该回归计算,也可用LINGO软件分别来做每只股票的回归计算,输入,model:sets:year/1.12/:M,R,a,b,e;endsetsdata:R=1.3001.1031.2160.9540.9291.0561.0381.0891.0901.0831.0351.176;M=1.2589971.1975261.3643610.9192871.0570801.0550121.1879251.3171301.2401641.1836750.9901081.526236;enddatacalc:mean0=sum(year(j):M(j)/size(year);s20=sum(year(j):sqr(M(j)-mean0)/(size(year)-1);s0=sqrt(s20);endcalcmin=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)只给了一种股票的价值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模型,结果为:,Objectivevalue:0.5748320E-02VariableValueReducedCostMEAN01.1914580.000000S200.2873661E-010.000000S00.16951880.000000S20.5748320E-020.000000S0.7581767E-010.000000A0.56397610.000000B0.44072640.000000也就是说:M的均值,方差,标准差,对股票A,回归系数误差的方差,误差的标准差,同理,可以得到:对股票B,回归系数误差的方差,误差的标准差对股票C,回归系数,误差的方差,误差的标准差,于是,年投资收益为收益的期望为收益的方差为进一步,令则模型应该为,3模型求解,利用LINGO软件计算,输入model:sets:stocks/1.3/:u,b,s2,x;endsetsdata: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;enddatamin=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(stocks(i):(u(i)+b(i)*mean0)*x(i)1.15;end,运算这个LINGO模型,输出结果如下,Objectivevalue:0.2465621E-01Y0.84534490.000000X(1)0.52660520.000000X(2)0.38064610.000000X(3)0.9274874E-010.000000根据运算结果可知:A大约占初始时刻总资产的53%,B占38%,C占9%,四、最小费用最大流问题,1问题实例需要将某地的天然气通过管道输送到另一地,中间有4个中转站由于输气管道的长短粗细不一或地质等原因,使得每条管道上的运输量及费用不同下图给出了这两地与中转站的连接以及管道的容量、费用:,图中括号里第一个数字是管道容量,第二个数字是管道单位运费考虑地到地如何输送天然气,使得费用最小流量最大,2模型建立,设:为网络顶点集,为网络的弧集;为弧上的流量;为弧上的单位运费;为弧上的容量;为发点处的净流量根据最大流的定义,我们有模型如下:,3模型求解,先考虑最大流模型,LINGO软件输入如下model:sets:nodes/s,1,2,3,4,t/;arcs(nodes,nodes)/s,1s,21,21,32,43,23,t4,34,t/:c,f;endsetsdata:c=8759925610;enddatamax=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,计算结果如下:,Objectivevalue:14.00000VariableValueReducedCostFLOW14.000000.000000F(S,1)7.0000000.000000F(S,2)7.0000000.000000F(1,2)2.0000000.000000F(1,3)5.0000000.000000F(2,4)9.000000-1.000000F(3,2)0.0000000.000000F(3,T)5.000000-1.000000F(4,3)0.0000001.000000F(4,T)9.0000000.000000,其次考虑最小费用最大流模型,LINGO软件输入如下,model:sets:nodes/s,1,2,3,4,t/;arcs(nodes,nodes)/s,1s,21,21,32,43,23,t4,34,t/:b,c,f;endsetsdata:b=285231647;c=8759925610;flow=14;enddatamin=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,计算结果如下:,Objectivevalue:205.0000VariableValueReducedCostF(S,1)8.000000-1.000000F(S,2)6.0000000.000000F(1,2)1.0000000.000000F(1,3)7.0000000.000000F(2,4)9.0000000.000000F(3,2)2.000000-3.000000F(3,T)5.000000-8.000000F(4,3)0.00000011.00000F(4,T)9.0000000.000000,附录LINGO出错信息,在LINGO程序求解时,系统首先会对程序进行编译系统在编译或执行其他命令时,会因程序中的错误或运行错误,弹出一个出错报告窗口,显示其错误代码,并简要指出错误的原因这些错误报告信息能够提示用户发现程序中的错误,以便能尽快修改下面我们给出出错信息的一个简要说明,仅供参考LINGO错误编号及原因对照表,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!