|
GAMS示例
% u; V7 g4 R# i7 L! f, @/ A! Y下面这个问题主要是用来举例说明GAMS是如何让您以一种自然的方式建立模型.GAMS能够处理大的多和高度复杂的问题.在这里只展示了GAMS的很少一部分的基本特征. / c" u M' @' G3 l# X/ X2 O
. m/ |9 F# i6 C3 F' K# Z2 _
) R8 F" K# I( j: P, P, O1 w1 J6 q, T
3 [) o; }% l5 |/ J. l| | * Y% G- Q+ Z+ O- H) s9 Q% g
代数描述 | ! F7 G; w) N+ |5 ]) G$ d0 @0 ^
下面是问题的标准的代数描述,这是用来最小化把货物从2个工厂运输到3个市场的费用.受约束于供需约束. ! O; M# y) P+ R5 n
指标: & y$ L6 ?2 k! G3 \% G1 p/ E" `
i=工厂(plants) j=市场(markets) 6 `0 V& o" s+ l: V% t
给定的数据: : V, V! g S! `% [; @: `
=在工厂i日常供应量(批数cases)
=在市场j的日常需求量(批数cases)
=在工厂i和市场j之间的距离(千英里)
=在工厂i和市场j之间每单位的运输费用($/批/千英里) ( y% V9 ]3 x6 d3 G7 D. Q
. y' i" w& _$ ~$ D6 p O
4 F3 _- z$ W8 U% s4 p0 t0 d5 e
0 t# D3 |2 A8 w6 Q' F( W| 距离 | , ] s0 d' m% X9 X
| $ a5 Q' O2 o1 p% o$ A6 n
* \4 h& J( K+ z7 x: c) k| | 9 M6 ~/ E; k1 T: l% p+ ]
市场 | 0 x5 ?1 {: b* q( a/ o
| 0 k# R; M1 o) a8 t% p" T
/ _+ u2 V% W7 P! G
| 工厂 |
' @1 Y6 [5 e1 ]4 DNew York |
2 N7 R! ]6 w" g: RChicago | 6 t9 P- o2 O0 d) G" a) E$ V+ g
Topeka |
# B! _: T, D1 G# s供应量 | $ d3 H% m* V, L( S* j1 o/ K# k* d7 \
1 q7 l7 L' L- ~' I% \2 K| Seattle |
+ H6 ]0 L# `3 c0 R" Y/ p1 X2.5 |
- Q, b- o' S, ~& h0 g1.7 | ! F. A4 d1 \0 |/ G% G+ o. U
1.8 | 9 l9 r& J- \8 H- _* {
350 |
5 Z5 h. k- B, w' _7 b
& N3 L- g6 q' ^: h* _( x| San Diego | * z0 ], v& v/ ]2 H7 u" J8 Z8 u
2.5 |
2 z5 P4 \. S% b8 R- S0 ^/ [* R+ A1.8 |
3 ? v( ]0 J0 t7 s1.4 |
8 }5 R; Z3 C: n& V7 A; e600 |
6 d0 Z- Y7 U. \2 P9 O$ d$ N9 C8 G# {) O4 M& j8 O# D
| 需求量 | ! S5 f2 C9 D: F$ M3 A: _/ f
325 |
% G' Z o$ w4 W+ J/ v; q300 |
: W7 O8 Y( _2 }* s3 s% X! O& v! q275 | * p3 r: z5 w# V" p
| . t6 I' T+ K3 s1 Z' y L C7 l: v1 {
F=每批每千英里的费用$
* P( C. \/ }; l5 W决策变量:
3 R4 i) A/ j9 J" K2 U' m. f =日常从工厂i运输到市场j的总量(批数cases) 这里 适用所有i,j 3 K' X) P& M+ D% K4 m B
约束:
7 Y4 _! ^. w R* e$ q8 M在工厂i的供应量**(批数cases): 适用所有的i 在市场j的需求量: 适用所有的j
! e. |* ?9 N4 o! g) r目标函数:
; s( i7 K" u* o( ]# gMinimize (千元)
) K: F2 S, g9 u1 ^$ K1 X# r3 E
1 Y' ?( Q# O) Z6 P+ ~# [! w, j* b" ~- G
% n. d* y5 {9 z) Z9 j( |, _) w| | ) `: d0 t' G2 g# i! t0 R) c
GAMS模型 |
. H) U( z6 l' L* f/ U% U同样的模型在GAMS中建模.简练的代数描述使得模型高度紧凑,并带有逻辑结构.内部的文档,比如对参数的解释和测量的单位,使得模型很容易读懂.
& H; ]5 Q* a* D, c
集合(Sets)
! ~$ X% Z* l" Q _9 g' b / ]. S8 g. d8 d! i0 N1 f
GAMS让您以直接的方式指定指标:声明和命名集合(这里是I和J),并列举它们的元素.
. k, t; m! A5 g$ _" |0 y: h参数 . T2 i! J- t. [

% ]! g( t3 M K这里的数据输入被作为指标参数A(I)和B(J),值简单的被列出.
5 t3 N0 P9 v- H" o9 sGAMS让您可以在模型的任意位置放置解释性文本(以小写格式显示),当您在开发它时.您的注释自动被结合到输出报告中的合适位置.
; B. n( |; h. u+ l8 G表格 7 {8 N8 V f2 w- w' @8 \9 e* u3 Q
 数据同样能够以方便的表格形式输入.GAMS让您以数据的基本形式来输入数据-转换是特定的代数化的.
1 w2 C- s- H5 I% L/ c* X6 E标量(Scalar) $ U; f+ g1 q' [: e" J
 常量能够被声明为标量,它的值是指定的. 3 ^0 ~6 ^& ^. j9 Z
数据处理
+ q6 x7 C2 A0 v" _1 T2 I & c, L y8 O, @8 V, v' V3 {
当数据值要被计算前,您首先要声明参数(比如,给它一个符号,随意给它编个指标),然后给它一个代数公式.GAMS将自动进行计算.
7 D2 N) T: M, x变量
$ e! l9 W: A3 V : D8 t7 `; `7 d& A* ~
决策变量以代数的方式表达,带有特定的指标.从这种常见的形式,GAMS在域中生成变量的每个实例.
0 v' U( Q* o9 m% t7 \7 d变量可以被指定为下列类型:任意(FREE),正值(POSITIVE),负值(NEGATIVE),二元(BINARY),或者整数(INTEGER).默认是任意(FREE). $ T2 h# u9 q$ v
目标变量(这里是z)仅被声明,没有指标(index). * Y) F) M \8 P* U
方程式 : v7 f: v9 n% D8 Q) P
 / B1 p9 B, `/ D3 e. y
