|
GAMS示例
" {% g# w7 C9 ?+ _/ Q, K4 g: I5 _下面这个问题主要是用来举例说明GAMS是如何让您以一种自然的方式建立模型.GAMS能够处理大的多和高度复杂的问题.在这里只展示了GAMS的很少一部分的基本特征. 3 C8 Q8 m2 }$ ~; R }* f7 H# j" a
8 y2 Y8 |/ k0 { F, _8 W5 s
* F& _5 i# e" T! u- Q( ^/ r$ z' B0 H( B1 X' `3 _6 \
| | / z. _6 d$ S, Q9 \: o6 ?
代数描述 | 8 D$ d, v6 {+ h( S
下面是问题的标准的代数描述,这是用来最小化把货物从2个工厂运输到3个市场的费用.受约束于供需约束.
# e5 E; x, i# V5 K指标:
1 N! z4 B) N* v' P0 h$ G$ `5 c i=工厂(plants) j=市场(markets)
' [# n! J2 i Y8 F3 i- K给定的数据: ! I/ G$ P- r, ?$ [7 z+ B
=在工厂i日常供应量(批数cases)
=在市场j的日常需求量(批数cases)
=在工厂i和市场j之间的距离(千英里)
=在工厂i和市场j之间每单位的运输费用($/批/千英里) 3 q# J+ d% B# q' G t* v) X/ x
# r3 h; ]% j: o) l! K3 c' W
/ }+ A( x8 ^, L$ r0 r: W! ^: ~1 [( l* H/ N5 d( j' U
| 距离 | 7 v& _) V! Z! x
| # \) {# {: s; T! m# a
( H2 y$ I3 q0 r
| |
, j7 q, s5 P) l; C) @市场 | 8 [: E/ v( b! F0 J4 m
| + E3 f" F7 _8 Y0 g5 B. \4 f
" ~( |( {1 E) t- x% R
| 工厂 | 8 g5 R3 R$ ~2 [
New York |
' T7 k* [& |6 R/ R5 YChicago |
2 q r/ x1 `$ l" ATopeka |
3 t1 g( s: T" [6 |9 k9 i/ I供应量 |
8 t+ P& f1 n8 I, ~/ F; i" o
0 t- v" t0 O9 j u" d| Seattle | + F l, k6 m- Z( P( \7 w
2.5 | L* C8 e, [6 h- {7 i
1.7 |
# M+ P, z/ r0 L# h1.8 | ! T6 r' L; C3 X
350 |
3 V4 B, [; a v
* y8 j$ g& Z) C. G, Y$ S- F| San Diego |
, N- j6 B) `( X) d6 ?2.5 |
8 S" T* @; d3 H8 j) {( p+ o- ]1.8 | z$ `+ Z6 u/ R/ j2 E
1.4 | % d# { G: N0 w R+ l
600 | # q8 k& A M8 \3 J% ~, M
r. b$ ~4 s* ~. c
| 需求量 | ! X: f% q! B# C/ S, X0 O6 E& Q
325 |
5 _' [8 ]2 J8 k! w2 D, U5 [6 n300 | / I# M) H! p2 }: N* A7 _, E
275 | / g, Y+ P. C9 k5 [8 @) T2 q
|
/ w1 ?4 y! ]. M$ w9 X ? F=每批每千英里的费用$ : u: S; n9 g: g
决策变量: " Q4 p# O: J1 l6 w' p/ n* r# J% V
=日常从工厂i运输到市场j的总量(批数cases) 这里 适用所有i,j
# Y+ s6 T7 W0 b0 T0 B约束:
9 u; S/ W& j5 a在工厂i的供应量**(批数cases): 适用所有的i 在市场j的需求量: 适用所有的j 8 b, h, M6 r; i+ A/ \; h9 c# w
目标函数: - n& c4 e% s" C; E
Minimize (千元) % ?% n7 x1 W9 E; R
- q0 H+ C n6 A* X* W7 _) |1 R% ]
" v4 J4 V; s) ^' C' K/ ~4 t
3 D5 Z* K% ^8 P, [8 A| | . ]/ d9 z7 n! f8 x
GAMS模型 |
6 S4 v! d p. _; {0 U3 n同样的模型在GAMS中建模.简练的代数描述使得模型高度紧凑,并带有逻辑结构.内部的文档,比如对参数的解释和测量的单位,使得模型很容易读懂.
/ P8 Z3 I- W2 G: Z
集合(Sets)
8 h: V V( u2 ~0 X" J) [. L
6 Q; x& l/ F7 }/ I' {! kGAMS让您以直接的方式指定指标:声明和命名集合(这里是I和J),并列举它们的元素.
- V9 v8 ?; |, k0 y& m8 Y3 e1 p4 @参数 & w6 p5 y7 Z7 x* ?" R9 k* ^+ U

; y* i* w2 P w0 F/ w0 M: ?这里的数据输入被作为指标参数A(I)和B(J),值简单的被列出.
6 L9 h$ Y3 X) @1 S, X! U' ]$ r) OGAMS让您可以在模型的任意位置放置解释性文本(以小写格式显示),当您在开发它时.您的注释自动被结合到输出报告中的合适位置.
9 |) {# j8 ]+ I+ V c6 C2 o表格
3 a g6 G$ s2 o' j5 p0 m% z" V6 U 数据同样能够以方便的表格形式输入.GAMS让您以数据的基本形式来输入数据-转换是特定的代数化的. 7 V% O3 K9 |& y4 l2 t! G" b
标量(Scalar)
2 x# _0 N* X8 F. {8 x 常量能够被声明为标量,它的值是指定的. : U4 a2 o# `- u" D& T! b3 G
数据处理
, v* Y7 x b+ n- n) r! _( F
+ i, R/ Z3 `& Q3 B* R当数据值要被计算前,您首先要声明参数(比如,给它一个符号,随意给它编个指标),然后给它一个代数公式.GAMS将自动进行计算.
+ L K$ i! H. Y. |变量
' X8 T: U* `& [6 X/ C# m
3 Y7 `4 W+ L6 r' t. s' R. o决策变量以代数的方式表达,带有特定的指标.从这种常见的形式,GAMS在域中生成变量的每个实例. - G4 T" k8 m# Y' |* W G3 P3 a
变量可以被指定为下列类型:任意(FREE),正值(POSITIVE),负值(NEGATIVE),二元(BINARY),或者整数(INTEGER).默认是任意(FREE).
5 R* O4 [/ B7 u目标变量(这里是z)仅被声明,没有指标(index). , R _0 U+ q& R% B
方程式 , y3 Z; w8 ]8 S' K. I( n
 - T( w/ V/ Q5 n% S
目标函数和约束方程式首先被通过指定名字来声明.然后它们的概括的算术公式被声明.GAMS现在已经有了足够的信息(从上面的数据输入和从在方程式中指定的算术关系)来自动生成每个单独的约束声明-就像您能在下面的输出报告中看到的. ; `, y) G4 t$ }' ^) e1 p
=E=表示'equal to' (等于) =L=表示 'less than or equal to' (小于或等于) =G=表示'greater than or equal to' (大于或等于) ) O( u8 f4 U* |) s4 Y: R6 y% @
模型声明
) g7 n0 d( R( u. T8 k7 t/ m1 E 0 k4 H- H9 z7 Z7 G
模型被指定了一个唯一的名字(这里是TRANSPORT),模型缔造者指定那个方程式应该被包含到这个特别的公式中.在这里我们指定了ALL,也就是说所有的方程式都是模型的一部分.就等于是MODEL TRANSPORT /COST, SUPPLY, DEMAND/ . 这个方程式选择使您能够在单个的GAMS输入文件中以公式表达不同的模型,基于相同或不同的给定数据. 0 {# f3 ~* P1 x# {
求解声明
' [& \. H0 f; V* E + t1 Z) b/ c( s
求解声明(1)告诉GAMS那个模型要被求解,(2)选择要使用的求解器(在这里是LP求解器),(3)表明优化方向,或者是求最小值,或者是求最大值.(4)指定目标变量. ( O# @1 z0 w0 F9 e& A
8 S% B2 ~) I* _" D3 m, A" h
7 N( p* |* d, j; H% c
7 |4 Z) n/ `1 x+ Y4 U" G
| | " w, ~8 \2 O/ e
GAMS输出报告(部分摘录) | : S4 D, y4 w) j4 e8 w+ \+ W' X# a
完整的GAMS输出报告比下面列出的部分摘录详细的多,包含了更多的帮助用于解释和诊断您的模型.甚至您能够修改输出格式来符合您的特定的需要. * c7 t% s( s- g* p0 a2 j
方程式列表 0 P- D0 q; o* ^- u) o8 I
 ; R+ z8 [1 Q0 j/ l: L5 u* y
方程式列表显示从在GAMS输入中指定的分区(block)生成的单独的约束.在GAMS中使用者可以以一种非常紧凑的形式写下被索引的方程式分区(block),这将产生大量的单个方程式.在我们的示例中,我们指定了3个方程式分区,生成了6个单独的方程式. $ s0 }% z. a. `1 q7 g
列列表 3 t0 V9 q& s; G2 F+ {
 $ N8 v+ B+ \2 W& m* B- {& {. o
列列表提供信息到生成的单独的变量上.变量X(I,J)扩展出6个单独的变量.当许多变量从一个分区中被生成,默认的列表只显示最初的3个(用户可以修改).
- }8 G6 g/ t' P" s; ~" X; x0 R; u' J; \8 U
" O7 K& w, E- A" a4 V3 q
& d2 m7 w) c8 \* o| | + r1 @ Z" m" l$ c2 u
求解信息 | 8 U8 ?' c: c0 |, H% h

# z" x) T) }9 ]$ L求解声明将生成模型(单个方程式和对应到特定模型的变量的产物).首先一些关于生成的模型的统计表将会被显示:方程式数,变量和非零元素.
) E: x* {, c+ @在求解汇总信息部分,我们看到BDMLP被调用来求解这个模型.BDMLP经过4次反复,耗时0.18秒找到了这个问题的最优解.求解信息下列的消息来自求解器. # c$ b* t$ Q3 ]) }) ^
解(Solution) 5 Z9 o+ [) D1 [) ^ D. \
 ) a% t% j( E0 ]5 J1 n* ^
解被显示在这里.边际值(marginals)对应方程式的重复和变量减少的花费. . A- B& |3 t0 l8 {
写工具不需要学习一门其它的语言.在GAMS所有的数据处理,模型定义和报告编写都是在一个单独的环境中完成的.
3 S* Z4 k4 w) R' Z {, ?+ M+ ^4 O1 Q% Y0 A- U7 ]
* ^; u6 D; X2 U7 M* V
) m+ K1 O. d. }2 w; X' f| | : `7 c Q6 _+ g/ m) p6 q
参考 |
( b4 U5 r6 \6 m/ v# N0 t+ ODantzig G. B., Linear Programming and Extensions, Princeton University Press,Princeton, New Jersey, 1963, Chapter 3-3. |