第2章通用数学建模系统(GAMS)基本知识

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第2章通用数学建模系统(GAMS)基本知识24第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章通用数学建模系统(GAMS)基本知识25[]表示括起来的部分是可选的。{}表示括起来的部分有可能被重复多次。|表示“或”操作,符号|两边的操作均有效。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来说,有关系式:jiijax,即所有市场的需求量不能超过工厂能供应的量。所有的市场j对该商品的需求要满足关系式:ijijbx,即所有工厂所能供应的量应该大于市场的需求。目标函数:ijijijKxc)($这个简单的实例揭示了建立优化模型的某些重要步骤,而这些步骤与GAMS的设计保持一致。只是在GAMS中,集合的索引用sets定义,已知数据用parameters描述,决策变量用variables表示,约束条件和目标函数用方程来声明和定义。运输问题的GAMS表达式与上面列出的代数表达式很类似,其区别在于GAMS的表第2章通用数学建模系统(GAMS)基本知识26达方式可以被计算机编译并且执行。在这个运输问题的实例中,假设有两个罐头加工厂和三个销售市场,已知的数据如下(这个实例选自Dantzig,1963)。工厂产地到市场的距离(1000英里)供货量(箱)纽约芝加哥托皮卡西雅图2.51.71.8350圣地亚哥2.51.81.4600需求量(箱)3253002752.GAMS程序假设运送距离以千英里为单位,运送成本是每箱每千英里90美元,这个问题的GAMS程序如下。$TitleATransportationProblem$OntextThisproblemfindsaleastcostshippingschedulethatmeetsrequirementsatmarketsandsuppliesatfactories.References:Dantzig,GB,LinearProgrammingandExtensionsPrincetonUniversityPress,Princeton,NewJersey,1963,Chapter3-3.$OfftextSetsicanningplants/seattle,san-diego/jmarkets/new-york,chicago,topeka/;Parametersa(i)capacityofplantiincases/seattle350san-diego600/b(j)demandatmarketjincases/new-york325chicago300第2章通用数学建模系统(GAMS)基本知识27topeka275/;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;2.1.3GAMS运行结果与模型概述1.运行结果运输模型用上面的GAMS语句明确的表达并在GAMS环境下求解。虽然在不同的计算机上调用GAMS可能会在一些细节上稍有不同,但是统一的格式是在文件名的后面加上后缀GMS。模型在运行过程中会输出一系列的运行信息,包括模型名称,错误报告等。当运行结束时,如果一切正常,GAMS会将最优的方案以下面的格式显示。第2章通用数学建模系统(GAMS)基本知识28new-yorkchicagotopekaseattle50.000300.000san-diego275.000275.000同时还会得到一个边际成本的列表输出。chicagotopekaseattle0.036san-diego0.009GAMS的运行结果说明最佳的选择是从西雅图到托皮卡不运送任何货物,如果坚持要运送的话,那么每送一箱货物就会在最优费用的基础上增加36美元。同样的道理,如果从圣地亚哥向芝加哥送货的话,每送一箱货物就会在最优费用的基础上增加9美元。2.GAMS模型概述表2.1是参考上面的实例写出的GAMS模型的基本组成。表2.1GAMS模型组成输入输出索引声明索引元素赋值程序列表数据(常数、参数、表格)声明数据值运行参考图变量声明类型定义边界和初值设定(可选择)方程列表方程声明定义状态报告模型和求解语句结果输出显示语句(可选择)我们先对GAMS语句构造的模型给出一些概括的评述。(1)GAMS模型是用GAMS语言进行描述的集合。语句执行的次序按照顺序的规则。(2)GAMS语句在编辑时可以是用户要求的任何形式,每条语句可以多行,并且每行都可以有多条语句。(3)对于GAMS的初学者来说,应该用分号结束每一条语句,就像实例中那样。GAMS编译时不分辨大小写,大小写字母可以随意使用。(4)文档对于数学模型的有用性至关重要。模型的解释文档被嵌入到模型中,而第2章通用数学建模系统(GAMS)基本知识29不是单独写入,这种表达方式更更有效和精确。至少有两种办法可以使文档嵌入到模型中。第一种,第一列以星号开始的任意一行都被GAMS编译器作为说明而不予执行;第二种可能更有效,文档被嵌入到特殊的GAMS语句中。在运输模型中的所有说明文档都采用了第二种方式。(5)从上面的输入成分的列表中可以看到,GAMS模型各部分的建立需要两个步骤:声明和赋值(或定义)。“声明”意味着声明一些事物的存在并给它们命名;“赋值”或“定义”给予特别的值或表达式。在方程模块中,必须分别声明和定义每一个GAMS方程,而对于GAMS模型所有其它的部分,可以选择用统一的语句声明和定义,或者分别用不同的语句来声明和定义。(6)为模型中的元素命名必须用字母开头,后面最多连接9个字母或数字。2.2GAMS基本语句2.2.1GAMS的赋值语句1.集合与索引集合与索引的定义是GAMS模型的一个基本模块,它与编程语言中集合与索引的表达方式非常类似。上面提到的运输实例包含了一个设置集合与索引的语句:set。Setsicanningplants/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/;第2章通用数学建模系统(GAMS)基本知识30Setmmachines/mach1*mach24/;赋值效果等同于:t={1991,1992,

1 / 32
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功