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

发布时间 : 星期四 文章第2章通用数学建模系统(GAMS)基本知识更新完毕开始阅读

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

present(j) = future(j)*exp(-interest*time(j));

2.2.2 GAMS的变量与方程 1.变量的定义与赋值

GAMS模型中的决策变量(或内生变量)必须用变量语句说明。每个变量给一个名字,可以是集合变量,可以有文本说明。运输模型中包含了以下变量语句。

Variables

x(i,j) shipment quantities in cases

z total transportation costs in thousands of dollars ;

这是一个对集合变量x(i,j)和标量z进行说明的语句,每个GAMS优化模型在求解时必须包含一个诸如此类的标量,使之为求目标的最小或最大值服务。

一旦变量被定义,每个变量必须指定一个类型。表2.2给出了变量可能的类型和各种类型的取值范围。 表2.2 变量类型和取值范围 变量类型 free(default) positive negative binary integer 变量允许的取值范围 -??to +? 0 to +? -??to 0 0 or 1 0,1,...., 100 (default) 为目标最大化或最小化服务的变量一定是一个标量,也一定是一个free类型的变量。在我们的运输模型中,z是默认为free类型的,但x(i,j)有非负的约束,由下面的语句给出。

Positive variable x ;

注意x的集合特性在类型设定中不再重复,每个索引所对应的集合元素值有相同的变量类型。后面还要描述怎样设置变量的下界、上界和初始值。 2.方程式

像GAMS这样能够处理数学模型语言的系统的主要功能在于生成统一结构的等式和不等式。一组等式或不等式具有相同的代数结构,组中所有的成员同时被构造出来。 (1) 方程的声明

方程必须被单独的语句声明和定义,而这个声明的格式要符合GAMS语句的要求。

32

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

我们的运输模型包含下面的方程式声明语句。

Equations

cost define objective function

supply(i) observe supply limit at plant i demand(j) satisfy demand at market j ;

单词Equations在GAMS中用途很广,它包含等式和不等式关系。一个具有单独名称

的GAMS登是可以指得是一种或多种关系。例如,cost是标量,所以它是单个等式;但supply是集合变量,它定义了随索引i 变化的一个不等式集合。

(2) GAMS求和(求积)方式

GAMS不使用标准的数学符号求和,它采用求和函数。举一个简单的例子,运输模型

中包含下面的表达式:

Sum(j, x(i,j)) 此式等价于

?xji,j

下面是一个稍微复杂一点的求和表达式:

Sum((i,j), c(i,j)*x(i,j))

计算结果等价于

??ciji,j?xi,j

这个表达式也可以写成如下的嵌套求和的形式: Sum(i, Sum(j, c(i,j)*x(i,j)))

GAMS中求积的定义与求和的定义几乎一样,只要用prod 代替sum就行。例如: prod(j, x(i, j)) 等价于

?xji,j

有时会用求和与求积函数给参数赋值并加以说明。例如:

scalar totsupply total supply over all plants;

totsupply = sum(i, b(i));

(3) 方程式的定义

方程式的定义由于其复杂性,使得它是GAMS中最复杂的语句。一个方程式的定义由以下各部分组成。 ? 方程式的名称

33

第2章 通用数学建模系统(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/代表那些具体的方程。在我们的例子里,有一个模型语句:

model transport /all/ ;

这个语句看起来多余,但是这对可以在一个GAMS里建立几个模型的高级用户有用。如果我们用选择的方程列表而不用/all/,则上面的语句就可以写成:

model transport / cost, supply, demand / ;

当一个具体的模型只需要所定义的方程式列表中的一个子集时,可以采用选择列表的方

34

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

式。

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 结果输出 1.GAMS的输出

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会自动将这个输出要求转化为有适当标题的表格。

35

联系合同范文客服:xxxxx#qq.com(#替换为@)