例子程序:

           SETS
        canning plants   / SEATTLE, SAN-DIEGO /
        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
            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 ..        =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 ;

Sets 是GAMS模型的基本组成部分,如同数学公式的下标

   Sets 

       i canning plants /seattle, san-diego/

       j markets /new-york, chicago, topeka /;

声明两个指数下标,起名为i,j并且赋值

       i = {seattle, san-diego}

       j = {new-york, chicago, topeka};

列举指数时为什么不用"{}",而用"//",因为有的计算机键盘没有大括号

new york 表示成new-york,

将i,j的表述合并并不是必要的,也可以这样。

Set i canning plants / seattle, san-diego / ;
Set j markets          / new-york, chicago, topeka / ;

单数,复数Set,Sets一样。

Set t time periods /1991*2000/ 等价于 t = {1991,1992,...,2000}

Set m machines  /mach1*mach24/ 等价于 m = {mach1, mach2,...,mach24}

GAMS 三种基本数据输入格式

列表数据输入

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/;

声明了两个参量的存在,取名为a,b并且给出了指数下标i,j,同时给出了每个参量的说明文档,并且对于每个i,j赋予了值。。

也可以这样写:

     Parameters a(i) capacity of plant i in cases
         / seattle 350
           san-diego 600 / ;
    Parameters b(j) demand at market j in cases
        / new-york 325
           chicago 300
         topeka 275 / ;

规定:每个列表必须用//包括起来,而且每个元素和他对应的值必须用逗号隔开,或者写在不同的行

标量是没有域的参量,Scalar f freight in dollars per case thousand miles /90/;

表格数据据输入

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

直接赋值输入,通过不同的表述将声明过程和赋值过程分开

Parameter c(i,j) transport cost in thousands of dolllars per case;

          c(i,j) = f * d(i,j) /1000;

注意第一行的分号不能少。

给某个特定的c(i,j)赋值,可以写上相应域元素的名字并用括号括起来。

 c('seattle','new-york') = 0.40

变量

在GAMS模型中的决策变量(内生变量)必须用Varibales表述予以声明,每个变量都会有一个名字,合适的话就有一个域,还有说明文档(不是必须的)。

Variables

    x(i,j) shipment quantities in cases

         total transportation costs in thousands of dollars

z是优化目标

变量一旦被声明,就必须赋予一个类型,默认free自由类型

                       free(default) (-∞,+∞)

                       positive       (0, +∞)

                       negative       (-∞,0)

                       binary         0 or 1

                       integer        0,1,2,...100(default)

作为最大化或最小化的目标变量必须是 free类型

  但x(i,j)可以表示成非负值

Positive variable x;

注意,x的指数域不要在类型的表述中出现,域中所有条目有相同的类型。

方程式声明

  Equations

      cost define objective function

      supply(i)    observer supply limit at plant i

      demand(j)    satisfy demand at market j;

GAMS 里面的求和符号和数学中的用法一样

Sum(index of summation,summand)用一个逗号分隔两个自变量。

Sum(j,x(i,j))

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

连乘符号用prod代替sum

 

方程式定义:

被定义的方程式名字  指数域 [指数域约束条件] .. 左边表达式   关系运算符 右边表达式

  cost                                      ..            =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);

注意:

1.关系运算符有三种 =l=小于  =e=等于  =g=大于

2.指数域对用单个GAMS表述联立方程组进行控制。约束denand的定义产生了对域j的每个元素的约束

GAMS输出显示为: 
DEMAND(new-york).. X(seattle,new-york) + X(san-diego,new-york) =G=325 ;
DEMAND(chicago)..  X(seattle,chicago) + X(san-diego,chicago)   =G=300 ;
DEMAND(topeka)..   X(seattle,topeka) + X(san-diego,topeka)     =G=275 ;

模型和运算表述 
单词 model 在 GAMS中有很明确的意思。它是指一系列方程式。就像其他 GAMS组成部分一样,在声明过程中我们
要给它一个名字。对模型进行声明的格式是在关键字 model 后面输入模型的名字,随后在斜杠中输入该模型所包含
的方程式的名字。如果模型包含之前所有定义的方程式,你可以输入/all/来代替它们名字的详细列表,表述如下: 
 
model transport /all/ ;
 
这个表述看起来是多余的,但是对于在同一个 GAMS文件中可能建立多个模型的高级用户来说是有用。如果我们要
用详细列表,上述表述替换为: 
 
model transport / cost, supply, demand / ;
 
因为指数域不是方程式的名字,在这里它们被省略了。当且仅当现存方程式的子域包含有一个正在建立的模型(或
者说是子模型)时,列表才会被使用。

一旦一个模型被声明和赋予了方程式,就做好了运算的准备了。这时我们会用到 solve 表述: 
 
solve transport using lp minimizing z ;
 
如下为 solve 表述的格式: 
1.  关键字 solve 
2.  要计算的模型的名字 
3.  关键字 using 
4.  选择一个可用的运算程序。所有可用的程序列表如下: 
lp      线性规划 

qcp    二次约束规划 
nlp    非线性规划 
dnlp   具有非连续倒数的非线性规划 
mip   混合整数规划 
rmip   宽松混合整数规划 
miqcp   具有二次约束的混合整数规划 
minlp   混合整数非线性规划 
rmiqcp  具有二次约束的宽松混合整数规划 
rminlp   宽松的很合整数非线性规划 
mcp    混合互补问题 
mpec   具有平衡约束的数学规划 
cns     约束非线性系统 
5.  关键字“minimizing”或者“maximizing” 
6.  被优化的变量名字 

2.10  “.lo,.l,.up,.m”数据库 
GAMS被设计带有一个小的数据库系统,它用于维护关于变量和方程式的记录。记录中最为重要的领域是: 
.lo      下边界 
.l       当前值或者初始值 
.up     上边界 
.m      边界值或者双重变量 
引用这些相关量的格式是,变量或者方程式的名字,随后是领域名, (如果需要的话)再是指数域(或者指数域中
的元素) 。 
GAMS 允许用户完成读取和写入数据库。现在这些或许对你没有什么用,但是对于高级用户而言这是一个相当有价
值的特点。以下举一些使用数据库的例子。 
2.10.1  赋值变量边界值和初始值 
变量的下边界和上边界根据变量的类型(free,positive,negative,binary,integer)而自动的设定,但是用户可以
重新设定这些边界。下面是一些例子: 
 
x.up(i,j) = capacity(i,j) ;
x.lo(i,j) = 10.0 ;
x.up('seattle','new-york') = 1.2*capacity(seattle','new-york') ;

第一个和第三个例子中假定 capacity (i, j) 这个参量已经被声明和赋值过了。 这些表述必须在声明变量之后, 在 solve
表述之前。右手边可以使用所有赋值过程中可用的数学表达。 
在非线性规划问题中,建模过程要尽可能的缩小上下边界之间的差值,这对于运算过程很重要,而为搜寻最优化值
的运算指出一个初始值也很重要。例如,在一个带有约束的库存模型中,变量是 quantity(i) ,而且已知非约束情
况下的最优化值是 eoq(i) 。作为对约束情况的猜测,我们输入: 
 
quantity.l(i) = 0.5*eoq(i) ;
 
(一般情况下默认的初始值被设为 0,除非 0 不在边界范围内,而在这种情况下,它取最接近 0 的边界值) 
注意,.lo 和.up 值完全由用户控制。相比之下,虽然.l 和.m 也要用户赋予初始值,但是它们由算法控制。  

posted on 2012-03-10 19:55  风生水起  阅读(10353)  评论(1编辑  收藏  举报