lingo软件 优化问题
- 格式:ppt
- 大小:2.84 MB
- 文档页数:124
LINGO 程序框架LINGO 可以求解线性规划、二次规划、非线性规划、整数规划、图论及网络最优化问题和最大最小求解问题,以及排队论模型中最优化等问题.一个LINGO 程序一般会包括以下几个部分:(1)集合段:集部分是LINGO 模型的一个可选部分.在 LINGO 模型中使用集之前,必须在集部分事先定义.集部分以关键字“ sets: ”开始,以“ endsets ”结束.一个模型可以没有集部分,或有一个简单的 集部分,或有多个集部分.一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被 引用之前必须先定义.(2)数据段:在处理模型的数据时,需要为集部分定义的某些元素在值.数据部分以关键字"data: ”开始,以关键字"enddata "结束.LING O 的使用简介 LINGO 软件是美国的LINGO 系统公司开发的一套专门用于求解最优化问题的软件包. LINGO 除了能够 用于求解线性规划和二次规划外,还可以用于非线性规划求解、以及一些线性和非线性方程 (组)的求解 等.LINGO 软件的最大特色在于它允许优化模型中的决策变量为整数,即可以求解整数规划,而且执行速 度快.LINGO 是用来求解线性和非线性优化问题的简易工具. LING O 内置了一种建立最优化模型的语言,可 以简便地表达大规模问题,利用 LINGO 高效的求解器可快速求解并分析结果.在这里仅简单介绍 LINGO 的 使用方法. LINGO(Linear INteractive and General Op timizer ) 的基本含义是交互式的线性和通过优化求解 器.它是美国芝加哥大学的 Linus Schrage 教授于1980年开发了一套用于求解最优化问题的工具包,后来 经过完善成何扩充,并成立了 LINDO 系统公司.这套软件主要产品有: LINDO, LINGO, 口NDOAPI 和What ' sBest .它们在求解最优化问题上,与同类软件相比有着绝对的优势.软件有演示版和正式版.正式版包括: 求解包(solver suite) 、高级版(super)、超级版(hyper)、工业版(industrial) 、扩展版(extended).不 同版本的LINGO 对求解问题的规模有限制,如附表3 -1所示. 附表3 -1 不同版本LINGO 对求解规模的限制版本类型总变量数整数变量数非线性变量数 约束数演示版300 30 30 150 求解包 500 50 50 250 高级版 2000 200 200 1000 超级版8000 800 800 4000工业版 320003200 32000 16000扩展版 无限无限 无限无限LINGO 求解模型之前为其指定(3)目标和约束段:这部分用来定义目标函数和约束条件等•该部分没有开始和结束的标记•主要是要用到LINGO的内部函数,尤其是与集合有关的求和与循环函数等.(4)初始段:这个部分要以关键字“INIT ::开始,以关键字“ ENDINIT”结束,它的作用是对集合的属性定义一个初值•在一般的迭代算法中,如果可以给一个接近最优解的初始值,会大大减少程序运行的时间.(5)数据预处理段:这一部分是以关键字“ CALC”开始,以关键字“ ENDCAL”结束.它的作用是把原始数据处理成程序模型需要的数据,它的处理是在数据段输入完以后、开始正式求解模型之前进行的, 程序语句是按顺序执行的.LINGO中集合的概念在对实际问题建模的时候,总会遇至L群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等.LINGO允许把这些相联系的对象聚合成集(sets ). 一旦把对象聚合成集,就可以利用集来最大限度地发挥LING0建模语言的优势•现在将深入介绍如何创建集,并用数据初始化集的属性.集的构成集是LING0建模语言的基础,是程序设计最强有力的基本构件•借助于集能够用一个单一的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型.集是一群相联系的对象,这些对象也称为集的元素•一个集可能是一系列产品、卡车或雇员•每个集的元素可能有一个或多个与之有关联的特征,把这些特征称为属性•属性值可以预先给定,也可以是未知的,有待于LING0求解的.LINGO有两种类型的集:原始集(P rimitiveset)和派生集(derived set)一个原始集是由一些最基本的对象组成的.一个派生集是用一个或多个其它集来定义的,也就是说,它的元素来自于其它已存在的集.模型的集部分集部分在程序中又称为集合段,它是LINGO模型的一个可选部分.在LINGO模型中使用集之前,必须在集部分事先定义.集部分以关键字“sets: ”开始,以“ endsets ”结束.一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分•一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须先定义.(1)原始集的定义为了定义一个原始集,必须详细说明集的名字,而集的元素和相应的属性是可选的.定义一个原始集,用下面的语法:setname[/member_list/][:attnbute_list];注意:用“ [] ”表示该部分内容是可选的(下同)Setname是用来标记集的名字,最好具有较强的可读性.集名字必须严格符合标准命名规则:以拉丁字母或下划线为首字符,其后由拉丁字母、下划线、阿拉伯数字组成的总长度不超过32个字符的字符串,且不区分大小写.注意:该命名规则同样适用于集元素名和属性名等的命名.Member_list 是集元素的列表.如果集元素放在集定义中,那么对它们可采取显式和隐式罗列两种方式.如果集元素不放在集定义中,那么可以在随后的数据部分定义.① 当显式罗列元素时,必须为每个元素输入一个不同的名字,中间用空格或逗号隔开,允许混合使用.例定义一个名为friends 的原始集,它具有元素John,Jill ,Rose和Mike,其属性有sex和age:sets:friends/John Jill, Rose Mike/: sex, age;endsets② 当隐式罗列元素时,不必罗列出每个集元素.可采用如下语法:setname/member1..member N/[: attribute_list];这里的member是集的第一个元素名,membe N是集的最后一个元素名.LINGO将自动产生中间的所有元素名.LINGO也接受一些特定的首元素名和末元素名,用于创建一些特殊的集.③ 集元素不放在集定义中,而在随后的数据部分来定义.! 集部分;sets:friends:sex,age;endsets! 数据部分;data:friends,sex,age=John,1,16 Jill,0,14 Rose,0,17 Mike,1,13;enddata注意:开头用感叹号(!),末尾用分号(; )表示注释,可跨多行.在集部分只定义了一个集friends ,并未指定元素.在数据部分罗列了集元素John,Jill ,Rose 和Mike,并对属性sex和age分别给出了值.集元素无论用何种字符标记, 它的索引都是从1开始连续计数.在attribute_ list 可以指定一个或多个集元素的属性,属性之间必须用逗号隔开.LINGO内置的建模语言是一种描述性语言,用它可以描述现实世界中的一些问题, 然后再借助于LINGO 求解器求解.因此,集属性的值一旦在模型中被确定,就不可能再更改.只有在初始部分中给出的集属性值在以后的求解中可更改.这与前面并不矛盾,初始部分是 的.(2)定义派生集为了定义一个派生集,必须详细说明集的名字和父集的名字,而集元素和属性是可选的.可用下面的 语法定义一个派生集:setname(parent_set_list)[/member_list/][:attribute_list];setname 是集的名字. parent_set_list 是已定义的集的列表,多个时要用逗号隔开.如果没有指定成员列表,那么LINGO 会自动创建父集元素的所有组合作为派生集的元素. 也可以是其它的派生集.sets:product/A,B/; machine/M,N/; week/1..2/;allowed(product,machine,week):x; endsets编号(A,M,1) (A,M,2) (A,N,1) (A,N,2) (B,M,1) (B,M,2) (B,N,1) (B,N,2)元素列表被忽略时,派生集成员由父集成员所有的组合构成,这样的派生集成为稠密集.如果限制派 生集的成员,使它成为父集成员所有组合构成的集合的一个子集,这样的派生集成为稀疏集.同原始集一 样,派生集元素的说明也可以放在数据部分.一个派生集的元素列表有两种方式生成:①显式罗列;②设 置元素选择的过滤器.当采用方式①时,必须显式罗列出所有要包含在派生集中的元素,并且罗列的每个 元素要属于稠密集.使用前面的例子,显式罗列派生集的元素,如:allowed(product,machine,week)/A M 1,A N 2,B N 1/;如果需要生成一个大的、稀疏的集,那么显式罗列就十分麻烦.但是许多稀疏集的元素都满足一些条 件,可以把这些逻辑条件看作过滤器,在 LINGO 生成派生集的元素时把使逻辑条件为假的元素从稠密集中过滤掉.sets:!学生集:性别属性sex , 1表示男性,0表示女性;年龄属性 age; students/John,Jill,Rose,Mike/:sex,age; !男学生和女学生的联系集:友好程度属性friend ! [0,1]之间的数;linkmf(students,students)|sex(&1)#eq#1#and#sex(&2)#eq#0: friend; !男学生和女学生的友好程度大于的集 linkmf2(linkmf) | friend(&1, &2) #ge# : x; endsets data:LINGO 求解器的需要,并不是描述问题所必须派生集的父集既可以是原始集,LINGO 生成了三个父集的所有组合共八组作为allowed 集的元素,列表如下:元素sex,age =1 16,0 14,0 17,0 13; friend =,,; enddata用竖线(I )来标记一个元素过滤器的开始. #eq#是逻辑运算符,用来判断是否“相等” .&1可看作派生集的第1个原始父集的索引,它取遍该原始父集的所有元素;&2可看作派生集的第2个原始父集的索引, 它取遍该原始父集的所有元素; &3, &4,…,依此类推.注意如果派生集B 的父集是另外的派生集 A 那么上面所说的原始父集是集A 向前回溯到最终的原始集,其顺序保持不变,并且派生集集B 仍然有效.因此,派生集的索引个数是最终原始父集的个数,索引的取值是从原始父集到当前派生集 所作限制的总和.LINGO 数据部分和初始部分在处理模型的数据时,需要为集指定一些元素并且在 LINGO 求解模型之前为集的某些属性指定数值.为此,LINGO 为用户提供了两个可选部分:输入集元素数值的数据部分( 初始值的初始部分(Init Section ).数据部分(1)数据部分入门数据部分以关键字“ data: ”开始,“enddata ”结束.在这里,可以指定集元素和集的属性.其语法 如下:object_list = value_list;对象列(object_list )包含要指定值的属性名、要设置集元素的集名,用逗号或空格隔开.一个对 象列中只能有一个集名,而属性名可以有任意多个.如果对象列中有多个属性名,那么它们的类型必须一 致.数值列(value_list )包含要分配给对象列中对象的值,用逗号或空格隔开.注意属性值的个数必须 等于集元素的个数.sets:SET0/A,B,C/: X,Y; endsets data: X=1,2,3; Y=4,5,6; enddata在集SET 冲定义了两个属性 X 和Y . X 的三个值是1, 2, 3, Y 的三个值是4, 5, 6.也可采用如下例 子中的复合数据说明( data statement )实现同样的功能.sets:SET0/A,B,C/: X,Y; endsetsA 的过滤器对派生Data Section )和为决策变量设置X,Y=1 4 2,5 3 6;enddata如果对象列中有n个对象,LINGO在为对象指定值时,首先在n个对象的第1个索引处依次分配数值列中的前n个对象,然后在n个对象的第2个索引处依次分配数值列中紧接着的n个对象,…,依此类推.(2)参数输入在数据部分也可以指定一些标量变量( scalar variables ).当一个标量变量在数据部分确定时,称之为参数.例如,假设模型中用利率9%作为一个参数,就可以输入一个利率作为参数.data:interest_rate = .09;enddata实际中也可以同时指定多个参数.如:data:interest_rate,inflation_rate = .09, .025;enddata(3)实时数据处理在某些情况下,模型中的某些数据并不是定值.譬如模型中有一个参数在求解模型,观察模型2%至6%范围内,对不同的值的结果对参数依赖的程度,那么把这种情况称为实时数据处理.处理方法是在该语句的数值后面输入一个问号()interest_rate,inflation_rate = .09 ;enddata在每一次求解模型时,LINGO都会提示为参数inflation_rate 输入一个值.在WINDOW操作系统下,将会看到一个如下面的对话框:直接输入一个值再点击0K按钮,LINGO就会把输入的值指定赋给inflation_rate ,然后继续求解模型.除了参数之外,也可以实时输入集的属性值,但不允许实时输入集元素名.(4)指定属性为一个值可以在数据定义的右边输入一个值来把所有的元素的该属性指定为一个值.如下面的例子.sets:days /MO,TU,WE,TH,FR,SA,SU/:needs;endsetsdata:needs = 40;enddataLINGO将用40指定days集的所有元素的needs属性.对于多个属性的情形如下:sets:days /MO,TU,WE,TH,FR,SA,SU/:needs,cost;endsetsdata:needs cost = 40 90;enddata(5)数据部分的未知数值表示法有时候只需为一个集的部分元素的某个属性指定数值,而让其余元素的该属性是未知的,以便让LINGO 去求出它们的最优值.在数据定义中输入两个相连的逗号表示该位置对应元素的属性值未知,两个逗号间可以有空格.sets:years/1..6/: capacity;endsetsdata:capacity = ,24,40,,,;属性capacity的第2个和第3个值分别为24和40,其余的未知.初始部分初始部分是LINGO提供的另一个可选内容•在初始部分中,与数据部分中的数据定义相同,可以输入初始定义(initialization statement ).在对实际问题的建模时,初始部分并不起到描述模型的作用,初始部分输入的值仅被LING 0求解器当作初始值来使用,并且仅仅对非线性模型有用•这与数据部分指定变量的值不同,LINGO求解器可以自由改变初始部分初始化变量的数值.一个初始部分以关键字“init: ”开始,以关键字“ endinit ”结束.初始部分的初始定义规则和数据部分的数据定义规则相同•也就是说,可以在定义的左边同时初始化多个集属性,即可以把集属性初始化为一个数值,也可以用问号定义为实时数据,还可以用逗号指定为未知数值.init:X,Y = 1,0;endinitY=@log(X);XA2+YA2<=I;LINGO函数运算符及其优先级LINGO中的运算符可以分为三类:算数运算符、逻辑运算符和关系运算符.(1) 算数运算符算数运算符分为5种:(加法),(减法),(乘法),(除法),(求幂).逻辑运算符逻辑运算符分为两类:#AND#(与),#OR#(或),#NOT#非):这3个运算符是参与逻辑值之间的运算,其结果还是逻辑值.运算符#EQ#等于),#NE#(不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于)是用于“数与数之间”的比较,其结果是实逻辑值.关系运算符LINGO中有3种关系运算符:<(小于等于),>(大于等于),=(等于).注意LINGO中优化模型的约束一般没有严格大于、严格小于,要和逻辑运算符区分开.运算符的优先等级如附表3-2所示.附表3-2运算符的优先级优先级运算符#N0# ,-(负号)*,/高级#EQ#,#NE#,# GT#,# GE## LT#,#LE#,#AN#,#OR最低LINGO数学函数(1)基本数学函数LINGO中有相当丰富的数学函数,这些函数的用法简单.下面列表对各个函数的用法做简单的介绍,具体情况如附表3-3所示.(2)集合循环函数集合循环是指对集合上的元素(下标)进行循环操作的函数,它的一般用法如下:@function(setname[(set_index_list)[|condition]]:ex pression_list)其中function 是集合函数名,是FOR,MAX,MIN,PROD,SU五种之一.setname 是集合名;set_index_list是集合索引列表(可以省略);condition 是实用逻辑表达式描述的过滤条件(通常含有索引,可以省略); expression_list 是一个表达式(对@FO可以是一组表达式).下面对具体的集合函数作如下解释:@FOR集合元素的循环函数):对集合setname的每个元素独立生成表达式,表达式由expression_list 描述.@MAX|合属性的最大值):返回集合setname上的表达式的最大值.@MIN集合属性的最小值):返回集合setname上的表达式的最小值.@PROD|合元素的乘积函数):返回集合setname上的表达式的积.@SUM|合元素的求和函数):返回集合setname上的表达式的和.表附3-3(3)集合操作函数集合操作函数是对集合进行操作的函数,主要有4种,下面分别介绍它们的一般用法.1)@INDEX([set_name,]primitive_set_element)这个函数给出元素primitive_set_element 在集合set_name中的索引值(即按定义集合时元素出现顺序的位置编号).如果省略编号set_name, LINGO按模型中定义的集合顺序找到第一个含有元素primitive_set_element 的集合,并返回索引值.通过下面例子解释函数的使用方法.例如,假设定义一个女孩的姓名集合和一个男孩的姓名集合:SETS:GIRLS/DEBBLE,SUE,ALICE/;BOYS/BOB,JOE,SUE,FRED/;ENDSETS注意到女孩集和男孩集中都有一个为SUE的元素,如果要调用此函数@INDEX(SUE)则得到返回索引值是2.因为集合GIRLS在集合BOYS>前,则索引函数只对集合GIRLS检索.如果想查找男孩集中的SUE则应该使用@INDEX(BOYS,SU,)则此时得到的索引值是 3.2)@IN(set_name,primitive_index_1[,pnmitive_index_2这个函数用于判断一个集合中是否含有某个索引值.它的返回值是“假”).例全集为I , B是I的一个子集,C是B的补集.sets:l/x1..x4/; …])1(逻辑值“真”),或是0(逻辑值B(I)/x2/;C(I)|#not#@in(B,&1):;endsets3)@wrap(index,limit)该函数返回j=index-k*limit ,其中k 是一个整数,取适当值保证j 落在区间[1 ,limit] 内.该函数相当于index 模limit 再加1.该函数在循环、多阶段计划编制中特别有用.4)@size(set_name)该函数返回集set_name的元素个数.在LINGO模型中,如果没有明确给出集的大小,则使用该函数能够使模型中的数据变化和集的大小改变更加方便.(4)变量定界函数变量界定函数能够实现对变量取值范围的附加限制,共4种:1) @bin(x) 表示限制就是x 为0或1;2) @bnd(L,x,U) 表示限制变量x 满足;3) @free(x) 表示取消对变量x 的默认下界为0的限制,x 可以取任意实数;4) @gin(x) 表示限制变量x 为整数.在默认情况下,LINGO规定变量是非负的,即下界值为0,上界为+S. @free取消了默认的下界为0的限制,使变量也可以取负值.@bnd用于设定一个变量的上下界, 它也可以取消默认下界为0的约束.(5)概率论中相关函数1)@pbn(p,n,x)二项分布的分布函数,当n和(或)x不是整数时, 用线性插值法进行计算.2)@pcx(n,x)自由度为n的X 2分布的分布函数在x点的取值.3)@peb(load,x)当到达负荷(平均服务强度)为load ,服务系统有x 个服务台,且系统容量无限时的Erlang 繁忙概率,多用于解决排队问题.4)@pel(load,x)当到达负荷(平均服务强度)为load ,服务系统有x 个服务台,系统容量为有限时的Erlang 繁忙概率,多用于解决排队问题.5)@pfd(n,d,x)自由度为n 和 d 的 F 分布的分布函数在x 点的取值.6)@pfs(load,x,c)当负荷上限为load,顾客数为C,平行服务台数量为x 时,顾客源有限的Poisson 服务系统的等待或有返回顾客数的期望值. load 是顾客数乘以平均服务时间,再除以平均返回时间.当 C 和(或) x 不是整数时,采用线性插值进行计算.7)@phg(pop,g,n,x)超几何( Hypergeometric )分布的分布函数. pop 表示产品总数,g 是正品数.从所有产品中任意取出n (nw pop)件.pop, g, n和x都可以是非整数,这时采用线性插值进行计算.8)@ppl(a,x)Poisson 分布的线性损失函数, 即返回max(0,z-x) 的期望值,其中随机变量z 服从均值为 a 的Poisson分布.9)@pps(a,x)均值为a的Poisson分布的分布函数在x点的取值.当x不是整数时,采用线性插值进行计算.10)@psl(x)单位正态线性损失函数,即返回max(0,z-x) 的期望值,其中随机变量z 服从标准正态分布.11)@psn(x)标准正态分布的分布函数在x 点的取值.12)@ptd(n,x)自由度为n的t分布的分布函数在x点的取值.13)@qrand(seed)产生(0,1)区间的拟随机数.@qrand只允许在模型的数据部分使用,它将用拟随机数填满集属性•通常定义一个mx n的二维表,m表示运行实验的次数,n表示每次实验所需的随机数的个数•在行内,随机数是独立分布的;在行间,随机数是非均匀的.这些随机数是用“分层取样”的方法产生的.(6)金融函数目前LING0提供了两个金融函数.1)@fpa(I,n)返回如下情形的净现值:单位时段利率为I ,连续n 个时段支付,每个时段支付单位费用.若每个时段支付x单位的费用,则净现值可用x乘以@fpa(I,n)得到.@fpa的计算公式为净现值就是在一定时期内为了获得一定收益,在该时期初所支付的实际费用.2)@fpl(I,n)返回如下情形的净现值:单位时段利率为I ,第n 个时段支付单位费用. @fpl(I,n) 的计算公式为这两个函数间的关系:7)输入和输出函数输入和输出函数可以把模型与外部数据(如文本文件、数据库和电子表格等)连接起来.1) @file 函数该函数用于从外部数据文件中输入数据,它可以放在模型中任何地方.该函数的语法格式为@file( ' filename ') .这里filename 是文件名,可以采用相对路径和绝对路径两种表示方式.记录结束标记( ~)之间的数据文件部分称为记录.如果数据文件中没有记录结束标记,那么整个文件被看作单个记录.除了记录结束标记外,从模型外部调用的文本和数据同在模型里是一样的.下面介绍一下在数据文件中的记录结束标记连同模型中@file 函数调用是如何工作的.当在模型中第一次调用@file函数时,LINGO打开数据文件,然后读取第一个记录;第二次调用@file 函数时,LINGO读取第二个记录等等.文件的最后一条记录可以没有记录结束标记,当遇到文件结束标记时,LINGO会读取最后一条记录,然后关闭文件.如果最后一条记录也有记录结束标记,那么直到LINGO 求解完成模型后关闭该文件.注意,如果有多个文件同时保持打开状态,可能就会导致一些问题,LINGO允许同时打开文件的上限数是16.在LING0中不允许嵌套调用@file函数.2)@text 函数该函数被用在数据部分,用来把求解结果输出至文本文件中.它可以输出集元素和集属性值.其语法@text([ ' filename '])这里filename 是文件名,可以采用相对路径和绝对路径两种表示方式.如果忽略filename ,那么数据就被输出到标准输出设备(大多数情形都是屏幕) . @text 函数仅能出现在模型数据部分的一条语句的左边,右边是集名(用来输出该集的所有元素名)或集属性名(用来输出该集属性的值)用接口函数产生输出的数据定义称为输出操作.输出操作仅当求解器求解完模型后才执行,执行次序取决于其在模型中出现的先后.3) @ole函数@0L是从EXCE冲引入或输出数据的接口函数,它是基于传输的OLE技术.OLE传输直接在内存中传输数据,并不借助于中间文件•当使用@OL时,LINGO先装载EXCEL再通知EXCEI装载指定的电子数据表,最后从电子数据表中获得Ranges.为了使用@ OLE函数,必须有EXCEL及其以上版本.@ OLE函数可在数据部分和初始部分引入数据.@OL可以同时读集元素和集属性, 集元素最好使用文本格式,集属性最好使用数值格式. 原始集每个集元素需要一个单元(cell),而对于n 元的派生集每个集元素需要n 个单元,这里第一行的n 个单元对应派生集的第一个集元素,第二行的n 个单元对应派生集的第二个集元素,依此类推.4) @ranged(variable_or_row_name)为了保持最优基不变,变量的费用系数或约束行的右端项允许减少的量.5)@rangeu(variable_or_row_name)为了保持最优基不变,变量的费用系数或约束行的右端项允许增加的量.6)@status()返回LINGO求解模型后的结束状态:0 --- Global Optimum (全局最优) ;1 --- Infeasible 不可行);2 --- Unbounded (无界);3 --- Undetermined (不确定);4 --- Feasible (可行);5 ——Infeasible or Unbounded (通常需要关闭“预处理”选项后重新求解模型,以确定模型究竟是不可行还是无界)6 --- Local Optimum (局部最优);7 --- Locally Infeasible (局部不可行,尽管可行解可能存在,但是LINGO并没有找到一个);8 --- Cutoff (目标函数的截断值被达到)9 --- Numeric Error (求解器因在某约束中遇到无定义的算术运算而停止)通常,如果返回值不是0, 4或6时,那么解将不可信,几乎不能用.该函数仅被用在模型的数据部分来输出数据.7)@dual(vanable_or_row_name)返回变量的判别数(检验数)或约束行的对偶(影子)价格(dual Prices ).(8)辅助函数1) @if(logical_condition,true_result,false_result)@if函数将评价一个逻辑表达式logical_condition 是否为真,如果为真,返回true_ result,否则返回false result2) @warn(' text ' ,logical_condition)如果逻辑条件logical_condition 为真,则产生一个内容为’text '的信息框.3)@user(user_determined_arguments)该函数允许用户自己编写函数,可以用c语言等编写,返回值为用户函数计算的结果.3. 5 LINGO程序出错信息。
首页一、Lingo简介1. 目标函数一个函数解析式,你希望求它的最大或最小值max=函数解析式;或min=函数解析式;例max=3*b+2*c^2;min=b^(1/3)-c*k;Lingo的语句以; 号结束。
2. 运算加(+),减(-),乘(*),除(/),乘方(x^a)3. 变量用字母或字母数字的组合表示例a,b,cc1,x1。
Lingo的变量缺省值为非负数。
4. 限制条件一组等式或不等式。
Lingo的>,<与>=,<=等价。
示例程序13*x1+5*x2>=45;Lingo的注释语句用!开头用;结束。
5. 变量类型变量类型说明@bin( 变量名) ; 限制该变量为0或1。
@bnd( a,变量名, b); 限制该变量介于a,b之间。
@free(变量名); 允许该变量为负数。
@gin( 变量名); 限制该变量为整数。
二、Lingo高级sets语句连续六个月的产量,可以用x1,x2,x3,x4,x5,x6表示, 但十二个月的产量用同样的方法表示就显繁琐。
Lingo可以通过sets语句设置数组功能使问题变得简单。
例定义数组x, 有x(1),x(2),x(3),x(4)…x(12)个成员,用以表示十二个月的产量。
sets:r/1..12/:x; !r是组的类型名,x数组名;endsets;sets语句以sets开头,endsets结束。
示例程序2data语句有时,我们要用到常数数组,比如在400*x(1)+200*x(2)+150*x(3)+500*x(4)>=500中,x(1), x(2), x(3), x(4)的系数分别为400, 200, 150, 500,此时,可用data语句。
例定义数组a, 其中a(1)=400,a(2)=200,a(3)=150,a(4)=500。
sets:l/1..4/: a,x;endsetsdata:a=400 200 150 500;enddatadata语句是以data开头,enddata结尾。
学号系统工程与运筹学课程设计设计说明书层次分析法应用系统最优化问题起止日期:2013年11月25 日至2013 年11月29日学生姓名班级成绩指导教师经济与管理学院2013年11月29日成绩评定表目录Ⅰ研究报告 (1)课程设计题目1:改革新形式下的大学生形象评价 (1)1.问题的提出 (1)2.分层递阶结构模型 (2)3.判断矩阵及相关计算结果 (2)4.单排序及总排序计算过程及结果 (6)5.结果分析 (6)5.1结果 (6)5.2分析 (6)课程设计题目2:人员合理分配问题 (7)1.问题的提出 (7)2.问题分析 (7)3.基本假设与符号说明 (7)4.模型的建立及求解结果 (8)5.模型评价 (9)课程设计题目3:生产调运问题 (10)1.问题的提出 (10)2.问题分析 (11)3.基本假设与符号说明 (11)4.模型的建立及求解结果 (12)5.模型评价 (18)II工作报告 (19)III 参考文献 (20)附件一:人员合理分配问题lingo程序及结果 (21)附件二:生产调运问题lingo程序及结果 (22)Ⅰ研究报告课程设计题目1:改革新形式下的大学生形象评价摘要:大学生如何塑造个人形象?首先我们要了解形象这个概念以及它的重要性,得体的塑造和维护形象,会给初次见面的人以良好第一印象。
塑造大学生形象还要关注社会,放眼世界,注重群体性,同时作为大学生形象塑造最重要主体的大学生,在平时学习、生活中就应该有意识地培养、塑造自身形象,为自己在人际交往过程中、特别是未来就业求职道路上增加重要的竞争砝码。
有的人说青春就是最好的包装,天生丽质、潇洒帅气就是大学生的理想形象。
但是,我们觉得所谓的形象,并不能简单地理解为人的外表特征,更应是人的精神和内在素质通过外表的一种自然流露和表现;大学生必须在学习和实践中不断扩展自己的知识面,掌握一定的技能,如果只重外表,不重内涵构造出来的形象,则只能是肤浅和苍白无力的。
数学建模精讲_西南交通大学中国大学mooc课后章节答案期末考试题库2023年1.Lingo软件是常用的优化问题的求解软件。
参考答案:正确2.0-1规划是整数规划。
参考答案:正确3.求解整数规划一定能得到最优解。
参考答案:错误4.整数规划是指规划问题中的全部变量限制为整数。
参考答案:错误5.所有决策变量均要求为整数的整数规划称为纯整数规划。
参考答案:正确6.整数规划与线性规划不同之处在于增加了整数约束。
参考答案:正确7.分枝定界法是整数规划的常见算法。
参考答案:正确8.原线性规划有最优解,当自变量限制为整数后,其整数规划也一定有最优解。
参考答案:错误9.整数规划最优解常可以按照实数最优解简单取整而获得。
参考答案:错误10.与线性规划连续的可行域不同,整数规划的可行域是离散的。
参考答案:正确11.整数规划由于限制变量是整数,增加了求解难度,但整数解是有限个,所以有时候可以采用枚举法。
参考答案:正确12.非线性规划已经有一般的适合所有问题的成熟的解法。
参考答案:错误13.非线性规划的局部最优解和全局最优解等价。
参考答案:错误14.多目标规划的目标函数多于1个。
参考答案:正确15.非线性规划是指规划模型的目标函数或者约束条件中至少有一个为非线性表达式。
参考答案:正确16.多目标规划的解法包括分枝定界法,单纯形法。
参考答案:错误17.根据地球上任意两点的经纬度就可以计算这两点间的距离。
参考答案:正确18.如果可能,把非线性规划转换为线性规划是非常好的一个思路,原因是线性规划有比较成熟的算法。
参考答案:正确19.Lingo软件求解非线性规划的结果都是全部最优解。
参考答案:错误20.求解多目标规划的线性加权和法,在确定权系数之前,一般要对目标函数值做统一量纲处理,其目的是避免出现大数吃小数、权系数失去其作用的问题。
参考答案:正确21.哥尼斯堡七桥问题由欧拉证明了是可以走通的。
参考答案:错误22.“健康中国2030”规划纲要其中一项主要指标是将我国人均预期寿命提升至79岁左右。
附录Ⅱ Lingo 软件初步生产实践中的很多问题可以归结为如下决策问题:在若干个可行方案中选择一个最优的,称为最优化问题.优化问题中,方案可用n 维向量Tn x x x x ),,,(21 表示,可行方案集合用 表示,方案x 的优劣用指标)(x f 衡量.x 称为决策变量,)(x f 称为目标函数, 称为可行域, 常用一组等式或不等式来界定,称为约束条件.优化问题的一般形式为:nji xR D x l j x h m i x g t s x f ,...,2,1 0)(,...,2,10)(..)(max (Ⅰ)在(Ⅰ)中,如果)(),(),(x h x g x f j i 均为线性函数,则问题(Ⅰ)称为线性规划(Linear Programming ,简称LP );如果目标函数为二次函数,约束条件为线性函数,则问题(Ⅰ)称为二次规划(QP );如果决策变量(全部或部分)为整数,则问题(Ⅰ)称为整数规划; 问题(Ⅰ)中满足约束条件的解称为可行解,使目标函数达到最优的可行解称为问题的最优解.Lingo 软件主要用于求解上述几种优化问题的最优解.Lingo 软件是由美国Lindo 系统公司研制开发的求解大型数学规划问题的优化计算软件包,它可以用来求解线性规划、整数规划、二次规划和非线性规划等.该软件执行速度快,易于输入、修改、求解和分析优化问题.关于该软件的详细信息可查阅网站.2.1 Lingo 入门在windows 下开始运行Lingo 系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下.在主窗口内有一个标题为LINGO Model – LINGO1的窗口,它是Lingo 的默认模型窗口,建立的模型都要在该窗口内编码实现.下面结合一个例子说明如何在Lingo 窗口中输入Lingo 模型.例1 求解下面整数规划问题}1,0{,,,201054 ..63105 max 432143214321x x x x x x x x t s x x x x z 在模型窗口1中输入下面指令:model :max =5*x1+10*x2+3*x3+6*x4; x1+4*x2+5*x3+10*x4<=20;@bin (x1);@bin (x2);@bin (x3);@bin (x4);end然后点击工具条上的Solve 按钮(或按Ctrl+S 键)即可运行上面程序求解给定问题. 显然,使用Lingo 软件求解优化问题非常方便,但在使用时还需注意下面几点事项:(1)Lingo 中模型以“model :”开始,以“end ”结束,是由一系列语句组成,每个语句都是以分号“;”结尾;(2)Lingo 中模型的目标函数用MAX=…;或MIN=…;给出; (3)Lingo 中模型的系数与变量之间的乘号不能省略,用“*”表示;(4)Lingo 中不区分大小写字母,但其变量名不能超过32个字符,且必须以字母开头;(5)用Lingo 解优化模型时假定所有变量非负(此假定可以用函数@free 取消);(6)Lingo 中所有的函数均以“@”符号开始,如约束中@gin(x1)表示x1为整数, @bin(x2)表示x2为0,1;(7)Lingo 中以感叹号“!”开始的是注释语句,注释语句也必须以分号“;”结尾. 2.2 Lingo 模型的基本要素在2.1节的例1中,问题的决策变量和约束条件数目较少,这样即使全部输入也很方便,但在实际建模时,总会遇到含有大量决策变量或约束条件的问题,要把它们一条条输入是不现实的,而如果只用一行文字就可以建立起含有大规模变量的目标函数和成千上万条约束,显然对于求解较大规模问题是非常有利的,Lingo 软件借助集这个概念很好地解决了这个难题.下面通过一个例子介绍集这个重要概念以及Lingo 模型的其它基本要素.例2 自来水输送问题某市有甲、乙、丙、丁四个居民区,自来水由C B A ,,三个水库供应.四个区每天必须得到保证的基本生活用水量分别为30,70,10,10千吨,但由于水源紧张,三个水库每天最多只能分别供应50,60,50千吨自来水.由于地理位置的差别,自来水公司从各水库向各区送水所需付出的饮水管理费不同(见附表2-1,其中C 水库与丁区之间没有输水管道),其他管理费用都是450元/千吨.附表2-1 从水库向各区送水的引水管理费额外用水量,分别为每天50,70,20,40千吨.该公司应如何分配供水量,才能获利最多?解:记)3,2,1( i i 分别表示C B A ,,三个水库,)4,3,2,1( j j 分别表示甲、乙、丙、丁四个居民区,ij ij p x ,分别表示水库i 对居民区j 的日供水量和单位引水管理费,)2,1( k r kj 分别表示居民区j 的基本生活用水量和额外用水量,i s 表示水库i 的最大供水量.记)(),(),(kj ij ij r R p P x X ,则R P X ,,都是二维数组,且X 和P 为3行4列,而R 为2行4列;再记)(i s S ,则S 为一维数组,且有4个元素.上述记号中S R R P ,,,21为已知数组,而X 则为待求数组.下面建立这个问题的模型.问题的目标要求公司获利最多,但没有给出单位利润,而只给出了相应的引水管理费,显然此费用最少便可以使得公司获利最多,于是有目标函数:3141mini j ij ijp x(2.2.1)水库的供应量有限,水库i 供给所有居民区的用水总量不能超出其最大供水量,且显然供水越多,收益越大,于是有3,2,1, 41i s xi j ij(2.2.2)水库供水必须满足居民的基本生活用水量,至于额外用水量为使公司利益最大化应尽可能满足,于是有:4.3.2.1, 21311j r xr k kj i ijj (2.2.3)再注意到034 x 且决策变量非负,便可以建立供水问题的数学模型.在上述问题中,目标函数(2.2.1)式为12项乘积的和,约束条件(2.2.2)和(2.2.3)共含有7个不等式,如果问题的水库数目和居民区数目增加到上百个,则前面的几个数字便会迅速膨胀,处理非常麻烦;同时也注意到,即使水库数目和居民区数目增加再多,也可以用上面三个式子给予表示,基于此点Lingo 软件引进集这个概念,处理规模较大的规划问题.利用集求解上述模型,相应指令如下:model : sets :jumin/1,2,3,4/; shuiku/1..3/:S; var/1,2/;gongshui(shuiku,jumin):X,P,A; yongshui(var,jumin):R; endsets data :S=50,60,50;P=160,130,220,170, 140,130,190,150, 190,200,230,0; A=1,1,1,1, 1,1,1,1, 1,1,1,0; R=30 70 10 10 50 70 20 40; enddatamin =@sum (gongshui:P*X);@for (shuiku(i):@sum (jumin(j):X(i,j)*A(i,j))=S(i)); @for (jumin(j):@sum (shuiku(i):X(i,j)*A(i,j))>=R(1,j);@sum (shuiku(i):X(i,j)*A(i,j))<=R(1,j)+R(2,j););end其中语句“shuiku/1..3/:S;”定义了一个集shuiku ,{1,2,3}为其成员,而S 则称为该集的属性,每个S 都含有3个成员,这是集shuiku 的特征;语句“gongshui(shuiku,jumin):X,P,A;”也定义了一个集gongshui ,这个集是有shuiku 和jumin 两个集生成的,称为派生集,是一个3行4列的数组,X,P,A 为其属性.由上述模型看以看到,Lingo 模型主要由三部分语句组成: (1)集定义部分(从“sets:”到“endsets ”):定义集及其属性,定义了5个集:jumin,shuiku,var,gongshui 和yongshui.(2)数据输入部分(从“data:”到“enddata ”):给出常量P S R ,,以及辅助常量A 的值.有时需要在运行时才对某个参数赋值,此时可在数据段用语句“变量名=?”实现.求解时,Lingo 系统会给出提示界面,等待用户输入该变量的数值后,才继续执行程序.(3)其它部分:给出目标函数和约束条件. 目标函数(“min=@sum(gongshui:P*X);”)是用求和函数@sum 定义的,约束条件是用循环函数“@for (集(下标):关于集的属性的约束关系式)”定义的,其用法见2.5.2节.需要注意的是,本例中C 水库与丁区之间没有输水管道,即0)4,3( X ,为体现这一点,程序中引入一个辅助矩阵A .运行程序可得全局最优解01004010050000500X ,最少管理费为24400.00(元). Lingo 模型最基本的要素除了前面给出的三大部分语句外,还包括一个“初值设定(init )部分”;从Lingo 9.0开始,又增加了一个“计算(calc )”部分. (4)初始部分(init ):要求以“init:”开始,以“endinit ”结束,主要用于对集的属性(数组)定义初值(因为求解算法一般是迭代算法,所以用户若能给出一个较好的迭代初值,对提高算法的计算效果是有帮助的).其定义格式为:attribute (属性)=value_list (常数列表);(5)计算部分(calc ):要求以“calc:”开始,以“endcalc ”结束,作用在于对一些原始数据进行计算预处理,它是在数据部分的数据输入完成以后,Lingo 开始正式求解模型之前进行的.一般来讲,Lingo 模型由上面5个部分(又称为5个段):集段、目标与约束段、数据段、初始段和计算段组成.2.3 Lingo 的集Lingo 中集的引入对于处理较大规模优化问题是很有帮助的.集是Lingo 建模语言的基础,借助于集,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型.2.3.1 集的定义集(set )是一组相关对象的集合.集中的每个元素可以有一个或多个相关的特征,称为属性.属性可以是已知的,也可以是未知有待求解的.一个集中必需包含以下几部分:集的名字(set_name )、集的成员(number_list )以及集中成员的属性(attribute_list ),其形式为:sets :Set_name/number_list/:attribute_list ; endsets如:定义一个名为Student 的初始集,它具有成员John 、Mary 和Mike ,属性有性别sex 和年龄age ,可定义为:sets :Student/John,Mary,Mike/:sex,age;endsets上述定义方法称为直接列举法.此外,Lingo 还允许定义一个具有n 个成员的集而不需要为每个成员命名,称为隐式列举法,如:定义一个名为col 的三维向量b,可作如下定义:sets :col/1..3/: bendsets2.3.2 基本集与派生集Lingo 软件中有两类集,一类是基本集(primary set ),它把元素直接列举出来,如2.2节例2中的jumin 和shuiku ;还有一类集,如gongshui ,它是由集shuiku 和集jumin 生成得到的.集gongshui 中的元素是集shuiku 和集jumin 的元素组合成的有序二元组,从数学上看gongshui 就是shuiku 和jumin 的笛卡儿积,即jumin ,shuiku |),{(gongshui t s t s类似gongshui 这种基于其它集而派生出来的集,称为派生集(derived set ).派生集的定义格式为:set_name(parent_set_list)[/member_list/][:attribute_list];其中parent_set_list 为派生集sername 的父集,如(set1,set2,…),它们可以是基本集,也可以是派生集.member_list 为元素列表,它可以在集定义中出现,也可以在数据段以赋值语句的方式给出.2.3.3 稠密集与稀疏集2.2节例2中把派生集gongshui 的元素定义为基本集shuiku 和jumin 的笛卡儿积,即包含了两个基本集构成的所有二元有序对.这种派生集又称为稠密集,如routes(warehouse ,customer):cost ,vol ;除了稠密集,Lingo 软件还给出了一种派生集,定义为笛卡儿集的一个真子集,称为稀疏集,下面通过一个例子介绍这种派生集.例3 已知如附图 2.1所示的单行线交通网,弧旁的数字表示通过这条单性线所需要的费用.现在某人要从1v 出发,通过这个交通网到8v 去,求使总费用最小的旅行路线.附图2.1 交通网路图显然如果1v 到8v 的最优旅行路线P 经过5v (适应与其它情况),则P 中从1v 到5v 的子路线也一定是从1v 到5v 的最优行驶路线.因此,为了得到1v 到8v 的最优行驶路2v 1v 3v 4v 5v 6v 7v 92134178v 69521368线,只需先求出1v 到)7,6,5( k v k 的最优行驶路线,便可以得到从1v 到8v 的最优行驶路线.依此类推,将1v 到8v 的行驶过程分成3个阶段,即)4,3,2(1 i v v i ,)7,6,5( j v v j i ,8v v j ,求出各个阶段的最优旅行路线,于是便容易求出1v 到到8v 的最优旅行路线.记),(Y X d 为交通点X 到Y 的直接费用(若这两个点没有道路连接,则可以认为交通费用为无穷大),用)(Y L 表示交通点1v 到Y 的最有旅行路线费用,则根据上述思想可建立模型如下:11)},,()({min )(;0)(v Y Y X d X L Y L v L YX下面用Lingo 软件求解上述模型.定义“cities ”(表示交通点)是一个基本集,其元素通过枚举给出,L 为其对应的属性变量(表示所求的最小交通费用);“road ”(旅行路线)是由cities 生成的一个派生集,由于只有部分交通点之间有旅行路线,所以应定义为一个稀疏集,其元素也通过枚举给出,d 是其对应的属性变量(表示给定的交通费用).建立Lingo 模型如下:model : sets :cities/v1..v8/:L; roads(cities,cities)/ v1,v2 v1,v3 v1,v4v2,v4 v2,v5 v3,v4 v3,v7 v4,v5 v4,v6 v4,v7 v5,v6 v5,v8 v6,v7 v6,v8 v7,v8/:d; endsets data : d=2 1 86 17 9 5 1 2 3 9 4 6 3;L=0,,,,,,,;!对L 进行赋值,后面的“,”代表未知的L 值,一个也不能少; enddata@for (cities(i)|i#GT#@index (v1):! @index (v1)是@index (cities,v1)的缩写,返回v1在集cities 中的索引值; L(i)=@min (roads(j,i):L(j)+d(j,i));); !本程序中没有目标函数,这在Lingo 中是允许的; end运行得1v 到8v 的最小交通费用为12,最优旅行路线为:8521v v v v 或86521v v v v v .例3通过枚举法定义了一个稀疏集,其定义格式为:set_name(parent_sets)/explicit_list/[:attributes];当元素较多时枚举法显然不是很方便,所以Lingo还提供了另外一种方法定义稀疏集,称为“元素过滤法”,它可以通过一些过滤条件系统的从父集中过滤一些真正需要的元素,其定义格式为:set_name(parent_sets)|condition[:attributes];如:“pair(obj,obj)/&2#LT#&1:c,x;”,其中&2#LT#&1为过滤条件,表示第2个父集元素的索引值(用“&2”表示)大于第1个父集元素的索引值(用“&1”表示).2.4 Lingo的运算符Lingo是一种编程语言,它有自己的运算符,即算术运算符、逻辑运算符和关系运算符.这些运算符若使用恰当,编程是非常方便的.2.4.1 算术运算符Lingo的算术运算符与Matlab的相同,具体有以下5种:+(加法),-(减法或负号),*(乘法),/(除法),^(求幂)2.4.2 逻辑运算符Lingo软件提供了丰富的逻辑运算符进行程序设计,具体见附表2-2.在Lingo中,逻辑运算通常作为过滤条件使用.附表2-2 逻辑运算符2.4.3关系运算符Lingo软件提供了三个关系运算符,用于表示优化模型的约束条件,即=(等于),<=(小于等于)和>=(大于等于)由于优化模型中约束一般没有严格小于或严格大于关系,所以Lingo默认“<”等同于“ ”,“>”等同于“ ”.Lingo的三类运算符的优先级如附表2-3所示(同一优先级按从左到右的顺序执行;若有括号,则优先计算括号内的表达式).附表2-3 运算符的优先级优先级运算符最高 #NOT#,-(负号)^*,/+,-(减法)#EQ#,#NE#,#GT#,#GE#,#LT#,#LE##AND#,#OR#最低 < ,= , >2.5 Lingo的函数在2.2例2中的@sum和@for称为Lingo的内部函数,在Lingo中建立优化模型时引用这些内部函数,可以简化运算,这些函数均以@开始.2.5.1 基本的数学函数Lingo中包括相当丰富的数学函数,其用法非常简单,具体见附表2-4.附表2-4 基本的数学函数2.5.2 集循环函数集循环函数是指对集上的元素(下标)进行循环操作的函数,其使用格式为:@function(set_name[(set_index_list)[|condition]]:expression_list);其中function是集循环函数名,它有两个参数,第一个参数set_name是集名,表示对该集的所有成员(或满足条件condition的成员)生成对应的约束表达式,第二个参数expression_list是约束表达式的具体内容;set_index_list称为集索引(相当于矩阵或数组的下标),可省略(当表达式参与运算的属性属于同一个集时,省略);condition称为过滤条件,若使用,前面必须用符号“|”隔开.Lingo提供了5个集循环函数:for,max,min,prod,sum;其含义分别为:(1)@for函数:对集set_name的每个元素独立的生成表达式,表达式由expression_list 描述(通常是优化问题的约束),可以是一组表达式.(2)@max函数:返回集set_name上的表达式的最大值.(3)@min函数:返回集set_name上的表达式的最小值.(4)@prod函数:返回集set_name上的表达式的积.(5)@sum函数:返回集set_name上的表达式的和.例4 用Lingo编程,使得对给定的数列,可输出其倒数.model:sets:num/1..10/:val,recip;endsets@for(num(i)|val(i)#NE#0:recip(i)=1/val(i));!Calculate reciprocal only for nonzero numbers;@for(num(i)|val(i)#EQ#0:recip(i)=0);!If a number is zero,make its reciprocal arbitrarily zero;data:val=?,?,?,?,?,?,?,?,?,?;!Nmubers for which to calculate the reciprocal;enddataend运行可得一提示界面,依次输入10个数后,即得其倒数.2.5.3变量定界函数变量定界函数主要用于对变量的取值范围加以限制,共有以下4种函数:(1)@bnd(a,x,b):限制a x b.(2)@bin(x):限制x=1或0.(3)@FREE(x):使得变量x无非负限制.(4)@GIN(x):限制变量x取整数2.5.4 集操作函数集操作函数是指对集进行操作的函数,常用的有@index, @in, @wrap, @size四种,下面简要介绍其用法.(1)@index([set_name,]primitive_set_element):返回成员primitive_set_element在集set_name中的索引值(即定义集时元素出现顺序的位置编号).若省略集名,则Lingo按模型中定义的集的顺序找到第一个含有元素primitive_set_element的集,并返回索引值.(2)@in(set_name,primitive_index_1[,primitive_index_2…]):用于判断集set_name中是否含有索引值primitive_index_1[,primitive_index_2…]所对应的元素,若有则返回1,否则返回0.索引用“&1”,“&2”sets:A/1..5/:;B/x y z/:;C(A,B)/1,x 3,y 2 x/:;endsetsS=@in(C,@index(A,2),@index(B,y));!判断C中是否含有集A中的元素2和集B中的元素y; ;(3)@wrap(index,limit):在集循环函数中,当达到集的最后一个(或第一个)成员后,此函数可把索引转到集的第一个(或最后一个)成员.在数学上,当index位于区间[1,limit]时返回index,否则返回j=index-k*limit,其中k为整数,且j落在区间[1,limit]内.如@wrap(3,10)返回值为3,@wrap(54,10)返回值为4,@wrap(29,6)则返回5.该函数在循环、多阶段计划编制中特别有用.(4)@size(set_name):返回数据集set_name中包含元素的个数.其它常用的还有文件输入输出函数和结果报告函数,由于这些函数主要用于Lingo软件与外部文件的接口,所以这两类函数在2.6节再详细介绍.例5 员工时序安排模型问题:某项工作一周7天都需要有人上班,周一至周日所需的最少人数分别为20,16,13,16,19,14和12.要求员工一周连续工作5天然后休息2天,试求每周所需最少总人数,并给出安排.解:设周一至周日所需的最少人数为)(i r ,安排上班的人数为)7,,2,1)(( i i x ,则周一上班的人在周五和周六休息,其它依此类推.合理安排轮休既能保证每天所需的最少人数,又能保证总人数最少.设总人数为z ,则周一上班的人数为:)3()2(x x z (周二、周三上班的人休息),于是有下面不等式)1()3()2(r x x z 其它依此类推,即有5,2,1),()2()1( i i r i x i x z当6 i 时,上述不等式为)6()8()7(r x x z ,显然)8(x 即为)1(x ,利用@wrap(i+2,7)可以将8转换为1;当7 i 时,上述约束可用同样方法实现,于是得统一的约束条件为: 7,2,1),())7,2((@))7,1(@wrap ( i i r i wrap x i x z 编写Lingo 模型如下:model : sets :days/mon..sun/:r,x; endsetsmin=z; !最小化每周所需员工数; n=@size(days); z=@sum(days:x);@for (days(i):z-x(@wrap(i+1,n))-x(@wrap(i+2,n))>=r(i)); data :r=20 16 13 16 19 14 12; !每周所需的最少员工数; enddata end运行得结果为:每周最少需要22个员工,周一安排8人开始上班,周二安排2人,周三不需要安排人,周四安排6人,周五和周六都安排3人,周日不需要安排人.2.6 Lingo 软件与外部文件的数据传递在很多实际问题中,决策变量数、约束条件数和数据量都较大,在Lingo 中直接输入非常不便.Lingo 模型语言通过集可以简洁、直观地描述较大规模的优化问题,解决了决策变量数和约束条件数较多这一难题.对于数据量较大这一问题,若能从文件中直接读取数据,就迎刃而解了.Lingo 软件通过与外部文件的接口解决了这一难题,使得模型中所需的数据可以以一定格式保存在独立的文件中,计算得到的结果也能够输入到文件中保存下来,从而将Lingo 程序和程序处理的数据分离开来.2.6.1 Lingo软件与文本文件的数据传递Lingo利用函数@file从文本文件读取数据,其使用格式为:@)其中为存放数据的文件名(可以包含完整的路径名,没有指定路径则默认在当前目录),该文件必须是纯文本(ASCⅡ码)文件,文件中可以包含不同的数据段,数据段之间必须用“~”分开,数据段内的数据之间用逗号或空格分开.Lingo利用函数@text可以把计算结果输出到文本文件,使用格式是:@text(‘’)=变量名;该语句通常放在数据段,其中参数’’是文件名,文件名可以包含完整的目录路径名,如果没有制定路径,则默认路径是Lingo的当前目录.上述两个函数的具体用法可参考例6.例6以例3的最短路径问题为例,介绍@file函数和@text函数的用法.假设存放数据的文本文件(后缀ldt为Lingo数据文件的扩展名)的内容如下:v1,v2,v3,v4,v5,v6,v7,v8~v1,v2 v1,v3 v1,v4v2,v4 v2,v5 v3,v4 v3,v7 v4,v5 v4,v6 v4,v7v5,v6 v5,v8 v6,v7 v6,v8 v7,v8~2 1 86 17 9 5 1 23 94 6 3~0,,,,,,,在Lingo模型窗口中建立如下Lingo模型:model:sets:cities/@file()/:L;!从中读入集cities的元素;roads(cities,cities)/@file()/:d;! 读入集roads的元素;endsetsdata:d=@file(); !从中读出数据赋值给属性变量d;L=@file(); !从中读出数据赋值给属性变量L;@text('C:\')=L !;enddata@for(cities(i)|i#GT#@index(v1):L(i)=@min(roads(j,i):L(j)+d(j,i)););end模型的集段和数据段中两次用到@file函数(每次从文件中读取一个记录,记录之间用“~”分开),运行程序得到的结果同例3中的一样,但书写形式要精炼的多,更为重要的是,当输入变量和数据改变时,只需在中作些修改即可,无须对程序作改动,达到了程序与数据分离的目的.2.6.2 Lingo软件与Excel电子表格文件的数据传递实际应用时,大量数据一般是存放在各种电子表格中(以Excel为例),所以能与电子表格互相传输数据,对Lingo软件而言是十分必要的.Lingo与Excel电子表格文件的接口函数是@ole函数,与@file函数一样,该函数只能在Lingo模型的集段、数据段和初始段使用,其使用格式可分为一下几种类型:(1)变量名1,变量名2=@ole(‘文件名’,’数据块名称1’,’数据块名称2’) 从指定的Excel文件读取数据,文件名可以包括扩展名,也可以包含文件路径,如果没有指定路径,则默认是Lingo的当前路径.(2)变量名1,变量名2=@ole(‘文件名’,‘数据块名称’);左边的两个变量必须定义在同一个集中,Excel中的数据块应当包含类型相同的两列数据,第一列赋值给变量1,第二列赋值给变量2.(3)变量名1,变量名2=@ole(‘文件名’);当Excel文件的数据块名称与变量名同名时,可使用上述格式.以上是从Excel文件中导入数据时传递函数@ole的用法,将计算结果导出到Excel中时,用法类似,只要前面类型的左右两边交换即可.例7以例3的最短路径问题为例,介绍@ole函数的用法.首先在D盘建立一个Excel文件:my,参见附图2.2.为了使得@ole函数与Lingo传递数据,需要对此文件中的数据进行命名,具体做法为:用鼠标选中这个表格的A1:A8单元,然后选择Excel的菜单命令“插入|名称|定义“,在弹出的对话框中输入名称cities,同理将B1:C15单元命名为roads(其中B1:B15输入起点,C1:C15输入终点),将D1:D15单元命名为dis.再在D盘建立一个Excel文件:,并按照上面步骤将第1列命名为ld,用于存放输出结果,最后建立Lingo模型如下:model:sets:cities/@ole('D:\my','cities')/:L;roads(cities,cities)/@ole('D:\my','roads')/:d;endsetsdata:d=@ole('D:\my','dis');L=0,,,,,,,;@ole('D:\','ld')=L;enddata@for(cities(i)|i#GT#@index(v1):L(i)=@min(roads(j,i):L(j)+d(j,i)););end附图2.2 Excel 文件存放数据图运行得最短路径,并将相应的L 值输出到文件“D:\“中.2.7 课后练习1.利用Lingo 软件求解线性规划3,2,1,0 5 85.05.12 205.124 48668 .. 203060 max 2321321321321 i x x x x x x x x x x x t s x x x z i2.利用Lingo 软件求解整数规划1,0,,, 535 846 12 ..73 min 4321421432143214321 x x x x x x x x x x x x x x x t s x x x x z 3.利用Lingo 软件求解整数规划,, 70207 5679 ..9040 max 21212121 Z x x x x x x t s x x z4.利用Lingo 软件求解非线性规划4,3,2,1,0 4.5321.121.1331.1 4841.121.1 4401.1 400 .. max 4321321214321 i x x x x x x x x x x x t s x x x x z i i5.利用Lingo 软件求解二次规划,2 33 32 32 ..3332 min 2121212121222121 x x x x x x x x t s x x x x x x f参考文献1. 姜启源,谢金星,叶俊.数学模型(第三版).北京:高等教育出版社,20032. 宋来忠,王志明.数学建模与实验.北京:科学出版社,2005 3. 胡运权.运筹学教程(第三版).北京:清华大学出版社,2007 4. 姜启源等.大学数学实验.北京:清华大学出版社,2005 5. 袁新生,邵大宏,郁时炼.LINGO 和Excel 在数学建模中的应用.北京:科学出版社,2007 6. 谢金星,薛毅.优化建模与LINDO/LINGO 软件.北京:清华大学出版社,2005 7. 《运筹学》教材编写组.运筹学(修订版).北京:清华大学出版社,1999 8. Christelle Gueret,Christian Prins,Marc Sevaux.运筹学案例.北京:Dash Optimization 有限公司出版,2005。