|
GAMS示例 + ^& x7 H' |3 j; ~, Q
下面这个问题主要是用来举例说明GAMS是如何让您以一种自然的方式建立模型.GAMS能够处理大的多和高度复杂的问题.在这里只展示了GAMS的很少一部分的基本特征. O+ g' F) [) f2 _; q3 c/ n2 u, J
9 T9 T; _' Z- f. R( y c
' R$ C, k- L$ d. ?) x5 t
2 F9 P: d( A( @& O/ w| | 1 V0 N. J3 {/ R# A& I
代数描述 |
8 J- l2 O/ N4 B4 ~' Y) n. W下面是问题的标准的代数描述,这是用来最小化把货物从2个工厂运输到3个市场的费用.受约束于供需约束.
7 x$ a3 p8 L4 v# b2 x指标: 6 `0 c( I7 e# ?# O7 U) d
i=工厂(plants) j=市场(markets) - ^' A7 n- _ d
给定的数据:
9 L& M+ R& \2 _7 V7 G* ~ =在工厂i日常供应量(批数cases)
=在市场j的日常需求量(批数cases)
=在工厂i和市场j之间的距离(千英里)
=在工厂i和市场j之间每单位的运输费用($/批/千英里) " b1 E9 U" _- ]& P0 l. O4 {
8 J% `. `" @3 S3 Z
! o9 J! t4 p& v1 A7 \; {/ c+ _7 w- _6 R6 j
| 距离 |
. U/ z% u# A% T | ! B. A; h/ ^8 ~# o3 [* N
6 ~6 Y0 L" k" \# \
| |
* L& \6 u' J: B" d' q市场 | 2 W+ z: q0 N* K% _* l; t
|
2 Q2 m3 R3 e' d4 Q6 |/ p, r) T6 G& }
9 i$ H) @% R* K7 O| 工厂 | ; \& W8 ?! z- N% n5 B$ N6 O. S
New York |
' b# @7 S2 M" |$ e/ M8 Q: d: JChicago | - @6 ]' Y. b3 q/ p5 W
Topeka | : r: j; k! E- p( R# r& {
供应量 |
; S0 \/ V# m& K& G2 w/ l4 t& v7 J. |$ L" @
| Seattle | 5 u- q& o* p9 U" O3 Q4 M
2.5 | % h" x8 O- x6 A- M [
1.7 | , G) A( `2 \5 p4 i# ~; T7 e) L
1.8 |
' k3 _" R2 g& D' p% G' t350 |
0 n5 Q {+ O4 L$ ]/ w9 d" k! j
0 V6 T1 i7 ~$ Y! Y# ~| San Diego | 3 |. @' O/ K/ ~2 S
2.5 | 8 j) [" X3 A! P$ C
1.8 |
! X) d4 H% \8 i) ~; V9 w9 c1.4 |
; g, N) q8 I2 U" B+ T) j- g2 Q4 @600 | ! N" S! L/ T" A9 M
, k3 L" d, f# w9 u2 S: j| 需求量 | $ X% b& m7 O! L. J! x; M0 A5 V
325 | 3 E2 b7 w: r6 p" Z$ I
300 |
) M) G& K$ |5 C1 W275 | ( k5 l- O$ B3 j: |( Q9 h
| 1 A# r D8 `1 z, s( Y, j
F=每批每千英里的费用$ / s8 w5 P7 i& U
决策变量: 4 N6 r2 G$ j. h! b* m# ], d
=日常从工厂i运输到市场j的总量(批数cases) 这里 适用所有i,j / y% E8 G; F" t3 c7 o2 O
约束: 9 Z. b6 `1 p( U7 C! {
在工厂i的供应量**(批数cases): 适用所有的i 在市场j的需求量: 适用所有的j ) i# ?8 |4 L, ^/ Q
目标函数: 7 n& W# p$ a: r
Minimize (千元) ~ h1 @1 M9 ?5 r* `
' G) n& e, D1 ^& ]0 n# o
0 R8 A* T3 ^' A7 }+ f$ y+ P- |4 t h$ \" H- A% e# @1 I
| |
) W' E0 B, M# k( G( S, S GAMS模型 |
8 u2 ?! T' g: J; Q9 q同样的模型在GAMS中建模.简练的代数描述使得模型高度紧凑,并带有逻辑结构.内部的文档,比如对参数的解释和测量的单位,使得模型很容易读懂.
1 j p) I' \: `& c3 m4 f, d
集合(Sets)
. K% G% N; ?# A4 v' o& F% w7 M $ k) E6 |9 Y' K) B, Y6 o9 O2 @. w# V5 k
GAMS让您以直接的方式指定指标:声明和命名集合(这里是I和J),并列举它们的元素.
) T6 a- l* u' D; [. o" g' ]9 b参数 / n! X( R( e( w+ p+ _: x% I+ _! a

: e% G' i7 Y1 y+ ?, j这里的数据输入被作为指标参数A(I)和B(J),值简单的被列出.
( F1 j7 M- Y) BGAMS让您可以在模型的任意位置放置解释性文本(以小写格式显示),当您在开发它时.您的注释自动被结合到输出报告中的合适位置.
+ v8 e/ [! c9 S- M表格
n, N* }: ?0 L0 k& |# S- j 数据同样能够以方便的表格形式输入.GAMS让您以数据的基本形式来输入数据-转换是特定的代数化的. ; i. o' W' c: i
标量(Scalar) , K5 X! R9 R$ Z% q, T' V6 @2 z" B
 常量能够被声明为标量,它的值是指定的. 9 Z, B* S; I, i0 W$ N7 g" y
数据处理
2 w: m/ K* L# V" T3 O/ A% @
1 x& R! K6 W8 b& I8 P( ^当数据值要被计算前,您首先要声明参数(比如,给它一个符号,随意给它编个指标),然后给它一个代数公式.GAMS将自动进行计算. 2 ?3 s6 P) u: u+ ]; |
变量 5 ]1 Z: X/ y* s" u8 r

! W& ?7 n U+ a4 }% ~决策变量以代数的方式表达,带有特定的指标.从这种常见的形式,GAMS在域中生成变量的每个实例.
( _& p4 |* N+ I, u# S% \: t6 W) e. {变量可以被指定为下列类型:任意(FREE),正值(POSITIVE),负值(NEGATIVE),二元(BINARY),或者整数(INTEGER).默认是任意(FREE).
1 {( H) w. a0 K1 d目标变量(这里是z)仅被声明,没有指标(index). ; s' j6 ` k% {, s
方程式
1 f5 {# \0 R' X& W
7 d+ b0 X/ i9 ?! |$ I9 s- j目标函数和约束方程式首先被通过指定名字来声明.然后它们的概括的算术公式被声明.GAMS现在已经有了足够的信息(从上面的数据输入和从在方程式中指定的算术关系)来自动生成每个单独的约束声明-就像您能在下面的输出报告中看到的.
# r3 n3 Z9 u6 q" b: N% i=E=表示'equal to' (等于) =L=表示 'less than or equal to' (小于或等于) =G=表示'greater than or equal to' (大于或等于)
% U; P/ `0 }: B: U/ h模型声明
3 [' x: P3 G# A. T
1 A! Q( [8 z- Q! q5 S$ a模型被指定了一个唯一的名字(这里是TRANSPORT),模型缔造者指定那个方程式应该被包含到这个特别的公式中.在这里我们指定了ALL,也就是说所有的方程式都是模型的一部分.就等于是MODEL TRANSPORT /COST, SUPPLY, DEMAND/ . 这个方程式选择使您能够在单个的GAMS输入文件中以公式表达不同的模型,基于相同或不同的给定数据. - g5 i7 B+ F) m
求解声明
; K3 A! a" t. T, {- v/ x3 k 0 ~+ M" P- I5 ?* j! [
求解声明(1)告诉GAMS那个模型要被求解,(2)选择要使用的求解器(在这里是LP求解器),(3)表明优化方向,或者是求最小值,或者是求最大值.(4)指定目标变量.
4 z* x _ o# ?4 Y# ^
. U" R& |( n. r4 e B: B% L9 x4 n% k! b
. i3 I* M$ t! Z7 q! ]3 d9 ?
| |
) l1 `# |2 u* I GAMS输出报告(部分摘录) |
L! o: Z! W! _; S完整的GAMS输出报告比下面列出的部分摘录详细的多,包含了更多的帮助用于解释和诊断您的模型.甚至您能够修改输出格式来符合您的特定的需要. $ w4 T2 g: V# M
方程式列表
1 g# U1 C3 y k {( D
5 a% l# O7 ]4 p* {/ ^方程式列表显示从在GAMS输入中指定的分区(block)生成的单独的约束.在GAMS中使用者可以以一种非常紧凑的形式写下被索引的方程式分区(block),这将产生大量的单个方程式.在我们的示例中,我们指定了3个方程式分区,生成了6个单独的方程式.
H3 m# {' C9 j6 u5 F. r列列表
: [6 n9 p- W9 e5 |# L; n
2 m. |! g8 }1 \列列表提供信息到生成的单独的变量上.变量X(I,J)扩展出6个单独的变量.当许多变量从一个分区中被生成,默认的列表只显示最初的3个(用户可以修改). " M) x R" R8 i1 T8 X4 ~
0 ~' ~% `. K! Y O) i/ g" m9 q. J, x3 _/ i
2 d! c& [* O& F7 _: `
| |
( Z0 P' Q2 g9 _& e4 J 求解信息 | 9 r" M9 _2 ^6 b' ?

1 F" Z) e0 m) S求解声明将生成模型(单个方程式和对应到特定模型的变量的产物).首先一些关于生成的模型的统计表将会被显示:方程式数,变量和非零元素. " u6 n e- |/ P; J
在求解汇总信息部分,我们看到BDMLP被调用来求解这个模型.BDMLP经过4次反复,耗时0.18秒找到了这个问题的最优解.求解信息下列的消息来自求解器.
* L2 Q/ r+ U' a解(Solution) $ a+ J/ K7 o- C) K0 ]

( i4 h( ~$ E, E# O8 J; y8 Y/ i解被显示在这里.边际值(marginals)对应方程式的重复和变量减少的花费.
* E5 q' ` T. n& j写工具不需要学习一门其它的语言.在GAMS所有的数据处理,模型定义和报告编写都是在一个单独的环境中完成的.
" z w |+ R+ h/ g+ x0 i
6 m& E$ }* C: m# ~) `& G' w6 S$ n |3 p0 F$ _
, P5 l7 {# a$ d9 q| | 3 g% I. Q# P1 f
参考 |
8 J0 @' q2 k. S2 sDantzig G. B., Linear Programming and Extensions, Princeton University Press,Princeton, New Jersey, 1963, Chapter 3-3. |