关闭

关闭

封号提示

内容

首页 LINGO教程.pdf

LINGO教程.pdf

LINGO教程.pdf

上传者: 忘忧草 2011-09-08 评分 3 0 35 5 158 暂无简介 简介 举报

简介:本文档为《LINGO教程pdf》,可适用于考试题库领域,主题内容包含科研中国SciEicom收集整理版权归原作者共页LINGO软件包使用手册科研中国SciEicom收集整理版权归原作者共页LINGO是用来求解线性和非符等。

科研中国SciEicom收集整理版权归原作者共页LINGO软件包使用手册科研中国SciEicom收集整理版权归原作者共页LINGO是用来求解线性和非线性优化问题的简易工具。LINGO内置了一种建立最优化模型的语言可以简便地表达大规模问题利用LINGO高效的求解器可快速求解并分析结果。LINGO快速入门当你在windows下开始运行LINGO系统时会得到类似下面的一个窗口:外层是主框架窗口包含了所有菜单命令和工具条其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGOModel–LINGO的窗口是LINGO的默认模型窗口建立的模型都都要在该窗口内编码实现。下面举两个例子。例如何在LINGO中求解如下的LP问题:,minxxxxxxxtsxx在模型窗口中输入如下代码:min=*x*xxx>=x>=*xx<=然后点击工具条上的按钮即可。例使用LINGO软件计算个发点个收点的最小费用运输问题。产销单位运价如下表。单位销地运价产地BBBBBBBB产量AA科研中国SciEicom收集整理版权归原作者共页AAAA销量使用LINGO软件编制程序如下:model:!发点收点运输问题sets:warehouseswhwh:capacityvendorsvv:demandlinks(warehouses,vendors):cost,volumeendsets!目标函数min=sum(links:cost*volume)!需求约束for(vendors(J):sum(warehouses(I):volume(I,J))=demand(J))!产量约束for(warehouses(I):sum(vendors(J):volume(I,J))<=capacity(I))!这里是数据data:capacity=demand=cost=enddataend然后点击工具条上的按钮即可。为了能够使用LINGO的强大功能接着第二节的学习吧。LINGO中的集对实际问题建模的时候总会遇到一群或多群相联系的对象比如工厂、消费者群体、交通工具和雇工等等。LINGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集就可以利用集来最大限度的发挥LINGO建模语言的优势。现在我们将深入介绍如何创建集并用数据初始化集的属性。学完本节后你对基于建模技术的集如何引入模型会有一个基本的理解。为什么使用集集是LINGO建模语言的基础是程序设计最强有力的基本构件。借助于集能够用一个科研中国SciEicom收集整理版权归原作者共页单一的、长的、简明的复合公式表示一系列相似的约束从而可以快速方便地表达规模较大的模型。什么是集集是一群相联系的对象这些对象也称为集的成员。一个集可能是一系列产品、卡车或雇员。每个集成员可能有一个或多个与之有关联的特征我们把这些特征称为属性。属性值可以预先给定也可以是未知的有待于LINGO求解。例如产品集中的每个产品可以有一个价格属性卡车集中的每辆卡车可以有一个牵引力属性雇员集中的每位雇员可以有一个薪水属性也可以有一个生日属性等等。LINGO有两种类型的集:原始集(primitiveset)和派生集(derivedset)。一个原始集是由一些最基本的对象组成的。一个派生集是用一个或多个其它集来定义的也就是说它的成员来自于其它已存在的集。模型的集部分集部分是LINGO模型的一个可选部分。在LINGO模型中使用集之前必须在集部分事先定义。集部分以关键字“sets:”开始以“endsets”结束。一个模型可以没有集部分或有一个简单的集部分或有多个集部分。一个集部分可以放置于模型的任何地方但是一个集及其属性在模型约束中被引用之前必须定义了它们。定义原始集为了定义一个原始集必须详细声明:集的名字可选集的成员可选集成员的属性定义一个原始集用下面的语法:setnamememberlist:attributelist注意:用“”表示该部分内容可选。下同不再赘述。Setname是你选择的来标记集的名字最好具有较强的可读性。集名字必须严格符合标准命名规则:以拉丁字母或下划线()为首字符其后由拉丁字母(AZ)、下划线、阿拉伯数字(…)组成的总长度不超过个字符的字符串且不区分大小写。注意:该命名规则同样适用于集成员名和属性名等的命名。Memberlist是集成员列表。如果集成员放在集定义中那么对它们可采取显式罗列和隐式罗列两种方式。如果集成员不放在集定义中那么可以在随后的数据部分定义它们。当显式罗列成员时必须为每个成员输入一个不同的名字中间用空格或逗号搁开允许混合使用。例可以定义一个名为students的原始集它具有成员John、Jill、Rose和Mike属性有sex和age:sets:studentsJohnJill,RoseMike:sex,ageendsets当隐式罗列成员时不必罗列出每个集成员。可采用如下语法:setnamemembermemberN:attributelist这里的member是集的第一个成员名memberN是集的最末一个成员名。LINGO将自动产生中间的所有成员名。LINGO也接受一些特定的首成员名和末成员名用于创建一些特殊的集。列表如下:隐式成员列表格式示例所产生集成员n,,,,StringMStringNCarcarCar,Car,Car,…,CarDayMDayNMonFriMon,Tue,Wed,Thu,Fri科研中国SciEicom收集整理版权归原作者共页MonthMMonthNOctJanOct,Nov,Dec,JanMonthYearMMonthYearNOctJanOct,Nov,Dec,Jan集成员不放在集定义中而在随后的数据部分来定义。例!集部分sets:students:sex,ageendsets!数据部分data:students,sex,age=JohnJillRoseMikeenddata注意:开头用感叹号(!)末尾用分号()表示注释可跨多行。在集部分只定义了一个集students并未指定成员。在数据部分罗列了集成员John、Jill、Rose和Mike并对属性sex和age分别给出了值。集成员无论用何种字符标记,它的索引都是从开始连续计数。在attributelist可以指定一个或多个集成员的属性属性之间必须用逗号隔开。可以把集、集成员和集属性同C语言中的结构体作个类比。如下图:集结构体集成员结构体的域集属性结构体实例LINGO内置的建模语言是一种描述性语言用它可以描述现实世界中的一些问题然后再借助于LINGO求解器求解。因此集属性的值一旦在模型中被确定就不可能再更改。在LINGO中只有在初始部分中给出的集属性值在以后的求解中可更改。这与前面并不矛盾初始部分是LINGO求解器的需要并不是描述问题所必须的。定义派生集为了定义一个派生集必须详细声明:集的名字父集的名字可选集成员可选集成员的属性可用下面的语法定义一个派生集:setname(parentsetlist)memberlist:attributelistsetname是集的名字。parentsetlist是已定义的集的列表多个时必须用逗号隔开。如果没有指定成员列表那么LINGO会自动创建父集成员的所有组合作为派生集的成员。派生集的父集既可以是原始集也可以是其它的派生集。例sets:productABmachineMNweekallowed(product,machine,week):xendsetsLINGO生成了三个父集的所有组合共八组作为allowed集的成员。列表如下:编号成员(A,M,)科研中国SciEicom收集整理版权归原作者共页(A,M,)(A,N,)(A,N,)(B,M,)(B,M,)(B,N,)(B,N,)成员列表被忽略时派生集成员由父集成员所有的组合构成这样的派生集成为稠密集。如果限制派生集的成员使它成为父集成员所有组合构成的集合的一个子集这样的派生集成为稀疏集。同原始集一样派生集成员的声明也可以放在数据部分。一个派生集的成员列表有两种方式生成:显式罗列设置成员资格过滤器。当采用方式时必须显式罗列出所有要包含在派生集中的成员并且罗列的每个成员必须属于稠密集。使用前面的例子显式罗列派生集的成员:allowed(product,machine,week)AM,AN,BN如果需要生成一个大的、稀疏的集那么显式罗列就很讨厌。幸运地是许多稀疏集的成员都满足一些条件以和非成员相区分。我们可以把这些逻辑条件看作过滤器在LINGO生成派生集的成员时把使逻辑条件为假的成员从稠密集中过滤掉。例sets:!学生集:性别属性sex表示男性表示女性年龄属性agestudentsJohn,Jill,Rose,Mike:sex,age!男学生和女学生的联系集:友好程度属性friend之间的数。linkmf(students,students)|sex()#eq##and#sex()#eq#:friend!男学生和女学生的友好程度大于的集linkmf(linkmf)|friend(,)#ge#:xendsetsdata:sex,age=friend=enddata用竖线(|)来标记一个成员资格过滤器的开始。#eq#是逻辑运算符用来判断是否“相等”可参考可看作派生集的第个原始父集的索引它取遍该原始父集的所有成员可看作派生集的第个原始父集的索引它取遍该原始父集的所有成员……以此类推。注意如果派生集B的父集是另外的派生集A那么上面所说的原始父集是集A向前回溯到最终的原始集其顺序保持不变并且派生集A的过滤器对派生集B仍然有效。因此派生集的索引个数是最终原始父集的个数索引的取值是从原始父集到当前派生集所作限制的总和。总的来说LINGO可识别的集只有两种类型:原始集和派生集。在一个模型中原始集是基本的对象不能再被拆分成更小的组分。原始集可以由显式罗列和隐式罗列两种方式来定义。当用显式罗列方式时需在集成员列表中逐个输入每个成员。当用隐式罗列方式时只需在集成员列表中输入首成员和末成员而中间的成员由LINGO产生。另一方面派生集是由其它的集来创建。这些集被称为该派生集的父集(原始集或其它的派生集)。一个派生集既可以是稀疏的也可以是稠密的。稠密集包含了父集成员的所有组合(有时也称为父集的笛卡尔乘积)。稀疏集仅包含了父集的笛卡尔乘积的一个子集可通过显式罗列和成员资格过滤器这两种方式来定义。显式罗列方法就是逐个罗列稀疏集的成员。成员资格过滤器方法通过使用稀疏集成员必须满足的逻辑条件从稠密集成员中过滤出稀疏集的成员。不同集类型的关系见下图。科研中国SciEicom收集整理版权归原作者共页模型的数据部分和初始部分在处理模型的数据时需要为集指派一些成员并且在LINGO求解模型之前为集的某些属性指定值。为此LINGO为用户提供了两个可选部分:输入集成员和数据的数据部分(DataSection)和为决策变量设置初始值的初始部分(InitSection)。模型的数据部分数据部分入门数据部分提供了模型相对静止部分和数据分离的可能性。显然这对模型的维护和维数的缩放非常便利。数据部分以关键字“data:”开始以关键字“enddata”结束。在这里可以指定集成员、集的属性。其语法如下:objectlist=valuelist对象列(objectlist)包含要指定值的属性名、要设置集成员的集名用逗号或空格隔开。一个对象列中至多有一个集名而属性名可以有任意多。如果对象列中有多个属性名那么它们的类型必须一致。如果对象列中有一个集名那么对象列中所有的属性的类型就是这个集。数值列(valuelist)包含要分配给对象列中的对象的值用逗号或空格隔开。注意属性值的个数必须等于集成员的个数。看下面的例子。例sets:setA,B,C:X,Yendsetsdata:X=,,Y=,,enddata在集set中定义了两个属性X和Y。X的三个值是、和Y的三个值是、和。也可采用如下例子中的复合数据声明(datastatement)实现同样的功能。例集稠密集原始集显式罗列稀疏集过滤器派生集LINGO集类型科研中国SciEicom收集整理版权归原作者共页sets:setA,B,C:X,Yendsetsdata:X,Y=enddata看到这个例子可能会认为X被指定了、和三个值因为它们是数值列中前三个而正确的答案是、和。假设对象列有n个对象LINGO在为对象指定值时首先在n个对象的第个索引处依次分配数值列中的前n个对象然后在n个对象的第个索引处依次分配数值列中紧接着的n个对象……以此类推。模型的所有数据属性值和集成员被单独放在数据部分这可能是最规范的数据输入方式。参数在数据部分也可以指定一些标量变量(scalarvariables)。当一个标量变量在数据部分确定时称之为参数。看一例假设模型中用利率作为一个参数就可以象下面一样输入一个利率作为参数。例data:interestrate=enddata也可以同时指定多个参数。例data:interestrate,inflationrate=enddata实时数据处理在某些情况对于模型中的某些数据并不是定值。譬如模型中有一个通货膨胀率的参数我们想在至范围内对不同的值求解模型来观察模型的结果对通货膨胀的依赖有多么敏感。我们把这种情况称为实时数据处理(whatifanalysis)。LINGO有一个特征可方便地做到这件事。在本该放数的地方输入一个问号()。例data:interestrate,inflationrate=enddata每一次求解模型时LINGO都会提示为参数inflationrate输入一个值。在WINDOWS操作系统下将会接收到一个类似下面的对话框:直接输入一个值再点击OK按钮LINGO就会把输入的值指定给inflationrate然后继续求解模型。科研中国SciEicom收集整理版权归原作者共页除了参数之外也可以实时输入集的属性值但不允许实时输入集成员名。指定属性为一个值可以在数据声明的右边输入一个值来把所有的成员的该属性指定为一个值。看下面的例子。例sets:daysMO,TU,WE,TH,FR,SA,SU:needsendsetsdata:needs=enddataLINGO将用指定days集的所有成员的needs属性。对于多个属性的情形见下例。例sets:daysMO,TU,WE,TH,FR,SA,SU:needs,costendsetsdata:needscost=enddata数据部分的未知数值有时只想为一个集的部分成员的某个属性指定值而让其余成员的该属性保持未知以便让LINGO去求出它们的最优值。在数据声明中输入两个相连的逗号表示该位置对应的集成员的属性值未知。两个逗号间可以有空格。例sets:years:capacityendsetsdata:capacity=,,,,enddata属性capacity的第个和第个值分别为和其余的未知。模型的初始部分初始部分是LINGO提供的另一个可选部分。在初始部分中可以输入初始声明(initializationstatement)和数据部分中的数据声明相同。对实际问题的建模时初始部分并不起到描述模型的作用在初始部分输入的值仅被LINGO求解器当作初始点来用并且仅仅对非线性模型有用。和数据部分指定变量的值不同LINGO求解器可以自由改变初始部分初始化的变量的值。一个初始部分以“init:”开始以“endinit”结束。初始部分的初始声明规则和数据部分的数据声明规则相同。也就是说我们可以在声明的左边同时初始化多个集属性可以把集属性初始化为一个值可以用问号实现实时数据处理还可以用逗号指定未知数值。例init:X,Y=,endinitY=log(X)X^Y^<=好的初始点会减少模型的求解时间。在这一节中我们仅带大家接触了一些基本的数据输入和初始化概念不过现在你应该可以轻松的为自己的模型加入原始数据和初始部分啦。科研中国SciEicom收集整理版权归原作者共页LINGO函数有了前几节的基础知识再加上本节的内容你就能够借助于LINGO建立并求解复杂的优化模型了。LINGO有种类型的函数:..基本运算符:包括算术运算符、逻辑运算符和关系运算符..数学函数:三角函数和常规的数学函数..金融函数:LINGO提供的两种金融函数..概率函数:LINGO提供了大量概率相关的函数..变量界定函数:这类函数用来定义变量的取值范围..集操作函数:这类函数为对集的操作提供帮助..集循环函数:遍历集的元素执行一定的操作的函数..数据输入输出函数:这类函数允许模型和外部数据源相联系进行数据的输入输出..辅助函数:各种杂类函数基本运算符这些运算符是非常基本的甚至可以不认为它们是一类函数。事实上在LINGO中它们是非常重要的。算术运算符算术运算符是针对数值进行操作的。LINGO提供了种二元运算符:^乘方乘/除加减LINGO唯一的一元算术运算符是取反函数“”。这些运算符的优先级由高到底为:高(取反)^/低运算符的运算次序为从左到右按优先级高低来执行。运算的次序可以用圆括号“()”来改变。例算术运算符示例。/()/等等。逻辑运算符在LINGO中逻辑运算符主要用于集循环函数的条件表达式中来控制在函数中哪些集成员被包含哪些被排斥。在创建稀疏集时用在成员资格过滤器中。LINGO具有9种逻辑运算符:#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科研中国SciEicom收集整理版权归原作者共页这些运算符的优先级由高到低为:高#not##eq##ne##gt##ge##lt##le#低#and##or#例逻辑运算符示例#gt##and##gt#其结果为假()。关系运算符在LINGO中关系运算符主要是被用在模型中来指定一个表达式的左边是否等于、小于等于、或者大于等于右边形成模型的一个约束条件。关系运算符与逻辑运算符#eq#、#le#、#ge#截然不同前者是模型中该关系运算符所指定关系的为真描述而后者仅仅判断一个该关系是否被满足:满足为真不满足为假。LINGO有三种关系运算符:“=”、“<=”和“>=”。LINGO中还能用“<”表示小于等于关系“>”表示大于等于关系。LINGO并不支持严格小于和严格大于关系运算符。然而如果需要严格小于和严格大于关系比如让A严格小于B:A<B那么可以把它变成如下的小于等于表达式:Aε<=B这里ε是一个小的正数它的值依赖于模型中A小于B多少才算不等。下面给出以上三类操作符的优先级:高#not#(取反)^/#eq##ne##gt##ge##lt##le##and##or#低<==>=数学函数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<返回否则返回floor(x)返回x的整数部分。当x>=时返回不超过x的最大整数当x<时返回不低于x的最大整数。smax(x,x,…,xn)返回xx…xn中的最大值smin(x,x,…,xn)返回xx…xn中的最小值例给定一个直角三角形求包含该三角形的最小正方形。解:如图所示。,sincos,cos,sinxbxaDExbADxaCE===求最小的正方形就相当于求如下的最优化问题:{}DEADCEx,,maxminπLINGO代码如下:model:sets:ABCDEabx科研中国SciEicom收集整理版权归原作者共页object:fendsetsdata:a,b=,!两个直角边长修改很方便enddataf()=a*sin(x)f()=b*cos(x)f()=a*cos(x)b*sin(x)min=smax(f(),f(),f())bnd(,x,)end在上面的代码中用到了函数bnd详情请见节。金融函数目前LINGO提供了两个金融函数。.fpa(I,n)返回如下情形的净现值:单位时段利率为I连续n个时段支付每个时段支付单位费用。若每个时段支付x单位的费用则净现值可用x乘以fpa(I,n)算得。fpa的计算公式为IIInnkk==)()(。净现值就是在一定时期内为了获得一定收益在该时期初所支付的实际费用。例贷款买房问题贷款金额元贷款年利率采取分期付款方式(每年年末还固定金额直至还清)。问拟贷款年每年需偿还多少元?LINGO代码如下:=x*fpa(,)答案是x=元。.fpl(I,n)返回如下情形的净现值:单位时段利率为I第n个时段支付单位费用。fpl(I,n)的计算公式为nI)(。细心的读者可以发现这两个函数间的关系:==nkkIfplnIfpa),(),(。概率函数.pbn(p,n,x)二项分布的累积分布函数。当n和(或)x不是整数时用线性插值法进行计算。.pcx(n,x)自由度为n的χ分布的累积分布函数。.peb(a,x)当到达负荷为a服务系统有x个服务器且允许无穷排队时的Erlang繁忙概率。.pel(a,x)当到达负荷为a服务系统有x个服务器且不允许排队时的Erlang繁忙概率。.pfd(n,d,x)自由度为n和d的F分布的累积分布函数。.pfs(a,x,c)当负荷上限为a顾客数为c平行服务器数量为x时有限源的Poisson服务系统的等待或返修顾客数的期望值。a是顾客数乘以平均服务时间再除以平均返修时间。当c和科研中国SciEicom收集整理版权归原作者共页(或)x不是整数时采用线性插值进行计算。.phg(pop,g,n,x)超几何(Hypergeometric)分布的累积分布函数。pop表示产品总数g是正品数。从所有产品中任意取出n(npop)件。popgn和x都可以是非整数这时采用线性插值进行计算。.ppl(a,x)Poisson分布的线性损失函数即返回max(,zx)的期望值其中随机变量z服从均值为a的Poisson分布。.pps(a,x)均值为a的Poisson分布的累积分布函数。当x不是整数时采用线性插值进行计算。.psl(x)单位正态线性损失函数即返回max(,zx)的期望值其中随机变量z服从标准正态分布。.psn(x)标准正态分布的累积分布函数。.ptd(n,x)自由度为n的t分布的累积分布函数。.qrand(seed)产生服从(,)区间的拟随机数。qrand只允许在模型的数据部分使用它将用拟随机数填满集属性。通常声明一个mn的二维表m表示运行实验的次数n表示每次实验所需的随机数的个数。在行内随机数是独立分布的在行间随机数是非常均匀的。这些随机数是用“分层取样”的方法产生的。例model:data:M=N=seed=enddatasets:rowsMcolsNtable(rows,cols):xendsetsdata:X=qrand(seed)enddataend如果没有为函数指定种子那么LINGO将用系统时间构造种子。.rand(seed)返回和间的伪随机数依赖于指定的种子。典型用法是U(I)=rand(U(I))。注意如果seed不变那么产生的随机数也不变。例利用rand产生个标准正态分布的随机数和自由度为的t分布的随机数。model:!产生一列正态分布和t分布的随机数sets:series:u,znorm,ztendsets!第一个均匀分布随机数是任意的u()=rand()!产生其余的均匀分布的随机数for(series(I)|I#GT#:科研中国SciEicom收集整理版权归原作者共页u(I)=rand(u(I)))for(series(I):!正态分布随机数psn(znorm(I))=u(I)!和自由度为的t分布随机数ptd(,zt(I))=u(I)!ZNORM和ZT可以是负数free(znorm(I))free(zt(I)))end变量界定函数变量界定函数实现对变量取值范围的附加限制共种:bin(x)限制x为或bnd(L,x,U)限制LxUfree(x)取消对变量x的默认下界为的限制即x可以取任意实数gin(x)限制x为整数在默认情况下LINGO规定变量是非负的也就是说下界为上界为。free取消了默认的下界为的限制使变量也可以取负值。bnd用于设定一个变量的上下界,它也可以取消默认下界为的约束。集操作函数LINGO提供了几个函数帮助处理集。.in(setname,primitiveindex,primitiveindex,…)如果元素在指定集中返回否则返回。例全集为IB是I的一个子集C是B的补集。sets:IxxB(I)xC(I)|#not#in(B,):endsets.index(setname,primitivesetelement)该函数返回在集setname中原始集成员primitivesetelement的索引。如果setname被忽略那么LINGO将返回与primitivesetelement匹配的第一个原始集成员的索引。如果找不到则产生一个错误。例如何确定集成员(B,Y)属于派生集S。sets:SABCSXYZS(S,S)AX,AZ,BY,CXendsetsX=in(S,index(S,B),index(S,Y))看下面的例子表明有时为index指定集是必要的。例sets:girlsdebble,sue,aliceboysbob,joe,sue,fredendsetsI=index(sue)I=index(boys,sue)科研中国SciEicom收集整理版权归原作者共页I的值是I的值是。我们建议在使用index函数时最好指定集。.wrap(index,limit)该函数返回j=indexk*limit其中k是一个整数取适当值保证j落在区间limit内。该函数相当于index模limit再加。该函数在循环、多阶段计划编制中特别有用。.size(setname)该函数返回集setname的成员个数。在模型中明确给出集大小时最好使用该函数。它的使用使模型更加数据中立集大小改变时也更易维护。集循环函数集循环函数遍历整个集进行操作。其语法为function(setname(setindexlist)|conditionalqualifier:expressionlist)function相应于下面罗列的四个集循环函数之一setname是要遍历的集setindexlist是集索引列表conditionalqualifier是用来限制集循环函数的范围当集循环函数遍历集的每个成员时LINGO都要对conditionalqualifier进行评价若结果为真则对该成员执行function操作否则跳过继续执行下一次循环。expressionlist是被应用到每个集成员的表达式列表当用的是for函数时expressionlist可以包含多个表达式其间用逗号隔开。这些表达式将被作为约束加到模型中。当使用其余的三个集循环函数时expressionlist只能有一个表达式。如果省略setindexlist那么在expressionlist中引用的所有属性的类型都是setname集。.for该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束不过for函数允许只输入一个约束然后LINGO自动产生每个集成员的约束。例产生序列{,,,,}model:sets:number:xendsetsfor(number(I):x(I)=I^)end.sum该函数返回遍历指定的集成员的一个表达式的和。例求向量前个数的和。model:data:N=enddatasets:numberN:xendsetsdata:x=enddatas=sum(number(I)|I#le#:x)end.min和max返回指定的集成员的一个表达式的最小值或最大值。例求向量前个数的最小值后个数的最大值。model:data:N=enddata科研中国SciEicom收集整理版权归原作者共页sets:numberN:xendsetsdata:x=enddataminv=min(number(I)|I#le#:x)maxv=max(number(I)|I#ge#N:x)end下面看一个稍微复杂一点儿的例子。例职员时序安排模型一项工作一周天都需要有人(比如护士工作)每天(周一至周日)所需的最少职员数为、、、、、和并要求每个职员一周连续工作天试求每周所需最少职员数并给出安排。注意这里我们考虑稳定后的情况。model:sets:daysmonsun:required,startendsetsdata:!每天所需的最少职员数required=enddata!最小化每周所需职员数min=sum(days:start)for(days(J):sum(days(I)|I#le#:start(wrap(JI,)))>=required(J))end计算的部分结果为Globaloptimalsolutionfoundatiteration:Objectivevalue:VariableValueReducedCostREQUIRED(MON)REQUIRED(TUE)REQUIRED(WED)REQUIRED(THU)REQUIRED(FRI)REQUIRED(SAT)REQUIRED(SUN)START(MON)START(TUE)START(WED)START(THU)START(FRI)START(SAT)START(SUN)从而解决方案是:每周最少需要个职员周一安排人周二安排人周三无需安排人周四安排人周五和周六都安排人周日无需安排人。输入和输出函数输入和输出函数可以把模型和外部数据比如文本文件、数据库和电子表格等连接起来。.file函数该函数用从外部文件中输入数据可以放在模型中任何地方。该函数的语法格式为科研中国SciEicom收集整理版权归原作者共页file(’filename’)。这里filename是文件名可以采用相对路径和绝对路径两种表示方式。file函数对同一文件的两种表示方式的处理和对两个不同的文件处理是一样的这一点必须注意。例以例来讲解file函数的用法。注意到在例的编码中有两处涉及到数据。第一个地方是集部分的个warehouses集成员和个vendors集成员第二个地方是数据部分的capacitydemand和cost数据。为了使数据和我们的模型完全分开我们把它们移到外部的文本文件中。修改模型代码以便于用file函

职业精品

精彩专题

上传我的资料

热门资料

资料评价:

/ 56
所需积分:0 立即下载

意见
反馈

返回
顶部

Q