1、第 2 章 通用数学建模系统(GAMS)基本知识24第 2 章 通用数学建模系统(GAMS)基本知识经过多年来的改进和完善,GAMS 为用户表达、计算和求解大型和复杂模型提供了高水平的编程语言。其突出特点是:允许模型的描述独立于求解算法,允许在规范化的标准模型中、在保证安全的条件下作少许变化,要求变量之间的代数关系表述明确。本章用一个简单实例来说明 GAMS 系统在建立和求解优化模型中的用法,要熟练掌握 GAMS 的应用需要大量的建模实践,详细的 GAMS 语句说明请参考相关的用户说明书。2.1 GAMS 系统简介GAMS 的设计融入了数学方程的设计思想和关系数据库理论,目的是满足战略建模者的
2、需求。数学方程设计提供了描述问题和多种求解问题的方法,而关系数据库理论为数据组织及其应对变化提供了一个框架结构。因此具有数学模型基础和计算机程序设计基础将有利于对 GAMS 应用的理解。2.1.1 GAMS 基本特性GAMS 模型的表达式人和计算机都能读懂,这说明 GAMS 程序本身就是模型的文件。而且,GAMS 的设计融入了以下的特性来满足用户的需要。(1) GAMS 的表达式充分利用了数学表达式的优点。GAMS 将算法与语言结合,因此所有现成的计算方法不用改变用户的模型表达形式就可以直接引入 GAMS 程序,引用新方法或者已有方法的新应用可以不改变现有的模型。线性、非线性、整形、混合整形非
3、线性的优化问题都包括在内。(2) 由于 GAMS 使用了关系数据库模型,因此计算过程中所需要的计算机的资源被自动地分配,这就意味着 GAMS 能够构造大型和复杂的模型,而用户不用考虑计算机的资源限制、利用和分配等细节问题。所有数据以它们最基本的形式输入,数据的转换在构造模型的过程中进行。(3) 由于 GAMS 中优化问题的表达可以独立于使用的数据,这种逻辑和数据的分离允许用户在不增加表达形式复杂性的情况下改变模型的规模。(4) 变量的解释文本是符号定义中的一部分,而且无论何时,相关的变量和数值出现时解释文本都会再现。(5) 模型具有可移植性。GAMS 程序可以在不同类型的计算机上求解而不用改变
4、模型。模型在微型机上能够使用,在大型机上也能求解。前人开发的模型可以被后人使用,只要移动模型的 GAMS 语句,这些程序语句包含了所有的数据、算法和求解模型所需的逻辑说明。(6) 灵活的输入输出方式。基本的 GAMS 系统没有专门的输入编辑器和图形输出程序,只是提供了一个用户界面。这种开放的体系结构,使用户可以利用任何他们熟悉的文字处理器编辑 GAMS 程序,并将运行结果输出到一些通用的图表处理系统。当然要充分理解这些设计特点需要做大量的练习,但是最终目标是使模型更可用、可读、更容易理解、更可以实证,因此更可信。下面我们结合一个简单的实例有次序地介绍 GAMS 语言的成分。介绍语法规则时采用以
5、下的约定。第 2 章 通用数学建模系统(GAMS)基本知识25 表示括起来的部分是可选的。 表示括起来的部分有可能被重复多次。| 表示“或”操作,符号 | 两边的操作均有效。2.1.2 一个简单的应用实例本节以一个线性规划的运输问题为例,介绍如何用 GAMS 系统对一个简单的优化问题建立模型、求解模型和进行结果分析的详细过程。这个实例虽然简单,但几乎完全概括了 GAMS 的特性。如果考虑一个更大的运输问题,读者会发现在这个 GAMS 程序里列出的模型框架及内容陈述基本不用改变。1问题的提出在熟悉的运输模型中,我们指定某一商品由若干工厂供应,并在若干市场有需求,我们假定商品从每个工厂到每个市场运
6、输的单位成本已知。要解决的问题是:每个工厂应该供应多少该商品到各个市场,才能让运输成本达到最小?这个问题的代数表达式描述如下:索引: i 工厂; j 市场;已知数据: ai 工厂 i 的商品供应(箱) ; bj 市场 j 的商品需求(箱) ;cij 在工厂 i 和市场 j 之间运输的单位成本($/箱) 。决策变量: xij 从工厂 i 运往市场 j 该商品的总数量(箱) ;对所有的 i, j 来说, xij0;约束条件:工厂 i 所能供应的该商品的量为 ai, 则对于所有的 I 来说 , 有关系式:, jiiax即所有市场的需求量不能超过工厂能供应的量。所有的市场 j 对该商品的需求要满足关系
7、式:, ijjbx即所有工厂所能供应的量应该大于市场的需求。目标函数: ijijKxc)($这个简单的实例揭示了建立优化模型的某些重要步骤,而这些步骤与 GAMS 的设计保持一致。只是在 GAMS 中,集合的索引用 sets 定义,已知数据用 parameters 描述,决策变量用 variables 表示,约束条件和目标函数用方程来声明和定义。第 2 章 通用数学建模系统(GAMS)基本知识26运输问题的 GAMS 表达式与上面列出的代数表达式很类似,其区别在于 GAMS 的表达方式可以被计算机编译并且执行。在这个运输问题的实例中,假设有两个罐头加工厂和三个销售市场,已知的数据如下(这个实例
8、选自 Dantzig,1963) 。工厂 产地到市场的距离(1000 英里) 供货量(箱)纽约 芝加哥 托皮卡西雅图 2.5 1.7 1.8 350圣地亚哥 2.5 1.8 1.4 600需求量(箱) 325 300 2752GAMS 程序假设运送距离以千英里为单位,运送成本是每箱每千英里 90 美元,这个问题的GAMS 程序如下。$Title A Transportation Problem$OntextThis problem finds a least cost shipping schedule that meetsrequirements at markets and supplie
9、s at factories.References: Dantzig, G B, Linear Programming and ExtensionsPrinceton University Press, Princeton, New Jersey, 1963, Chapter 3-3.$OfftextSetsi canning plants / seattle, san-diego /j markets / new-york, chicago, topeka / ;Parametersa(i) capacity of plant i in cases/ seattle 350san-diego
10、 600 /b(j) demand at market j in cases/ new-york 325第 2 章 通用数学建模系统(GAMS)基本知识27chicago 300topeka 275 / ;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 ;Scalar f freight in dollars per case per thousand miles /90/ ;Parameter c(i,j) transport
11、cost in thousands of dollars per case ;c(i,j) = f * d(i,j) / 1000 ;Variablesx(i,j) shipment quantities in casesz total transportation costs in thousands of dollars ;Positive Variable x ;Equationscost define objective functionsupply(i) observe supply limit at plant idemand(j) satisfy demand at market
12、 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 可能会在一些细节上稍有不同,但是统一的格式是在文件名的后
13、面加上后缀第 2 章 通用数学建模系统(GAMS)基本知识28GMS。模型在运行过程中会输出一系列的运行信息,包括模型名称,错误报告等。当运行结束时,如果一切正常,GAMS 会将最优的方案以下面的格式显示。new-york chicago topekaseattle 50.000 300.000san-diego 275.000 275.000同时还会得到一个边际成本的列表输出。chicago topekaseattle 0.036san-diego 0.009GAMS 的运行结果说明最佳的选择是从西雅图到托皮卡不运送任何货物,如果坚持要运送的话,那么每送一箱货物就会在最优费用的基础上增加 3
14、6 美元。同样的道理,如果从圣地亚哥向芝加哥送货的话,每送一箱货物就会在最优费用的基础上增加 9 美元。2GAMS 模型概述表 2.1 是参考上面的实例写出的 GAMS 模型的基本组成。表 2.1 GAMS 模型组成输入 输出索引声明索引元素赋值程序列表数据(常数、参数、表格)声明数据值 运行参考图变量声明类型定义边界和初值设定(可选择)方程列表方程声明定义状态报告模型和求解语句 结果输出显示语句(可选择)我们先对 GAMS 语句构造的模型给出一些概括的评述。(1) GAMS 模型是用 GAMS 语言进行描述的集合。语句执行的次序按照顺序的规则。(2) GAMS 语句在编辑时可以是用户要求的任
15、何形式,每条语句可以多行,并且每行都可以有多条语句。第 2 章 通用数学建模系统(GAMS)基本知识29(3) 对于 GAMS 的初学者来说,应该用分号结束每一条语句,就像实例中那样。GAMS 编译时不分辨大小写,大小写字母可以随意使用。(4) 文档对于数学模型的有用性至关重要。模型的解释文档被嵌入到模型中,而不是单独写入,这种表达方式更更有效和精确。至少有两种办法可以使文档嵌入到模型中。第一种,第一列以星号开始的任意一行都被 GAMS 编译器作为说明而不予执行;第二种可能更有效,文档被嵌入到特殊的 GAMS 语句中。在运输模型中的所有说明文档都采用了第二种方式。(5) 从上面的输入成分的列表
16、中可以看到,GAMS 模型各部分的建立需要两个步骤:声明和赋值(或定义) 。 “声明”意味着声明一些事物的存在并给它们命名;“赋值”或“定义”给予特别的值或表达式。在方程模块中,必须分别声明和定义每一个 GAMS 方程,而对于 GAMS 模型所有其它的部分,可以选择用统一的语句声明和定义,或者分别用不同的语句来声明和定义。(6) 为模型中的元素命名必须用字母开头,后面最多连接 9 个字母或数字。2.2 GAMS 基本语句2.2.1 GAMS 的赋值语句1集合与索引集合与索引的定义是 GAMS 模型的一个基本模块,它与编程语言中集合与索引的表达方式非常类似。上面提到的运输实例包含了一个设置集合与
17、索引的语句: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 语句中的文本是可选择的,它只为模型的内部文
18、档提供非正式的用途,GAMS 编译器并不解释文本,只是为了随时显示。也可以使用两个 Sets 语句完成上面的功能。如:Set i canning plants / seattle, san-diego / ;Set j markets / new-york, chicago, topeka / ;第 2 章 通用数学建模系统(GAMS)基本知识30为索引元素赋值时可以使用星号,当元素是顺序排列时它提供了一种方便的表达方式。例如,下面列出的 Sets 语句在 GAMS 中是有效的。Set t time periods /1991*2000/;Set m machines /mach1*mach2
19、4/;赋值效果等同于:t = 1991,1992,1993, ., 2000m = mach1, mach2,., mach24,注意到 Sets 语句被作为字符串存储,所以 t 元素不是数字。还有一个使索引与先前定义过的索引同名的语句,如:Alias (t,tp);这里,tp 与符号 t 的功能相同,这个语句表现了同一个集合中 t 元素的相互关系,这在模型中很有用。2数据输入运输问题的 GAMS 模型表现了数据输入三种不同的基本格式,分别是列表、表格和直接赋值。(1) 用列表的方式输入数据实例中的第一个参数语句用的是列表方式。如:Parametersa(i) capacity of plan
20、t 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-d
21、iego 600 / ;第 2 章 通用数学建模系统(GAMS)基本知识31Parameters 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 ;
22、这个格式的作用就是标明集合参数 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 编译器能将参数的有效解释与赋值计算分开。第一个语句说明
23、参数 c 是一个有索引 i 和 j 的集合并提供含义。第二个语句计算参数值 c(i,j),但必须在此语句前给 f 和 d(i,j)赋值,在 GAMS 中才是合法的语句。上面的直接赋值应用于集合 c 中所有的(i,j)对。如果想为集合中的特殊元素赋值,要用引号括上此元素所对应的索引。如:c(Seattle,New-York) = 0.40; 这也是有效的GAMS赋值语句。同样的参数可以不止一次被赋值。每一个赋值语句马上生效并且替换先前的值。但同样的参数只能被说明一次。赋值语句的右边包含各种各样的数学表达式,用户只要熟悉某种程序设计语言,如 FORTRAN 或 C 语言,就可以很方便的在 GAMS
24、 中写赋值语句。GAMS 的标准运算和提供的函数我们在后边会给出一般的说明。需要注意的是直接赋值语句左边的参数要事先说明,右边的参数在此语句之前已经被赋值。下面是一些有效赋值的实例。第 2 章 通用数学建模系统(GAMS)基本知识32csquared = 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)
25、- 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 优化模型在求解时必须包含一
26、个诸如此类的标量,使之为求目标的最小或最大值服务。一旦变量被定义,每个变量必须指定一个类型。表 2.2 给出了变量可能的类型和各种类型的取值范围。表 2.2 变量类型和取值范围变量类型 变量允许的取值范围free(default) -to +positive 0 to +negative -to 0binary 0 or 1integer 0,1,., 100 (default)为目标最大化或最小化服务的变量一定是一个标量,也一定是一个 free 类型的变量。在我们的运输模型中,z 是默认为 free 类型的,但 x(i,j)有非负的约束,由下面的语句给出。Positive variable
27、x ;注意 x 的集合特性在类型设定中不再重复,每个索引所对应的集合元素值有相同的变量类型。后面还要描述怎样设置变量的下界、上界和初始值。2方程式第 2 章 通用数学建模系统(GAMS)基本知识33像 GAMS 这样能够处理数学模型语言的系统的主要功能在于生成统一结构的等式和不等式。一组等式或不等式具有相同的代数结构,组中所有的成员同时被构造出来。(1) 方程的声明方程必须被单独的语句声明和定义,而这个声明的格式要符合 GAMS 语句的要求。我们的运输模型包含下面的方程式声明语句。Equationscost define objective functionsupply(i) observe
28、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)此式等价于 jjix,下面是一个稍微复杂一点的求和表达式:Sum(i,j), c(i,j)*x(i,j)计算结果等价于 jjijiixc,这个表达式也可以写成如下的嵌套求和的形式:Sum(i, Sum(j, c(i,j)*x(i,j)GAMS中求积的定义与求和的定义几乎一样,只要用prod 代替sum就行。例如:prod(j, x(i, j) 等价于 jjix,有时会用求和与求积函数给参数赋值并加以说明。例如:scalar totsupply total supply over all plants;totsupply = sum(i, b(i);(3) 方程式的定义