第2章通用数学建模系统GAMS基本知识.docx
- 文档编号:10157775
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:46
- 大小:86.04KB
第2章通用数学建模系统GAMS基本知识.docx
《第2章通用数学建模系统GAMS基本知识.docx》由会员分享,可在线阅读,更多相关《第2章通用数学建模系统GAMS基本知识.docx(46页珍藏版)》请在冰点文库上搜索。
第2章通用数学建模系统GAMS基本知识
第2章通用数学建模系统(GAMS)基本知识
经过多年来的改进和完善,GAMS为用户表达、计算和求解大型和复杂模型提供了高水平的编程语言。
其突出特点是:
允许模型的描述独立于求解算法,允许在规范化的标准模型中、在保证安全的条件下作少许变化,要求变量之间的代数关系表述明确。
本章用一个简单实例来说明GAMS系统在建立和求解优化模型中的用法,要熟练掌握GAMS的应用需要大量的建模实践,详细的GAMS语句说明请参考相关的用户说明书。
2.1GAMS系统简介
GAMS的设计融入了数学方程的设计思想和关系数据库理论,目的是满足战略建模者的需求。
数学方程设计提供了描述问题和多种求解问题的方法,而关系数据库理论为数据组织及其应对变化提供了一个框架结构。
因此具有数学模型基础和计算机程序设计基础将有利于对GAMS应用的理解。
2.1.1GAMS基本特性
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来说,xij≥0;
约束条件:
工厂i所能供应的该商品的量为ai,则对于所有的I来说,有关系式:
,
即所有市场的需求量不能超过工厂能供应的量。
所有的市场j对该商品的需求要满足关系式:
,
即所有工厂所能供应的量应该大于市场的需求。
目标函数:
这个简单的实例揭示了建立优化模型的某些重要步骤,而这些步骤与GAMS的设计保持一致。
只是在GAMS中,集合的索引用sets定义,已知数据用parameters描述,决策变量用variables表示,约束条件和目标函数用方程来声明和定义。
运输问题的GAMS表达式与上面列出的代数表达式很类似,其区别在于GAMS的表达方式可以被计算机编译并且执行。
在这个运输问题的实例中,假设有两个罐头加工厂和三个销售市场,已知的数据如下(这个实例选自Dantzig,1963)。
工厂
产地到市场的距离(1000英里)
供货量(箱)
纽约
芝加哥
托皮卡
西雅图
2.5
1.7
1.8
350
圣地亚哥
2.5
1.8
1.4
600
需求量(箱)
325
300
275
2.GAMS程序
假设运送距离以千英里为单位,运送成本是每箱每千英里90美元,这个问题的GAMS程序如下。
$TitleATransportationProblem
$Ontext
Thisproblemfindsaleastcostshippingschedulethatmeets
requirementsatmarketsandsuppliesatfactories.
References:
Dantzig,GB,LinearProgrammingandExtensions
PrincetonUniversityPress,Princeton,NewJersey,1963,Chapter3-3.
$Offtext
Sets
icanningplants/seattle,san-diego/
jmarkets/new-york,chicago,topeka/;
Parameters
a(i)capacityofplantiincases
/seattle350
san-diego600/
b(j)demandatmarketjincases
/new-york325
chicago300
topeka275/;
Tabled(i,j)distanceinthousandsofmiles
new-yorkchicagotopeka
seattle2.51.71.8
san-diego2.51.81.4;
Scalarffreightindollarspercaseperthousandmiles/90/;
Parameterc(i,j)transportcostinthousandsofdollarspercase;
c(i,j)=f*d(i,j)/1000;
Variables
x(i,j)shipmentquantitiesincases
ztotaltransportationcostsinthousandsofdollars;
PositiveVariablex;
Equations
costdefineobjectivefunction
supply(i)observesupplylimitatplanti
demand(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;
2.1.3GAMS运行结果与模型概述
1.运行结果
运输模型用上面的GAMS语句明确的表达并在GAMS环境下求解。
虽然在不同的计算机上调用GAMS可能会在一些细节上稍有不同,但是统一的格式是在文件名的后面加上后缀GMS。
模型在运行过程中会输出一系列的运行信息,包括模型名称,错误报告等。
当运行结束时,如果一切正常,GAMS会将最优的方案以下面的格式显示。
new-yorkchicagotopeka
seattle50.000300.000
san-diego275.000275.000
同时还会得到一个边际成本的列表输出。
chicagotopeka
seattle0.036
san-diego0.009
GAMS的运行结果说明最佳的选择是从西雅图到托皮卡不运送任何货物,如果坚持要运送的话,那么每送一箱货物就会在最优费用的基础上增加36美元。
同样的道理,如果从圣地亚哥向芝加哥送货的话,每送一箱货物就会在最优费用的基础上增加9美元。
2.GAMS模型概述
表2.1是参考上面的实例写出的GAMS模型的基本组成。
表2.1GAMS模型组成
输入
输出
索引
声明
索引元素赋值
程序列表
数据(常数、参数、表格)
声明
数据值
运行参考图
变量
声明
类型定义
边界和初值设定(可选择)
方程列表
方程
声明
定义
状态报告
模型和求解语句
结果输出
显示语句(可选择)
我们先对GAMS语句构造的模型给出一些概括的评述。
(1)GAMS模型是用GAMS语言进行描述的集合。
语句执行的次序按照顺序的规则。
(2)GAMS语句在编辑时可以是用户要求的任何形式,每条语句可以多行,并且每行都可以有多条语句。
(3)对于GAMS的初学者来说,应该用分号结束每一条语句,就像实例中那样。
GAMS编译时不分辨大小写,大小写字母可以随意使用。
(4)文档对于数学模型的有用性至关重要。
模型的解释文档被嵌入到模型中,而不是单独写入,这种表达方式更更有效和精确。
至少有两种办法可以使文档嵌入到模型中。
第一种,第一列以星号开始的任意一行都被GAMS编译器作为说明而不予执行;第二种可能更有效,文档被嵌入到特殊的GAMS语句中。
在运输模型中的所有说明文档都采用了第二种方式。
(5)从上面的输入成分的列表中可以看到,GAMS模型各部分的建立需要两个步骤:
声明和赋值(或定义)。
“声明”意味着声明一些事物的存在并给它们命名;“赋值”或“定义”给予特别的值或表达式。
在方程模块中,必须分别声明和定义每一个GAMS方程,而对于GAMS模型所有其它的部分,可以选择用统一的语句声明和定义,或者分别用不同的语句来声明和定义。
(6)为模型中的元素命名必须用字母开头,后面最多连接9个字母或数字。
2.2GAMS基本语句
2.2.1GAMS的赋值语句
1.集合与索引
集合与索引的定义是GAMS模型的一个基本模块,它与编程语言中集合与索引的表达方式非常类似。
上面提到的运输实例包含了一个设置集合与索引的语句:
set。
Sets
icanningplants/seattle,san-diego/
jmarkets/new-york,chicago,topeka/;
这个语句的结果是给程序中将要使用的集合的索引命名并赋值。
我们也可以用普通的数学表达式给这两个索引赋值:
i={Seattle,SanDiego}
j={NewYork,Chicago,Topeka}.
请注意其中的区别。
(1)GAMS程序中赋值使用的是斜杠“/”而不是大括号;
(2)有间隔的单词不能用作索引元素值,必须加连字符,如new-york。
Sets语句中的文本是可选择的,它只为模型的内部文档提供非正式的用途,GAMS编译器并不解释文本,只是为了随时显示。
也可以使用两个Sets语句完成上面的功能。
如:
Seticanningplants/seattle,san-diego/;
Setjmarkets/new-york,chicago,topeka/;
为索引元素赋值时可以使用星号,当元素是顺序排列时它提供了一种方便的表达方式。
例如,下面列出的Sets语句在GAMS中是有效的。
Setttimeperiods/1991*2000/;
Setmmachines/mach1*mach24/;
赋值效果等同于:
t={1991,1992,1993,.....,2000}
m={mach1,mach2,......,mach24},
注意到Sets语句被作为字符串存储,所以t元素不是数字。
还有一个使索引与先前定义过的索引同名的语句,如:
Alias(t,tp);
这里,tp与符号t的功能相同,这个语句表现了同一个集合中t元素的相互关系,这在模型中很有用。
2.数据输入
运输问题的GAMS模型表现了数据输入三种不同的基本格式,分别是列表、表格和直接赋值。
(1)用列表的方式输入数据
实例中的第一个参数语句用的是列表方式。
如:
Parameters
a(i)capacityofplantiincases
/seattle350
san-diego600/
b(j)demandatmarketjincases
/new-york325
chicago300
topeka275/;
这条语句有多个作用。
1它定义了两组参数,将它们命名为a和b,并且分别引入了它们的索引i和j;
2这个语句也给每组参数加上了说明文档;
3这个语句给两个集合中的每个元素a(i)和b(j)赋值;
4将这个语句按下面的规则分成两个语句是完全可以的。
Parametersa(i)capacityofplantiincases
/seattle350
san-diego600/;
Parametersb(j)demandatmarketjincases
/new-york325
chicago300
topeka275/;
(2)通过表格输入数据
建模人员有时会发现大型模型中很多数据来自于一些并不大的表格,因此用表格形式输入数据很有用。
运输模型提供的一个二维表如下。
Tabled(i,j)distanceinthousandsofmiles
new-yorkChicagotopeka
seattle2.51.71.8
san-diego2.51.81.4;
这个格式的作用就是标明集合参数d和对应于各索引i和j的参数值,如果表格中有空缺,可以认为是零。
使用表格输入参数时,GAMS将检查集合的维数和索引的值,也可以用表格形式输入多于二维的情况。
(3)通过赋值语句输入数据
参数还可以用直接赋值语句进行计算。
如运输模型就采用了与列表和表格输入不同的方式给参数赋值。
Parameterc(i,j)transportcostinthousandsofdollarspercase;
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.2GAMS的变量与方程
1.变量的定义与赋值
GAMS模型中的决策变量(或内生变量)必须用变量语句说明。
每个变量给一个名字,可以是集合变量,可以有文本说明。
运输模型中包含了以下变量语句。
Variables
x(i,j)shipmentquantitiesincases
ztotaltransportationcostsinthousandsofdollars;
这是一个对集合变量x(i,j)和标量z进行说明的语句,每个GAMS优化模型在求解时必须包含一个诸如此类的标量,使之为求目标的最小或最大值服务。
一旦变量被定义,每个变量必须指定一个类型。
表2.2给出了变量可能的类型和各种类型的取值范围。
表2.2变量类型和取值范围
变量类型
变量允许的取值范围
free(default)
-∞to+∞
positive
0to+∞
negative
-∞to0
binary
0or1
integer
0,1,....,100(default)
为目标最大化或最小化服务的变量一定是一个标量,也一定是一个free类型的变量。
在我们的运输模型中,z是默认为free类型的,但x(i,j)有非负的约束,由下面的语句给出。
Positivevariablex;
注意x的集合特性在类型设定中不再重复,每个索引所对应的集合元素值有相同的变量类型。
后面还要描述怎样设置变量的下界、上界和初始值。
2.方程式
像GAMS这样能够处理数学模型语言的系统的主要功能在于生成统一结构的等式和不等式。
一组等式或不等式具有相同的代数结构,组中所有的成员同时被构造出来。
(1)方程的声明
方程必须被单独的语句声明和定义,而这个声明的格式要符合GAMS语句的要求。
我们的运输模型包含下面的方程式声明语句。
Equations
costdefineobjectivefunction
supply(i)observesupplylimitatplanti
demand(j)satisfydemandatmarketj;
单词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))等价于
有时会用求和与求积函数给参数赋值并加以说明。
例如:
scalartotsupplytotalsupplyoverallplants;
totsupply=sum(i,b(i));
(3)方程式的定义
方程式的定义由于其复杂性,使得它是GAMS中最复杂的语句。
一个方程式的定义由以下各部分组成。
●方程式的名称
●索引名
●索引限制条件(可选)
●标记“..”
●左边表达式
●相关运算符
●右边表达式
运输实例中包含三个这样的语句。
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/代表那些具体的方程。
在我们的例子里,有一个模型语句:
modeltransport/all/;
这个语句看起来多余,但是这对可以在一个GAMS里建立几个模型的高级用户有用。
如果我们用选择的方程列表而不用/all/,则上面的语句就可以写成:
modeltransport/cost,supply,demand/;
当一个具体的模型只需要所定义的方程式列表中的一个子集时,可以采用选择列表的方式。
3.模型求解
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通用 数学 建模 系统 GAMS 基本知识