您好,欢迎访问三七文档
二GAMS简明教程由RichardE.Rosenthal编著(译者:该翻译由华中科技大学能源与动力工程学院小海完成,由于译者水平有限,其中肯定会有些问题,欢迎大家阅读并批评指正!)2.1简介这本书的简介部分以一个详细的例子结束,这个例子是一个用GAMS进行表达、解决和分析的小而简单的优化问题。由来自蒙特利尔市Naval研究生院的RichardE.Rownthal编写。通过这个例子我们可以对GAMS有一个快速而全面的了解。很多地方引用到本书其他章节的知识,方便大家进一步查阅;而阅读这一部分即使不看本书其他章节也能看懂并且有所收获。例子是一个关于运输的线性规划问题,这个问题在最优化技术发展过程中曾经被当做实验对象。用这个例子展示GAMS这类代数建模语言的强大功能是很好的选择,因为不管手头要处理的问题有多大,运输问题本身具有一个简单的、可用的代数结构。你可以发现,如果要解决一个非常大的运输问题,我们将呈现的用于解决小规模运输问题的GAMS输入文件中的内容并不需要改变多少。在熟悉的运输问题中,我们考虑几个工厂的供应和几个市场的需求的商品,我们也给出从工厂运输商品到市场的单位花费。这其中的经济学问题是:怎样安排运输使得我们的总运输成本最小?这个问题的代数表达常常采用下列方式:Indices:i=plantsj=marketsGivenData:ia=supplyofcommodityofplanti(incases)ijb=demandforcommodityatmarketjijc=costperunitshipmentbetweenplantiandmarketj($/case)DecisionVariables:ijx=amountofcommoditytoshipfromplantitomarketj(cases),Whereijx≥0,foralli,jConstraints:Observesupplylimitatplanti:jijjax≤∑foralli(cases)Satisfydemandatmarketj:ijjixb≥∑forallj(cases)ObjectiveFunction:Minimizeijijijcx∑∑($K)注意这个例子显示了一些一般情况下我们认为是好习惯的建模方式,这些在GAMS里面被继承了。首先,模型程序中的各组成部分都按类型分组定义了。其次,GAMS程序各组成部分先后次序已经定好了,因此没有标识符能在被定义之前使用。第三,各组成部分都有特定的单位。第四,选择的单位要使优化过程中得到的数值具有相对较小的绝对数量级。(例如标识$K表示dollar的千倍)各组成部分类型的名称在不同的模型中可能不一样。例如,经济学家分别用外生变量和内生变量来表示已知数据和决策变量。(译者:在经济模型中,内生变量是指该模型所要决定的变量。外生变量指由模型以外的因素所决定的已知变量,它是模型据以建立的外部条件。内生变量可以在模型体系内得到说明,外生变量决定内生变量,而外生变量本身不能在模型体系中得到说明。参数通常是由模型以外的因素决定的,因此也往往被看成外生变量。例:P=a+bQ,表示价格与数量的关系,则a、b是参数,都是外生变量;P、Q是模型要决定的变量,所以是内生变量。除此之外,譬如相关商品的价格,人们的收入等其他于模型有关的变量,都是外生变量)在GAMS中,被采用的相关术语是:sets表示指数下标,parameters表示已知数,variables表示决策变量,equations表示约束方程和目标方程。运输问题的GAMS语言表述紧密的联系了上述几个部分。最主要的区别在于GAMS表述可以被电脑读取和运行。作为运输问题的例子,假设有两个罐头厂和三个市场,已知数据如表2.1所示。运输距离的单位是千英里,运输成本是$90.00每箱每千英里。这个例子的GAMS表述是:Setsicanningplants/seattle,san-diego/jmarkets/new-york,chicago,topeka/;Parametersa(i)capacityofplantiincases/seattle350san-diego600/b(j)demandatmarketjincases/new-york325chicago300topeka275/;Tabled(i,j)distanceinthousandsofmilesnew-yorkchicagotopekaseattle2.51.71.8san-diego2.51.81.4;Scalarffreightindollarspercaseperthousandmiles/90/;Parameterc(i,j)transportcostinthousandsofdollarspercase;c(i,j)=f*d(i,j)/1000;Variablesx(i,j)shipmentquantitiesincasesztotaltransportationcostsinthousandsofdollars;PositiveVariablex;Equationscostdefineobjectivefunctionsupply(i)observesupplylimitatplantidemand(j)satisfydemandatmarketj;cost..z=e=sum((i,j),c(i,j)*x(i,j));supply(i)..sum(j,x(i,j))=l=a(i);demand(j)..sum(i,x(i,j))=g=b(j);Modeltransport/all/;Solvetransportusinglpminimizingz;Displayx.l,x.m;如果你在GAMS中建立一个文件,将以上内容输入进去,运输模型就可以被建立和进行计算了。要使GAMS在不同的计算机上运行需要改变一些细节,但是最简单的方法(不提供非必要服务的方法)是在输入文件的名字后面加上GAMS这几个字母。在程序运行过程中,你将看到一些精练的描述GAMS运行过程的字符行,包括了写入输出结果的文件名。当GAMS程序结束时,检查文件,如果一切正常的话,那么最优化运输方案将显示如下:new-yorkchicagotopekaseattle50.000300.000san-diego275.000275.000你还可以得到如下所示边际成本(单纯形乘数):chicagotopekaseattle0.036san-diego0.009这些结果表明,举例来说,采用最优化方案就不要从Seattle送货到Topeka,但是你坚持要这样做的话,你将比最优化方案多付0.036$K($36.00)每箱的成本。(你能从优化运输方案和已知数据中证明这个数据的正确性吗?)(译者:可以这样想,因为只能由Seattle和SanDiego向Topeka送货,为了满足Topeka市场275箱的需求,从SanDiego少送一箱就要从Seattle补送一箱,这样算来,多出的成本就等于(1.8‐1.4)*90=36)2.2GAMS模型的结构本章的剩余部分我们将讨论GAMS模型的基本组成部分,还是以上面提到的运输问题为例。表2.2列出了基本组成部分。GAMS中有可供用户选择的输入模块,例如编辑损坏数据的检查信息和要求显示客户结果列表。其他可供选择的高级特征包括保存和恢复原模型,以及在一次运行中创建联合模型,但是这个教程仅仅讨论基本的部分。在开始介绍各个部分之前,以下几点需要说明:1.GAMS模型是指一组GAMS语言表述的集合。而组织这些表述的唯一规则是在模型的一个部分被声明之前它是无法被引用的。2.GAMS的表述能以任何一种吸引人的排版方式呈现在用户眼前,一个表述占用多行,插入空白行,以及一行中多个表述都是可以的。在这个教程中你可以了解那些是被允许的格式,但是一些更详细的规则将在下一章给出。3.如果你是GAMS新手,你应该在每一个表述的最后加上分号,如例中所示。GAMS编译器不区分大小写字母,你可以随意使用。4.说明文档方便用户看懂数学模型。说明文档整个集中的被包含在模型表述中比把它分开书写要更为有效(往往也更为准确)。至少有两种方法向GAMS模型中插入此类说明文件。第一,GAMS编译器将把以一个星号开头的行作为注解行。第二,或许更为重要,可以用特定的GAMS语句插入说明文档。在运输模型中所有的小写文字都是以第二种形式插入的说明文档。Inputs:SetsDeclarationAssignmentofmembersData(Parameters,Tables,Scalars)DeclarationAssignmentofvaluesVariablesDeclarationAssignmentoftypeAssignmentofboundsand/orinitialvalues(optional)EquationsDeclarationDefinitionModelandSolvestatementsDisplaystatement(optional)Outputs:EchoPrintReferenceMapsEquationListingsStatusReportsResultsTable2.2:ThebasiccomponentsofaGAMSmodel5.正如你看到的以上输入部分,建构GAMS组成部分包括两个部分:声明以及赋值或者定义。声明是指表明其存在性并且给其取个名字。赋值或者定义是指给其赋予某个值或者格式。以equations为例,你必须用单独的GAMS表述声明和定义它。然而对于其他所有的GAMS组成部分,你可以选择在同一个表述中或者单独对其进行声明或赋值。6.模型各组成部分的名字必须以字母开头,并且长度不超过31个字符,除第一个字符外可以使用字母或数字。2.3Sets指数下标Sets是GAMS模型基本的组成部分,它如同数学公式中的指数下标。运输例子中该部分表述如下:Setsicanningplants/seattle,san-diego/jmarkets/new-york,chicago,topeka/;本表述的作用很明显。我们声明了两个指数下标并且给它们起名为i和j。我们还给它们赋了值:i={Seattle,San-Diego}j={NewYork,Chicago,Topeka};你应该注意到GAMS格式和一般数学格式对于列举指数下标元素的区别。GAMS用‘/’斜杠而不是用‘{}’大括号,这是因为不是所有的电脑键盘都有大括号这个键。同时注意到在这里多字名如‘NewYork’不能使用而用了连字号。Sets表述中小写文字被称为文本。文本可有可无。它们仅为内部文档存在,在模型中没有正式的作用。GAMS编译器不会在意文本的含义,但是为了方便用户,会保留文本并呈现给用户多次。将i和j的表述合并并不是必要的。我们也可以将它们分开:Seticanningplants/seattle,san-diego/;Setjmarkets/new-york,chicago,topeka/;至于使用多少空格和空行(如用大或者小写一样)完全取决于用户。每一个GAMS用户都愿意遵从自己的格式习惯。(用单数set还是负数sets也取决于用户。在进行单个声明的表述中用set,在进行多个声明的表述中用sets,这是符合英语语法的,但是GAMS不区分set和sets。)当要赋的值是一个系列的时候,用星号*是很方便的。例如:Setttimeperiods/1991*2000/;Setmmachines/mach1*mach24/;这就相当于:t={1991,1992,1993,.....,2000}m={mach1,mach2,......,mach24};这里将赋的值看成字符串,所以t的值不是数字。另外一个好用的表述是alias,它可以给先前声明的set另外一个名字。例如:Alias(t,tp);在一般数学表达中tp和t’相似。这对于包含有同一个set
本文标题:GAMS中文教程
链接地址:https://www.777doc.com/doc-4601055 .html