GAMS 基礎語法


例子程序:

           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 也要用戶賦予初始值,但是它們由算法控制。  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM