




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Lingo介绍Lingo是美国LINDO系统公司(Lindo Symtem Inc)开发的求解数学规划系列软件中的一个(其他软件为LINGDO,GINO,Whats Best等),它的主要功能是求解大型线性、非线性和整数规划问题,目前的版本是lingo11.0。lingo分为Demo、solve suite、hyper、industrial、extended等六类不同版本,只有Demo版本是免费的,其他版本需要向LINDO系统公司(在中国的代理商)购买,Lingo的不同版本对模型的变量总数、非线性变量个数、整型变量个数和约束条件的数量做出不同的限制(其中extended版本无限制)。Lingo的主要功能特色为:(1)既能求解线性规划,也有较强的求解非线性规划的能力;(2)输入模型简练直观;(3)运行速度快、计算能力强;(4)内置建模语言,提供几十种内部函数,从而能以较少语句,较直观的方式描述较大规模的优化模型;(5)将集合的概念引入编程语言,很容易将实际问题转换为Lingo语言;(6)能方便地与excel、数据库等其他软件交换数据。学校图书馆40本lingo和excel在数学建模中的应用,袁新生、邵大宏、郁时炼 主编,科学出版社Lingo程序设计简要说明在数学建模中会遇到如规划类的题型,在这种模型中总存在着一个目标,并希望这个目标的取值尽可能的大或小,同时与这个目标有关的一系列变量之间存在一些约束。在构造出目标函数和约束条件的表达式后,我们需要对求出这个最值和各变量的取值。一般我们用LINGO来对模型进行求解,本文将通过举一个简单的例子,围绕这个例子逐步学习LINGO的使用。LINGO只是一个求解工具,我们主要的任务还是模型的建立!当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGO Model LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。示例:求解线性规划问题: 求解这个模型的相应LINGO程序代码如下:程序一:max= x1+x2+x3+x4+x5+x6+x7+x8;注:然后点击工具条上的按钮 即可。本模型的最优解为2.636364程序二:SETS:xb1 /1.8/:x;xb2 /1.6/ :b,c;xb3 (xb2,xb1):a;ENDSETSDATA: a= 1 7 4 5 5 6 9 3 2 8 5 6 7 2 5 4 3 5 6 9 5 4 4 5 4 7 2 5 8 8 7 6 5 5 4 4 4 5 1 7 6 8 8 7 5 6 2 8;b= 15 38 27 44 15 26;c= 4 9 8 4 6 9;ENDDATAMAX=sum( xb1(i) :x(i) );for( xb2(i): sum( xb1(j) : a(i,j)*x(j) ) +c(i)= b(i););注:然后点击工具条上的按钮 即可。本模型的最优解为2.636364注意:(1)在lingo中输入的各种符号一定要是英文状态下输入,不能是中文输入状态下的符号。例如正确输入 xb3 (xb2,xb1):a; 错误输入 xb3 (xb2,xb1):a; (2)Lingo中不区分字母大小写一变量、常量定义在lingo中变量在使用前是无需定义也可以使用的。在描述类似xi,aij带有下标的变量时,我们可以在使用时一一例举,即,x1,x2,x3.x8, 但这样显然很麻烦(刚接触LINGO的时候大部分是这样使用的)。Lingo中可以使用sets 来预先定义这些变量,然后就可以在loop语句方便地访问这一组变量,也可以用小x(2), a(2,3)的形式访问个别变量,这和C语言中的数组是类似的。1SETS的使用:为了定义xi,aij,那么首先要确定下标i和j的取值范围。在lingo中用sets来表示。代码:SETS :Xb1 /1.8/ ;Xb2 /1.6/ ;ENDSETS其中 xb1、xb2分别为下标1.8 ,1.6的名字(sets_name),这些名字在loop语句中要使用。对于sets_name一般将它命名为有意义的名称,这个sets_name必须以字母或下划线(_)开始。二维下标是在两个一维下标定义的基础上给定的,定义a(i,j)下标的代码如下:SETS :Xb1 /1.8/;Xb2 /1.6/ ;Xb3 (xb2,xb1);ENDSETS(关于下标的定义还有其他的方法,请参考LINGO的help文件,自行学习)现在下标已经定义完成了,定义数组变量时则需在下标后加上冒号再写上变量名,代码如下:SETS :Xb1 /1.8/:x,c,b ;Xb2 /1.6/ ;Xb3 (xb2,xb1):a;ENDSETS2DATA的使用(常量定义):在lingo中把常量理解为已经被给定某常数的变量,在DATA 中对一些变量赋值,使之成为常量。代码如下:SETS:xb1 /1.8/:x;xb2 /1.6/ :b,c;xb3 (xb2,xb1):a;ENDSETSDATA: a= 1 7 4 5 5 6 9 3 2 8 5 6 7 2 5 4 3 5 6 9 5 4 4 5 4 7 2 5 8 8 7 6 5 5 4 4 4 5 1 7 6 8 8 7 5 6 2 8;b= 15 38 27 44 15 26;c= 4 9 8 4 6 9;ENDDATA请尝试着在lingo中输入以上代码后点击solve按钮,查看执行结果。这些变量的值在规划求解中始终不变,也即为常量。3变量类型:Lingo中变量被默认为大于等于0的浮点型变量,在解决某些问题对变量有特殊的要求,需要重新定义其变量类型。下面介绍几个常用的:变量不受大于等于的限制,即也可以取到负值: 用 Free( x ); 语句。变量为整型 :用 Gin( x ); 语句。变量为二进制数,即取值非0即1:用 Bin( x ); 语句。其中x 是要改变类型的变量。更多请见lingo的help文件。二Loop语句Lingo提供的FOR、SUM、MAX 、MIN语句会使我们更轻松地表达多种约束表达式,同时也避免了大量的输入工作。1.for语句:a) 假定我们要定义xi为整型变量,一般我们需要写下如下代码:GIN(X(1) ;GIN(X(2) ;GIN(X(3) ;GIN(X(4) ;GIN(X(5) ;GIN(X(6) ;GIN(X(7) ;GIN(X(8) ;显然这太麻烦了。使用for语句 for( xb1( i ) : GIN( x( i ) ); 就可以替代上面的输入工作。其中xb1 在上述代码中已经定义过,变量i是索引变量。FOR语句格式:FOR( SETS_NAME ( 索引变量 ) ) :循环部分表达式 )for( xb1( i ) : GIN( x( i ) ); 下面我们用C语言来帮助理解,以便我们更好地理解。For( i=1;i=8;i+) gin( x(i) ); for 语句中冒号前面的部分 xb1( i ) 说明索引变量 i 将从1 递增到到8 ;冒号后面是循环的内容,可以是一个语句,也可以是多个语句用分号隔开。b) 上面介绍的是一维的循环,二维循环也与之类似,例如:for( xb3(i , j) : gin( a(i,j);用C语言解释为:For(i=;i=8;i+)For(j=1;j=6;j+) gin( a(i,j); 2.SUM语句:在约束条件表达式中经常用到,lingo提供的SUM语句能方便地表达,但必须要以SETS为基础。SUM语句格式和FOR语句类似:SUM( SETS_NAME ( 索引变量 ) ) :被累加部分表达式 )其中累加部分表达式只能是一条语句。SUM语句不可以像FOR语句那样作为单独的一句话出现,一般将它和另一个常量或表达式比较大小,例:SUM(SETS_NAME ( 索引变量 ) ) :被累加部分表达式 )=常量(表达式);有时为了程序看上去更简洁,可以这样写:VName=SUM(SETS_NAME ( 索引变量 ) ) :被累加部分表达式 );VName= 33 , i=1.8其中的一组取值是b1*c1,b2*c2,b3*c3 .,再从中挑选出最大值作为MAX语句的值。相应Lingo代码如下:max( xb1( i ) : b( i )*c( i ) ) =33 ;同样MAX语句也可以用于多维变量。4.MIN语句:MIN语句的功能是从一组取值与下标有关的表达式中返回它们的最小值。用法与MAX的相同。三EXCEL电子表格接口在你解决一个模型的时候,或许会有大量的数据要整合到你的代码中去,而这些数据大部分时候会被保存在电子表格中。而且EXCEL也是用来处理你所得到的数据较好的一个选择。出于上述原因,LINGO提供了一些命令方便你将数据直接从电子表格中导入到模型中。在这里我将只介绍一个与EXCLE链接的命令 OLE。1 导入数据:我们先看一个例程:SETS :xb1 /1.8/ : x ;xb2 /1.6/ :c , b;xb3 (xb2,xb1): a;ENDSETSDATA :a,b,c= OLE ( E:DATA , DA , DB , DC );ENDDATAMAX=sum( xb1(i) : x(i) );for( xb2(i):sum( xb1(j) : a(i,j)*x(j) +c(i)= b(i););同时我们在E盘新建了一个名为DATA.XLS的EXCLE文件;关于EXCLE的使用,这里不更多说明。需要指出的是 DA , DB , DC 是EXCLE中对一系列单元格的命名,即先选中某个一维或多维单元格区域,然后再在显示单元格行列坐标的文本框中写入对这个区域的命名,再回车确认。这样就可以通过这个命名来控制访问EXCLE的数据了。至于另一种操作方法请查找相关的help文件。以上只是介绍了LINGO基本的知识,上面的程序未经调试,可能存在一些问题!还有希望大家能尽可能使用help文件,在其中有着详细的解答!四LINGO函数LINGO有9种类型的函数:1 1 基本运算符:包括算术运算符、逻辑运算符和关系运算符2 2 数学函数:三角函数和常规的数学函数3 3 金融函数:LINGO提供的两种金融函数4 4 概率函数:LINGO提供了大量概率相关的函数5 5 变量界定函数:这类函数用来定义变量的取值范围6 6 集操作函数:这类函数为对集的操作提供帮助7 7 集循环函数:遍历集的元素,执行一定的操作的函数8 8 数据输入输出函数:这类函数允许模型和外部数据源相联系,进行数据的输入输出9 9 辅助函数:各种杂类函数4.1 基本运算符这些运算符是非常基本的,甚至可以不认为它们是一类函数。事实上,在LINGO中它们是非常重要的。4.1.1 算术运算符算术运算符是针对数值进行操作的。LINGO提供了5种二元运算符:乘方 乘 除 加 减LINGO唯一的一元算术运算符是取反函数“”。这些运算符的优先级由高到底为:高(取反) 低运算符的运算次序为从左到右按优先级高低来执行。运算的次序可以用圆括号“()”来改变。例4.1 算术运算符示例。253,(24)5等等。4.1.2 逻辑运算符在LINGO中,逻辑运算符主要用于集循环函数的条件表达式中,来控制在函数中哪些集成员被包含,哪些被排斥。在创建稀疏集时用在成员资格过滤器中。LINGO具有种逻辑运算符:#not# 否定该操作数的逻辑值,not是一个一元运算符#eq#若两个运算数相等,则为true;否则为flase#ne# 若两个运算符不相等,则为true;否则为flase#gt# 若左边的运算符严格大于右边的运算符,则为true;否则为flase#ge# 若左边的运算符大于或等于右边的运算符,则为true;否则为flase#lt# 若左边的运算符严格小于右边的运算符,则为true;否则为flase#le# 若左边的运算符小于或等于右边的运算符,则为true;否则为flase#and# 仅当两个参数都为true时,结果为true;否则为flase#or# 仅当两个参数都为false时,结果为false;否则为true这些运算符的优先级由高到低为:高 #not# #eq# #ne# #gt# #ge# #lt# #le#低 #and# #or#例4.2 逻辑运算符示例2 #gt# 3 #and# 4 #gt# 2,其结果为假(0)。 4.1.3 关系运算符在LINGO中,关系运算符主要是被用在模型中,来指定一个表达式的左边是否等于、小于等于、或者大于等于右边,形成模型的一个约束条件。关系运算符与逻辑运算符#eq#、#le#、#ge#截然不同,前者是模型中该关系运算符所指定关系的为真描述,而后者仅仅判断一个该关系是否被满足:满足为真,不满足为假。 LINGO有三种关系运算符:“=”、“=”。LINGO中还能用“”表示大于等于关系。LINGO并不支持严格小于和严格大于关系运算符。然而,如果需要严格小于和严格大于关系,比如让A严格小于B:AB,那么可以把它变成如下的小于等于表达式:A+=B,这里是一个小的正数,它的值依赖于模型中A小于B多少才算不等。下面给出以上三类操作符的优先级:高#not# (取反) #eq# #ne# #gt# #ge# #lt# #le#and# #or#低 = 4.2 数学函数LINGO提供了大量的标准数学函数:abs(x) 返回x的绝对值sin(x) 返回x的正弦值,x采用弧度制cos(x) 返回x的余弦值tan(x) 返回x的正切值exp(x) 返回常数e的x次方log(x) 返回x的自然对数lgm(x) 返回x的gamma函数的自然对数sign(x) 如果x=0时,返回不超过x的最大整数;当x0时,返回不低于x的最大整数max(x1,x2,xn) 返回x1,x2,xn中的最大值min(x1,x2,xn) 返回x1,x2,xn中的最小值4.3 金融函数目前LINGO提供了两个金融函数。1fpa(I,n)返回如下情形的净现值:单位时段利率为I,连续n个时段支付,每个时段支付单位费用。若每个时段支付x单位的费用,则净现值可用x乘以fpa(I,n)算得。fpa的计算公式为净现值就是在一定时期内为了获得一定收益在该时期初所支付的实际费用。2fpl(I,n)返回如下情形的净现值:单位时段利率为I,第n个时段支付单位费用。fpl(I,n)的计算公式为 。细心的读者可以发现这两个函数间的关系: 4.4 概率函数1pbn(p,n,x)二项分布的累积分布函数。当n和(或)x不是整数时,用线性插值法进行计算。2pcx(n,x)自由度为n的2分布的累积分布函数。3peb(a,x)当到达负荷为a,服务系统有x个服务器且允许无穷排队时的Erlang繁忙概率。4pel(a,x)当到达负荷为a,服务系统有x个服务器且不允许排队时的Erlang繁忙概率。5pfd(n,d,x)自由度为n和d的F分布的累积分布函数。6pfs(a,x,c)当负荷上限为a,顾客数为c,平行服务器数量为x时,有限源的Poisson服务系统的等待或返修顾客数的期望值。a是顾客数乘以平均服务时间,再除以平均返修时间。当c和(或)x不是整数时,采用线性插值进行计算。7phg(pop,g,n,x)超几何(Hypergeometric)分布的累积分布函数。pop表示产品总数,g是正品数。从所有产品中任意取出n(npop)件。pop,g,n和x都可以是非整数,这时采用线性插值进行计算。8ppl(a,x)Poisson分布的线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从均值为a的Poisson分布。9pps(a,x)均值为a的Poisson分布的累积分布函数。当x不是整数时,采用线性插值进行计算。10psl(x)单位正态线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从标准正态分布。11psn(x)标准正态分布的累积分布函数。12ptd(n,x)自由度为n的t分布的累积分布函数。13qrand(seed)产生服从(0,1)区间的拟随机数。qrand只允许在模型的数据部分使用,它将用拟随机数填满集属性。通常,声明一个mn的二维表,m表示运行实验的次数,n表示每次实验所需的随机数的个数。在行内,随机数是独立分布的;在行间,随机数是非常均匀的。这些随机数是用“分层取样”的方法产生的。14rand(seed)返回0和1间的伪随机数,依赖于指定的种子。典型用法是U(I+1)=rand(U(I)。注意如果seed不变,那么产生的随机数也不变。4.5 变量界定函数变量界定函数实现对变量取值范围的附加限制,共4种:bin(x) 限制x为0或1bnd(L,x,U) 限制LxUfree(x) 取消对变量x的默认下界为0的限制,即x可以取任意实数gin(x) 限制x为整数在默认情况下,LINGO规定变量是非负的,也就是说下界为0,上界为+。free取消了默认的下界为0的限制,使变量也可以取负值。bnd用于设定一个变量的上下界,它也可以取消默认下界为0的约束。4.6 集操作函数LINGO提供了几个函数帮助处理集。1in(set_name,primitive_index_1 ,primitive_index_2,)如果元素在指定集中,返回1;否则返回0。2index(set_name, primitive_set_element)该函数返回在集set_name中原始集成员primitive_set_element的索引。如果set_name被忽略,那么LINGO将返回与primitive_set_element匹配的第一个原始集成员的索引。如果找不到,则产生一个错误。3wrap(index,limit)该函数返回j=index-k*limit,其中k是一个整数,取适当值保证j落在区间1,limit内。该函数相当于index模limit再加1。该函数在循环、多阶段计划编制中特别有用。4size(set_name)该函数返回集set_name的成员个数。在模型中明确给出集大小时最好使用该函数。它的使用使模型更加数据中立,集大小改变时也更易维护。 4.7 集循环函数集循环函数遍历整个集进行操作。其语法为function(setname(set_index_list)|conditional_qualifier:expression_list);function相应于下面罗列的四个集循环函数之一;setname是要遍历的集;set_ index_list是集索引列表;conditional_qualifier是用来限制集循环函数的范围,当集循环函数遍历集的每个成员时,LINGO都要对conditional_qualifier进行评价,若结果为真,则对该成员执行function操作,否则跳过,继续执行下一次循环。expression_list是被应用到每个集成员的表达式列表,当用的是for函数时,expression_list可以包含多个表达式,其间用逗号隔开。这些表达式将被作为约束加到模型中。当使用其余的三个集循环函数时,expression_list只能有一个表达式。如果省略set_index_list,那么在expression_list中引用的所有属性的类型都是setname集。1for该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不过for函数允许只输入一个约束,然后LINGO自动产生每个集成员的约束。2sum该函数返回遍历指定的集成员的一个表达式的和。3min和max返回指定的集成员的一个表达式的最小值或最大值。 4.8 输入和输出函数输入和输出函数可以把模型和外部数据比如文本文件、数据库和电子表格等连接起来。1file函数 该函数用从外部文件中输入数据,可以放在模型中任何地方。该函数的语法格式为file(filename)。这里filename是文件名,可以采用相对路径和绝对路径两种表示方式。file函数对同一文件的两种表示方式的处理和对两个不同的文件处理是一样的,这一点必须注意。2text函数该函数被用在数据部分用来把解输出至文本文件中。它可以输出集成员和集属性值。其语法为text(filename)这里filename是文件名,可以采用相对路径和绝对路径两种表示方式。如果忽略filename,那么数据就被输出到标准输出设备(大多数情形都是屏幕)。text函数仅能出现在模型数据部分的一条语句的左边,右边是集名(用来输出该集的所有成员名)或集属性名(用来输出该集属性的值)。 我们把用接口函数产生输出的数据声明称为输出操作。输出操作仅当求解器求解完模型后才执行,执行次序取决于其在模型中出现的先后。3ole函数OLE是从EXCEL中引入或输出数据的接口函数,它是基于传输的OLE技术。OLE传输直接在内存中传输数据,并不借助于中间文件。当使用OLE时,LINGO先装载EXCEL,再通知EXCEL装载指定的电子数据表,最后从电子数据表中获得Ranges。为了使用OLE函数,必须有EXCEL5及其以上版本。OLE函数可在数据部分和初始部分引入数据。OLE可以同时读集成员
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 论信息系统项目管理师考试中利益相关者的管理方法试题及答案
- 膳食模式与慢性病风险试题及答案
- 透视2024年专利代理人资格考试试题及答案
- 新冠疫苗注射试题及答案
- 解析2024年系统架构设计考试试题及答案
- 系统管理师考前知识总结与反思试题及答案
- 课前复习2025年计算机二级考试试题及答案
- 项目竞聘面试题及答案
- 高流量氧疗试题及答案
- 细化初级会计师考试科目内容试题及答案
- 胖东来企业文化指导手册
- 求是文章《开创我国高质量发展新局面》专题课件
- 智慧家庭健康监测系统设计与实现
- 光伏项目施工总进度计划表(含三级)
- 中深层无干扰地热供热系统应用技术规程
- 2024年江西省天然气投资有限公司招聘笔试冲刺题(带答案解析)
- 国开(山西)2024年《使用法律基础》形考作业1-4答案
- 2024年郑州铁路职业技术学院单招职业适应性测试题库附答案
- 充电桩安全管理规定(4篇)
- 医护患沟通技巧课件
- 《煤矿地质工作细则》矿安﹝2024﹞192号
评论
0/150
提交评论