




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章 通用数学建模系统(GAMS)基本知识第2章 通用数学建模系统(GAMS)基本知识经过多年来的改进和完善,GAMS为用户表达、计算和求解大型和复杂模型提供了高水平的编程语言。其突出特点是:允许模型的描述独立于求解算法,允许在规范化的标准模型中、在保证安全的条件下作少许变化,要求变量之间的代数关系表述明确。本章用一个简单实例来说明GAMS系统在建立和求解优化模型中的用法,要熟练掌握GAMS的应用需要大量的建模实践,详细的GAMS语句说明请参考相关的用户说明书。2.1 GAMS系统简介GAMS的设计融入了数学方程的设计思想和关系数据库理论,目的是满足战略建模者的需求。数学方程设计提供了描述问题和多种求解问题的方法,而关系数据库理论为数据组织及其应对变化提供了一个框架结构。因此具有数学模型基础和计算机程序设计基础将有利于对GAMS应用的理解。2.1.1 GAMS基本特性GAMS模型的表达式人和计算机都能读懂,这说明GAMS程序本身就是模型的文件。而且,GAMS的设计融入了以下的特性来满足用户的需要。(1) GAMS的表达式充分利用了数学表达式的优点。GAMS将算法与语言结合,因此所有现成的计算方法不用改变用户的模型表达形式就可以直接引入GAMS程序,引用新方法或者已有方法的新应用可以不改变现有的模型。线性、非线性、整形、混合整形非线性的优化问题都包括在内。(2) 由于GAMS使用了关系数据库模型,因此计算过程中所需要的计算机的资源被自动地分配,这就意味着GAMS能够构造大型和复杂的模型,而用户不用考虑计算机的资源限制、利用和分配等细节问题。所有数据以它们最基本的形式输入,数据的转换在构造模型的过程中进行。(3) 由于GAMS中优化问题的表达可以独立于使用的数据,这种逻辑和数据的分离允许用户在不增加表达形式复杂性的情况下改变模型的规模。(4) 变量的解释文本是符号定义中的一部分,而且无论何时,相关的变量和数值出现时解释文本都会再现。(5) 模型具有可移植性。GAMS程序可以在不同类型的计算机上求解而不用改变模型。模型在微型机上能够使用,在大型机上也能求解。前人开发的模型可以被后人使用,只要移动模型的GAMS语句,这些程序语句包含了所有的数据、算法和求解模型所需的逻辑说明。(6) 灵活的输入输出方式。基本的GAMS系统没有专门的输入编辑器和图形输出程序,只是提供了一个用户界面。这种开放的体系结构,使用户可以利用任何他们熟悉的文字处理器编辑GAMS程序,并将运行结果输出到一些通用的图表处理系统。当然要充分理解这些设计特点需要做大量的练习,但是最终目标是使模型更可用、可读、更容易理解、更可以实证,因此更可信。下面我们结合一个简单的实例有次序地介绍GAMS语言的成分。介绍语法规则时采用以下的约定。 表示括起来的部分是可选的。 表示括起来的部分有可能被重复多次。 | 表示“或”操作,符号 | 两边的操作均有效。2.1.2 一个简单的应用实例本节以一个线性规划的运输问题为例,介绍如何用GAMS系统对一个简单的优化问题建立模型、求解模型和进行结果分析的详细过程。这个实例虽然简单,但几乎完全概括了GAMS的特性。如果考虑一个更大的运输问题,读者会发现在这个GAMS程序里列出的模型框架及内容陈述基本不用改变。1问题的提出在熟悉的运输模型中,我们指定某一商品由若干工厂供应,并在若干市场有需求,我们假定商品从每个工厂到每个市场运输的单位成本已知。要解决的问题是:每个工厂应该供应多少该商品到各个市场,才能让运输成本达到最小?这个问题的代数表达式描述如下:索引: i 工厂; j 市场;已知数据:ai 工厂 i 的商品供应(箱); bj 市场 j 的商品需求(箱); cij 在工厂i 和市场 j 之间运输的单位成本($/箱)。决策变量:xij 从工厂i 运往市场j 该商品的总数量(箱);对所有的i, j来说, xij0;约束条件:工厂 i 所能供应的该商品的量为ai,则对于所有的I来说,有关系式:, 即所有市场的需求量不能超过工厂能供应的量。所有的市场 j 对该商品的需求要满足关系式:, 即所有工厂所能供应的量应该大于市场的需求。目标函数:这个简单的实例揭示了建立优化模型的某些重要步骤,而这些步骤与GAMS的设计保持一致。只是在GAMS中,集合的索引用sets定义,已知数据用parameters 描述,决策变量用variables 表示,约束条件和目标函数用方程来声明和定义。运输问题的GAMS表达式与上面列出的代数表达式很类似,其区别在于GAMS的表达方式可以被计算机编译并且执行。在这个运输问题的实例中,假设有两个罐头加工厂和三个销售市场,已知的数据如下(这个实例选自Dantzig,1963)。工厂产地到市场的距离(1000英里)供货量(箱)纽约芝加哥托皮卡西雅图2.51.71.8350圣地亚哥2.51.81.4600需求量(箱)3253002752GAMS程序假设运送距离以千英里为单位,运送成本是每箱每千英里90美元,这个问题的GAMS程序如下。$Title A Transportation Problem$OntextThis problem finds a least cost shipping schedule that meetsrequirements at markets and supplies at factories.References: Dantzig, G B, Linear Programming and Extensions Princeton University Press, Princeton, New Jersey, 1963, Chapter 3-3.$Offtext Sets i canning plants / seattle, san-diego / j markets / new-york, chicago, topeka / ; Parameters a(i) capacity of plant i in cases / seattle 350 san-diego 600 / b(j) demand at market j in cases / new-york 325 chicago 300 topeka 275 / ; Table d(i,j) distance in thousands of miles new-york chicago topeka seattle 2.5 1.7 1.8 san-diego 2.5 1.8 1.4 ; Scalar f freight in dollars per case per thousand miles /90/ ;Parameter c(i,j) transport cost in thousands of dollars per case ; c(i,j) = f * d(i,j) / 1000 ; Variables x(i,j) shipment quantities in cases z total transportation costs in thousands of dollars ; Positive Variable x ; Equations cost define objective function supply(i) observe supply limit at plant i demand(j) satisfy demand at market j ; 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) ; Model transport /all/ ; Solve transport using lp minimizing z ; Display x.l, x.m ;2.1.3 GAMS运行结果与模型概述1运行结果运输模型用上面的GAMS语句明确的表达并在GAMS环境下求解。虽然在不同的计算机上调用GAMS可能会在一些细节上稍有不同,但是统一的格式是在文件名的后面加上后缀GMS。模型在运行过程中会输出一系列的运行信息,包括模型名称,错误报告等。当运行结束时,如果一切正常,GAMS会将最优的方案以下面的格式显示。new-york chicago topekaseattle 50.000 300.000san-diego 275.000 275.000同时还会得到一个边际成本的列表输出。chicago topekaseattle 0.036san-diego 0.009GAMS的运行结果说明最佳的选择是从西雅图到托皮卡不运送任何货物,如果坚持要运送的话,那么每送一箱货物就会在最优费用的基础上增加36美元。同样的道理,如果从圣地亚哥向芝加哥送货的话,每送一箱货物就会在最优费用的基础上增加9美元。2GAMS模型概述表2.1是参考上面的实例写出的GAMS模型的基本组成。表2.1 GAMS模型组成输入输出索引声明索引元素赋值程序列表数据(常数、参数、表格)声明数据值 运行参考图变量声明类型定义边界和初值设定(可选择)方程列表方程声明定义状态报告模型和求解语句结果输出显示语句(可选择)我们先对GAMS语句构造的模型给出一些概括的评述。(1) GAMS模型是用GAMS语言进行描述的集合。语句执行的次序按照顺序的规则。(2) GAMS语句在编辑时可以是用户要求的任何形式,每条语句可以多行,并且每行都可以有多条语句。(3) 对于GAMS的初学者来说,应该用分号结束每一条语句,就像实例中那样。GAMS编译时不分辨大小写,大小写字母可以随意使用。(4) 文档对于数学模型的有用性至关重要。模型的解释文档被嵌入到模型中,而不是单独写入,这种表达方式更更有效和精确。至少有两种办法可以使文档嵌入到模型中。第一种,第一列以星号开始的任意一行都被GAMS编译器作为说明而不予执行;第二种可能更有效,文档被嵌入到特殊的GAMS语句中。在运输模型中的所有说明文档都采用了第二种方式。(5) 从上面的输入成分的列表中可以看到,GAMS模型各部分的建立需要两个步骤:声明和赋值(或定义)。“声明”意味着声明一些事物的存在并给它们命名;“赋值”或“定义”给予特别的值或表达式。在方程模块中,必须分别声明和定义每一个GAMS方程,而对于GAMS模型所有其它的部分,可以选择用统一的语句声明和定义,或者分别用不同的语句来声明和定义。(6) 为模型中的元素命名必须用字母开头,后面最多连接9个字母或数字。2.2 GAMS基本语句2.2.1 GAMS的赋值语句1集合与索引集合与索引的定义是GAMS模型的一个基本模块,它与编程语言中集合与索引的表达方式非常类似。上面提到的运输实例包含了一个设置集合与索引的语句:set。Setsi canning plants / seattle, san-diego /j markets / new-york, chicago, topeka / ;这个语句的结果是给程序中将要使用的集合的索引命名并赋值。我们也可以用普通的数学表达式给这两个索引赋值:i = Seattle, San Diegoj = New York, Chicago, Topeka.请注意其中的区别。(1) GAMS程序中赋值使用的是斜杠“/”而不是大括号;(2) 有间隔的单词不能用作索引元素值,必须加连字符,如new-york。Sets语句中的文本是可选择的,它只为模型的内部文档提供非正式的用途,GAMS编译器并不解释文本,只是为了随时显示。也可以使用两个Sets语句完成上面的功能。如:Set i canning plants / seattle, san-diego / ;Set j markets / new-york, chicago, topeka / ;为索引元素赋值时可以使用星号,当元素是顺序排列时它提供了一种方便的表达方式。例如,下面列出的Sets语句在GAMS中是有效的。Set t time periods /1991*2000/;Set m machines /mach1*mach24/;赋值效果等同于:t = 1991,1992,1993, ., 2000m = mach1, mach2,., mach24,注意到Sets语句被作为字符串存储,所以t 元素不是数字。还有一个使索引与先前定义过的索引同名的语句,如:Alias (t,tp);这里,tp 与符号 t的功能相同,这个语句表现了同一个集合中t元素的相互关系,这在模型中很有用。2数据输入运输问题的GAMS模型表现了数据输入三种不同的基本格式,分别是列表、表格和直接赋值。(1) 用列表的方式输入数据实例中的第一个参数语句用的是列表方式。如:Parametersa(i) capacity of plant i in cases/ seattle 350san-diego 600 /b(j) demand at market j in cases/ new-york 325chicago 300topeka 275 / ;这条语句有多个作用。 它定义了两组参数,将它们命名为a 和b,并且分别引入了它们的索引i 和j; 这个语句也给每组参数加上了说明文档; 这个语句给两个集合中的每个元素a(i) 和b(j)赋值; 将这个语句按下面的规则分成两个语句是完全可以的。Parameters a(i) capacity of plant i in cases/ seattle 350san-diego 600 / ;Parameters b(j) demand at market j in cases/ new-york 325chicago 300topeka 275 / ;(2) 通过表格输入数据建模人员有时会发现大型模型中很多数据来自于一些并不大的表格,因此用表格形式输入数据很有用。运输模型提供的一个二维表如下。Table d(i,j) distance in thousands of milesnew-york Chicago topekaseattle 2.5 1.7 1.8san-diego 2.5 1.8 1.4 ;这个格式的作用就是标明集合参数d和对应于各索引i和j的参数值,如果表格中有空缺,可以认为是零。使用表格输入参数时,GAMS将检查集合的维数和索引的值,也可以用表格形式输入多于二维的情况。(3) 通过赋值语句输入数据参数还可以用直接赋值语句进行计算。如运输模型就采用了与列表和表格输入不同的方式给参数赋值。Parameter c(i,j) transport cost in thousands of dollars per case ;c(i,j) = f * d(i,j) / 1000 ;第一行末的分号不可省略,它使GAMS编译器能将参数的有效解释与赋值计算分开。第一个语句说明参数c是一个有索引i和j的集合并提供含义。第二个语句计算参数值c(i,j),但必须在此语句前给f和 d(i,j)赋值,在GAMS中才是合法的语句。上面的直接赋值应用于集合c中所有的(i,j)对。如果想为集合中的特殊元素赋值,要用引号括上此元素所对应的索引。如:c(Seattle,New-York) = 0.40; 这也是有效的GAMS赋值语句。同样的参数可以不止一次被赋值。每一个赋值语句马上生效并且替换先前的值。但同样的参数只能被说明一次。赋值语句的右边包含各种各样的数学表达式,用户只要熟悉某种程序设计语言,如FORTRAN 或C语言,就可以很方便的在GAMS中写赋值语句。GAMS的标准运算和提供的函数我们在后边会给出一般的说明。需要注意的是直接赋值语句左边的参数要事先说明,右边的参数在此语句之前已经被赋值。下面是一些有效赋值的实例。csquared = sqr(c);e = m*csquared;w = l/lamda;eoq(i) = sqrt( 2*demand(i)*ordcost(i)/holdcost(i);t(i) = min(p(i), q(i)/r(i), log(s(i);euclidean(i,j) = qrt(sqr(xi(i) - xi(j) + sqr(x2(i) - x2(j);present(j) = future(j)*exp(-interest*time(j);2.2.2 GAMS的变量与方程1 变量的定义与赋值GAMS模型中的决策变量(或内生变量)必须用变量语句说明。每个变量给一个名字,可以是集合变量,可以有文本说明。运输模型中包含了以下变量语句。Variablesx(i,j) shipment quantities in casesz total transportation costs in thousands of dollars ;这是一个对集合变量x(i,j)和标量z进行说明的语句,每个GAMS优化模型在求解时必须包含一个诸如此类的标量,使之为求目标的最小或最大值服务。一旦变量被定义,每个变量必须指定一个类型。表2.2给出了变量可能的类型和各种类型的取值范围。表2.2 变量类型和取值范围变量类型变量允许的取值范围free(default)- to +positive0 to +negative- to 0binary0 or 1integer0,1,., 100 (default)为目标最大化或最小化服务的变量一定是一个标量,也一定是一个free类型的变量。在我们的运输模型中,z是默认为free类型的,但x(i,j)有非负的约束,由下面的语句给出。Positive variable x ;注意x的集合特性在类型设定中不再重复,每个索引所对应的集合元素值有相同的变量类型。后面还要描述怎样设置变量的下界、上界和初始值。2方程式像GAMS这样能够处理数学模型语言的系统的主要功能在于生成统一结构的等式和不等式。一组等式或不等式具有相同的代数结构,组中所有的成员同时被构造出来。(1) 方程的声明方程必须被单独的语句声明和定义,而这个声明的格式要符合GAMS语句的要求。我们的运输模型包含下面的方程式声明语句。Equationscost define objective functionsupply(i) observe supply limit at plant idemand(j) satisfy demand at market j ;单词Equations在GAMS中用途很广,它包含等式和不等式关系。一个具有单独名称的GAMS登是可以指得是一种或多种关系。例如,cost是标量,所以它是单个等式;但supply是集合变量,它定义了随索引i 变化的一个不等式集合。(2) GAMS求和(求积)方式GAMS不使用标准的数学符号求和,它采用求和函数。举一个简单的例子,运输模型中包含下面的表达式:Sum(j, x(i,j)此式等价于下面是一个稍微复杂一点的求和表达式:Sum(i,j), c(i,j)*x(i,j)计算结果等价于这个表达式也可以写成如下的嵌套求和的形式:Sum(i, Sum(j, c(i,j)*x(i,j)GAMS中求积的定义与求和的定义几乎一样,只要用prod 代替sum就行。例如:prod(j, x(i, j) 等价于 有时会用求和与求积函数给参数赋值并加以说明。例如:scalar totsupply total supply over all plants;totsupply = sum(i, b(i);(3) 方程式的定义方程式的定义由于其复杂性,使得它是GAMS中最复杂的语句。一个方程式的定义由以下各部分组成。l 方程式的名称l 索引名l 索引限制条件(可选)l 标记“.”l 左边表达式l 相关运算符l 右边表达式运输实例中包含三个这样的语句。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) ;在许多现实问题中,由于特殊的原因,某个方程中集合变量的元素需要被忽略或者与其他的模型有所区别。GAMS使用功能强大的“$”符号或者逻辑运算符来调整这些结构的缺陷,还有一种方法是用索引来限制实际模型的大小,这一点对得到模型的可行解来说很有必要。下面是相关的逻辑运算符的含义:=l= 小于或等于=g= 大于或等于=e= 等于“=”和“=e=”是有区别的。符号“=”只是在直接赋值语句中使用,而符号“=e=”只在方程式定义时使用。在模型求解之前,赋值语句的任务是将一个具体数值或表达式运算结果赋给一个参数;定义一个方程也描述一种要求关系,但是直到调用模型求解语句之后才能满足。所以说方程式定义必须包含变量而不是包含直接的赋值。变量可以在方程式的左边、右边、单独或同时出现,同一个变量可以在一个方程里面出现多次。GAMS编译器在执行求解语句时自动把方程式转换为标准的等价形式(变量在左边,没有重复的出现)。定义一个方程式可以在GAMS程序里的任何地方出现,只要其中的方程、变量及参数在这之前被声明。2.2.3 目标函数、模型定义与求解1目标函数GAMS中的目标函数只是一个提示,并没有一个明确的目标函数实体。为了使优化的目标准确用户必须使用一个变量,这是一个free型的标量,定义目标函数的方程式时出现。2模型定义单词model在GAMS中有精确的含义。简单地讲是一些方程式的集合。和其他的GAMS组分一样,它在定义时必须命名。定义的形式是关键字model跟着模型的名字,随后是在斜线里包含的一个方程式列表。如果以前定义的方程式全部在内,可以输入/all/代表那些具体的方程。在我们的例子里,有一个模型语句:model transport /all/ ;这个语句看起来多余,但是这对可以在一个GAMS里建立几个模型的高级用户有用。如果我们用选择的方程列表而不用/all/,则上面的语句就可以写成:model transport / cost, supply, demand / ;当一个具体的模型只需要所定义的方程式列表中的一个子集时,可以采用选择列表的方式。3模型求解一旦模型被定义以及方程式被指定,我们就可以调用求解语句solve,在我们的例子中,写为:solve transport using lp minimizing z ;solve语句的格式如下:(1) 关键字solve(2) 求解的模型名(3) 关键字using(4) 一个可利用的求解程序。程序列表是:lp 线性规划nlp 非线性规划mip 混合整数规划rmip 不严格的混合整数规划minlp 混合整数非线性规划rminlp 不严格的混合整数非线性规划mpec 有均衡约束的数学规划cns 有约束的非线性规划 (5)关键字“minimizing”或“maximizing” (6)被优化的变量名。2.2.4 结果输出1GAMS的输出GAMS默认输出的信息非常丰富。主要包括的内容有:程序清单、错误信息、运行参考图、模型统计、状态报告和结果报告。程序清单将列出带语句序号的所有源程序代码,编译过程中出现的问题会在这里说明(读者自行练习,本书不再详述);运行参考图和模型统计会列出模型中所有变量和参数的属性、独立方程与变量的个数,以及它们之间的关系等模型信息;状态报告将通知用户计算所用的算法和迭代次数、模型求解过程是否顺利,求出来的解是可行的还是不可行的,是否得到了最优解,如果每组模型的运行结果均有如下的语句显示:feasible solution 和optimal solution,也有的显示结果为:EXIT - Optimal Solution found.和*Status: Normal completion。这样的结果表示运行成功,得到了最优解。否则,或者是语法错误(这会在错误信息中显示出来),或者是算法和逻辑错误(这需要用户自己解决)。最后出现的结果报告是按照用户要求的变量和参数名称,以及相应的格式输出的各种列表。2根据用户的要求输出solve语句执行的结果会存储到一个文件中,我们可以根据需要要求GAMS显示这些结果。我们的程序包括下面的语句:display x.l, x.m ;这个语句要求输出货运变量x(i,j)的最终结果x.l和边际成本x.m,GAMS会自动将这个输出要求转化为有适当标题的表格。另外,我们还可以让GAMS将运算的结果经过转换以后再显示。例如,在运输问题中,假定我们希望知道被每个部门占有的各个市场需求的百分比,那么在solve语句之后,我们还可以输入语句:parameter pctx(i,j) perc of market js demand filled by plant i;pctx(i,j) = 100.0*x.l(i,j)/b(j) ;display pctx ;在对最初的运输问题附加了这些命令之后,会有下面的输出:pctx percent of market js demand filled by plant inew-york chicago topekaseattle 15.385 100.000san-diego 84.615 100.0002.3 GAMS一般规则一个GAMS程序被包含在一个磁盘文件里,GAMS是用编程语言编写的程序,一般用一个选定的文本编辑器构建。当这个程序运行时,包含程序的文件被提交给GAMS系统处理。在处理结束后、出现结果之前,GAMS会输出处理的过程,让用户知道进展的情况和发生的错误。仔细检查GAMS的运行输出,适时正确地诊断错误是用户的责任。2.3.1 GAMS程序GAMS程序由一些定义数据结构的、赋初值的、进行计算的和表示某种数学关系的语句组成。每一个在模型中需要参与计算的元素都要用一个明确的符号(变量名或参数名)表示,符号所在的语句被引用之前,必须被赋值,每个完整的GAMS语句后面要用分号结束。1GAMS语句属性(1)非执行语句如果语句的第一列用了符号“*”,表示这是一行注释语句,不被执行。如果语句的第一列用了符号“$”,编译器会处理本行的其余部分,如:语句“$include file1”,表示在对应的位置插入被指定的文件(file1)的内容。如果有大块的解释文本,还可以用下面的语句对来实现。$ontext $offtext(2)声明语句与执行语句声明语句首先描述标识符所表示的含义,然后给这个标识符所代表的模型元素赋值。我们前面接触过的set、alias、parameter、scalar、table、variable 、model,以及equation语句给出的方程的声明与定义均属于声明语句。执行语句完成数据传递、模型求解和报告生成等任务。GAMS的执行语句有:option、display、solve、 assignment、for、execute、abort、while、loop、repeat,由于篇幅关系,我们在本书中只介绍一些常用的执行语句。(3)GAMS语句的顺序一个GAMS程序中可以先定义模型,后组织数据,也可以采用相反的顺序来书写语句。我们如果采用后者的话,则要按以下的顺序组织三个模块。l 数据模块首先用set 和alias语句确定集合所用的索引;然后用parameter、scalar和table语句声明各类参数并赋值。注意这里声明与赋值的区别以及严格的顺序。例如,下面的两句分别是对索引和集合参数的声明:set c crops ;parameter yield crop yield ;然后需要对应的两个赋值语句:set c / wheat, clover, beans/ ;parameter yield / wheat 1.5clover 6.5beans 1.0 / ;第一个语句给索引赋值,第二个语句给集合参数中每个索引所对应的集合元素赋值。l 模型模块首先用variable和equation语句声明变量和方程,再给出方程定义;然后定义模型。l 求解与输出模块首先用solve进行模型求解,再用display语句输出运行结果。2GAMS的标识符与保留字GAMS允许的合法字符与大多数高级语言类似,在此不详述。GAMS的标识符是给程序中的参数、变量和模型等起的名字,一个标识符的长度限制在10个字符之内,用字母开头,后面跟着字母与数字。GAMS对标识符的解释文本一般紧跟在标识符后,可以用引号也可以不用引号。GAMS与其它程序设计语言一样,要使用一些被确定意义的保留字。用户不允许使用这些保留字为自己的模型中的元素命名。保留字的完整目录如表2.3所示。GAMS还有部分保留的非文字符号,如:=l=、 =g=、 =e=、 =n=、 -、 + 和 *。3数字GAMS数值计算类似于其他的计算机编程语言,但它不区别实数和整数类型,参与运算的均作为实数对待。下面列出的都是合法的数据输入:0 2e10 0.0 EPS 156.70 2e+10 .0 NA -135 15.e+10 0. .095 .314e5 INF 1. +1.7 INF字母 e是一种方便的科学计数方式,可以代表非常大或非常小的数值。例如:1e-5 = 1 * 10-5 = 0.00001 3.56e6 = 3.56 *106 = 3,560,000GAMS能操作的数字范围比很多计算机编程语言允许的范围要小,因此尽量避免使用或产生绝对值大于1.0e+20的数值。表2.3 GAMS系统的保留字4索引与参数4索引与参数(1)索引的定义与赋值l 星号的作用星号“*”在索引的定义时有特殊的作用。例如在一个模型中,我们需要列出从1990年至2000年中的10个数据,并不需要把每一年都写出来,只要在定义集合的索引时写成:set t time /1991 * 2000 /;表示索引t的取值为:1990、1991、1992、. . .、2000。注意星号“*”只对数字有效,并且增量只能是正1。例如语句 set g / a1bc * a20bc /;和 set g / a01bc * a20bc /;都产生20个元素,有11个相同元素,但它们产生的是不同的索引。还要注意索引的值是字符形式的量,不能参与计算。l alias语句alias可以重复使用已经定义了的索引,索引的这一特点在一般均衡模型的应用中非常有用。如商品的集合用索引定义为:set c commodities / food, clothing / ;与索引 c具有同样内容的另一个索引cp可以用下面的语句定义。alias (c, cp) ;alias (cp, c) ;alias还可以用于给多个索引赋给同样的序列值,如:alias (c,cp, cpp, cppp);就将用一个set语句为索引c 赋的序列值同时赋给了其余的索引cp, cpp和 cppp。l 多维setGAMS允许set的设置高达10维。比如c的序列值表示国家,p的序列值表示港口,则有:set c countries/ jamaicahaitiguyanabrazil / ;set p ports/ kingstons-domingogeorgetownbelem / ;可以用set语句建立起港口和国家的联系如下:set ptoc(p, c) port to country relationship/ kingston .jamaicas-domingo .haitigeorgetown .guyanabelem brazil /;园点“.”左边的元素属于p,右边的元素属于 c。上面建立的是一对一的关系,也可以用set语句建立一种多对多的关系。如:set i / a, b /j / c, d, e /ij1(i,j) /a.c, a.d/ij2(i,j) /a.c, b.c/ij3(i,j) /a.c, b.c, a.d, b.d/ ;这里的ij1表示一对多的关系,即一个i中的元素对应多个j中的元素;ij2表示多对一的关系,即一个j中的元素对应多个i中的元素;ij3表示多对多的关系,即多个j中的元素对应多个i中的元素。(2)参数的定义与赋值l 直接参数赋值直接参数赋值用Scalars语句,这个语句给标量参数赋值,即一个参数名对应一个具体的数值。一个典型的Scalars语句如下:Scalars rho discount rate / .15 /irr internal rate of returnlife financial lifetime of productive units /20/;这个Scalars定义了三个参数,但只给两个参数rho 和life赋了值,另外一个参数后来使用了专门的赋值语句:irr = 0.07;注意这个语句只有在参数irr经Scalars定义以后才有效。l 集合参数赋值一个集合参数可以被一个或者多个索引序列检索,集合中的元素应该属于那些已经检索过的索引。参数的默认值是零。为集合参数赋初始值需要一列数据元素,每一个索引对应一个元素值,每一列在开头和末尾使用斜线符号,数据输入超过一行要用逗号分割,索引与元素值之间用空格分开,如果元素值是字符串,用引号括起来。如下面的赋值语句:Set i steel plants / hylsa monterreyhylsap puebla /j markets / mexico-df, monterrey, guadalaja / ;parameter dd(j) distribution of demand/ mexico-df 55,guadalaja 15 / ;集合参数dd中的每个元素值都与索引序列中的每个元素对应,由于对应 j=“monterrey”的元素没有赋值,说明monterre的市场份额是零。我们也可以将多个数据放在一行,用逗号分开:parameter a(i) / seattle = 350, san-diego = 600 /b(i) / seattle 2000, san-diego 4500 / ;l 表格赋值用表格可以为二维以上的集合参数赋值。表格赋值语句也是GAMS中唯一的一个格式限定的语句。表格中的每个元素顺序一定,并且必须与相对应的索引的交叉点位置一致,即它们有固定的行、列位置。在用表格语句table之前,必须有set语句来为表格元素确定其在集合中的位置。我们通过下面的示例来说明这一点。sets i plants/ inchon,ulsan,yosu /m productive units/atmos-dist atmospheric distillation unitsteam-cr steam crackeraromatics aromatics unithydrodeal hydrodealkylator / ;table ka(m,i) initial cap. of productive units (100 tons per yr)inchon ulsan yosuatmos-dist 3702 12910 9875steam-cr 517 1207aromatics 181 148hydrodeal 180 ;此例中的行坐标由m确定,列坐标由i 确定。如果一行列不下需要续行的话,用“+”号继续,如上例也可以写成:table ka(m,i) initial cap. of productive units (100 tons per yr)inchon ulsanatmos-dist 3702 12910steam-cr 517aromatics 181hydrodeal 180+ yosuatmos-dist 9875steam-cr 1207aromatics 148 ;表格可以是多维的,下面的例子是三维的。Sets ci commodities : intermediate/ naphtha naphthadist distillategas-oil gas-oil /cr commodities : crude oils/ mid-c mid-continent”w-tex west-texas /q attributes of intermediate products/ density, sulfur / ;table attrib(ci, cr, q) blending attributesdensity sulfurnaphtha. mid-c 272 .283naphtha. w-tex 272 1.48dist . mid-c 292 .526dist . w-tex 297 2.83gas-oil. mid-c 295 .98gas-oil. w-tex 303 5.05 ;也可以用下面的表格完成同样的赋值效果。table attrib (ci,cr,q) blending attributesw-tex.density mid-c.density w-tex.sulfur mid-c.sulfurnaphtha 272 272 1.48 .283dist 297 297 2.83 .526gas-oil 303 303 5.05 .98 ;2.32 GAMS的运算GAMS在参数赋值和模型处理时都使用了大量的算术运算,基本运算法则与其他的计算机程序设计语言相似。我们在这里主要介绍GAMS程序的特殊用法。1用索引赋值通过这项操作可以完成多个同时或并列的赋值任务,还可以为一个集合内的成员集中赋值。如为二维集合参数中100个成员赋初值:Set row / r-1*r-10 /col / c-1*c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农发行黄冈市武穴市2025秋招笔试性格测试题专练及答案
- 农发行伊犁哈萨克自治州伊宁市2025秋招笔试英文行测高频题含答案
- 农发行绵阳市北川羌族自治县2025秋招笔试创新题型专练及答案
- 农发行苏州市张家港市2025秋招笔试综合模拟题库及答案
- 国家能源广州市增城区2025秋招网申填写模板含开放题范文
- 国家能源黄石市阳新县2025秋招笔试数学运算题专练及答案
- 白山临江中石油2025秋招笔试性格测评专练题库及答案
- 国家能源东营市垦利区2025秋招笔试思维策略题专练及答案
- 写给父母的感谢信(集合15篇)
- 医生医德医风工作总结集锦15篇
- 浦南运河建设方案
- 2024年4月自考00634广告策划试题
- 沪教版九年级上册化学第三章《物质构成的奥秘》检测卷(含答案解析)
- 如何与客户建立有效的沟通
- 薯片加工项目规划设计方案
- 部编版小学数学六年级上册分数乘法应用题解法一:找单位“1”解析同步练习
- 职业教育课题申报:产教融合背景下职业院校“四位一体”校企合作模式研究与实践
- 效益工资发放审批表
- 土壤的环境背景值与容量
- GB/T 26399-2011电力系统安全稳定控制技术导则
- 电动葫芦检查安装检查验收使用表格
评论
0/150
提交评论