目标函数和约束方程式首先被通过指定名字来声明.然后它们的概括的算术公式被声明.GAMS现在已经有了足够的信息(从上面的数据输入和从在方程式中指定的算术关系)来自动生成每个单独的约束声明-就像您能在下面的输出报告中看到的.
1 v: I$ T+ T s2 z& a/ r% v4 z& v=E=表示'equal to' (等于) =L=表示 'less than or equal to' (小于或等于) =G=表示'greater than or equal to' (大于或等于)
0 g; m/ P! D5 Y0 _( T% |模型声明
* K) l6 k. M$ s: B% f( c
; |7 T! r' C. A# K3 Z. ?模型被指定了一个唯一的名字(这里是TRANSPORT),模型缔造者指定那个方程式应该被包含到这个特别的公式中.在这里我们指定了ALL,也就是说所有的方程式都是模型的一部分.就等于是MODEL TRANSPORT /COST, SUPPLY, DEMAND/ . 这个方程式选择使您能够在单个的GAMS输入文件中以公式表达不同的模型,基于相同或不同的给定数据.
v4 m" T a& h" M2 Q* o. M' X求解声明
2 J- _8 f$ b" e' Z* ?
3 c. L: ]+ [# s. ]3 g( R: N9 l求解声明(1)告诉GAMS那个模型要被求解,(2)选择要使用的求解器(在这里是LP求解器),(3)表明优化方向,或者是求最小值,或者是求最大值.(4)指定目标变量. ; S# A% C$ X9 C+ ?7 q3 J
- O1 Q6 @. a4 n$ X' b* X# Y
0 v8 O3 [+ K% ~) @) ~- _5 {7 F' K$ u: U
| |
# p9 z# D* I* D GAMS输出报告(部分摘录) | / X" K/ O% n" m! A* ^, `, s
完整的GAMS输出报告比下面列出的部分摘录详细的多,包含了更多的帮助用于解释和诊断您的模型.甚至您能够修改输出格式来符合您的特定的需要.
! T, W- g" z2 Q6 r: @# n方程式列表
) u7 @1 _4 w0 E+ E
/ [& s5 Z5 Y. d+ M方程式列表显示从在GAMS输入中指定的分区(block)生成的单独的约束.在GAMS中使用者可以以一种非常紧凑的形式写下被索引的方程式分区(block),这将产生大量的单个方程式.在我们的示例中,我们指定了3个方程式分区,生成了6个单独的方程式. " e0 H0 _, r+ W# n% C
列列表 , B0 S/ n/ ~5 a3 j" D

6 g: R3 y' l2 ]7 f列列表提供信息到生成的单独的变量上.变量X(I,J)扩展出6个单独的变量.当许多变量从一个分区中被生成,默认的列表只显示最初的3个(用户可以修改).
* i* J7 _1 [0 g! O: U
5 l; g& r/ u5 l9 B
9 X+ T7 F4 \9 ?) J- T
]6 C% ?& C$ G% P| | 2 {+ t# o3 y% w1 ^
求解信息 |
+ {3 ~% D6 _( i
# Y9 L! j/ _. u求解声明将生成模型(单个方程式和对应到特定模型的变量的产物).首先一些关于生成的模型的统计表将会被显示:方程式数,变量和非零元素. 9 v8 Q4 i3 c. `8 k2 L2 ?
在求解汇总信息部分,我们看到BDMLP被调用来求解这个模型.BDMLP经过4次反复,耗时0.18秒找到了这个问题的最优解.求解信息下列的消息来自求解器. # G+ @, F/ x! ^0 N" M
解(Solution) " g6 b9 E/ \( `6 R3 F/ m
 ) N$ x3 f1 D( T
解被显示在这里.边际值(marginals)对应方程式的重复和变量减少的花费.
( W; p* c2 n+ h% j+ z8 m写工具不需要学习一门其它的语言.在GAMS所有的数据处理,模型定义和报告编写都是在一个单独的环境中完成的.
% u$ M8 ]0 X, [# \: ]5 B5 ?$ h7 O# x9 q: f
1 f7 S$ ], P, k* E* u, ?/ d/ Y' \! d
' s* N1 Z" [$ Z| |
# n5 g6 ?# d, M ^" n* R 参考 | - r+ Q8 K9 a4 ^. e
Dantzig G. B., Linear Programming and Extensions, Princeton University Press,Princeton, New Jersey, 1963, Chapter 3-3. |