|
GAMS示例 / F1 f0 ^ Q5 S b- I
下面这个问题主要是用来举例说明GAMS是如何让您以一种自然的方式建立模型.GAMS能够处理大的多和高度复杂的问题.在这里只展示了GAMS的很少一部分的基本特征.
% e$ B+ e* C, W7 c; [0 h7 i6 J. `) U; u9 t
4 q5 _. J; F9 C1 d8 b$ s* T$ z# P
1 z( p" P/ k, l5 }: d| | 1 K6 v" i) y0 M
代数描述 |
8 U! T' x" d7 V& @7 U9 s9 @下面是问题的标准的代数描述,这是用来最小化把货物从2个工厂运输到3个市场的费用.受约束于供需约束. & \. G. w* l- ]5 Q1 j. U
指标:
7 o4 o6 R8 z' ~. D7 t$ F% @' X i=工厂(plants) j=市场(markets)
; `+ X( n& ]9 h给定的数据: 0 L/ Z4 S0 R4 K6 F" a! L
=在工厂i日常供应量(批数cases)
=在市场j的日常需求量(批数cases)
=在工厂i和市场j之间的距离(千英里)
=在工厂i和市场j之间每单位的运输费用($/批/千英里) , r9 s# U0 X0 W9 G) n5 R4 P
5 M9 x. `5 H7 {- k: N( R/ C
6 W5 x1 v- B* \7 o0 ?% ]& x) A' }7 Z3 m8 x: N. {4 I+ ?
| 距离 |
# K, N* ~. l5 u- `- S* j/ R |
3 v/ j5 F' Q) l# T0 O8 ~$ `
0 o- a: e- M8 v+ o/ v| | : A$ @: | _$ O6 P' o& o3 Y
市场 | 5 Z9 I% }9 R7 H
|
4 b% V% Y. a6 s+ ^6 C/ q4 \7 S% y5 ~1 q7 C" l. I$ o5 m* a
| 工厂 | / ^1 X# q0 b7 |: E. \- h) ~: ]
New York |
4 d; g! }! y) c+ q; _& k [Chicago | 9 R; h, t/ p0 r
Topeka | ' a1 k; `: q9 t h
供应量 |
) z7 G: E+ N, _0 O% o, J X8 y; a: Q- K E6 W$ [, ?
| Seattle |
9 C9 l! E% K) l7 a" X2.5 | r) N! [( e) T1 y: S- V
1.7 | 8 W) S7 g2 X* l7 S8 F+ p) D5 f2 D
1.8 |
# g5 b6 E) d8 R! W" s350 | 3 I: g# {, ?1 E1 R, G6 ^0 }) V
c8 R7 q4 r! \$ R K6 h: d4 h. v' B
| San Diego | $ X. V7 A' s5 j& O& e% Q$ _7 w( s
2.5 |
) [8 p7 _" s, c& I- u+ e1.8 | , W+ P% s4 Z5 d& D, | {8 t
1.4 | 9 |' O% f% X6 m0 }) k' K
600 | 2 S# L2 H+ o2 E" ]: E/ R( p
; O4 I' L3 e/ j S5 X; o+ X4 || 需求量 |
4 \! k& {2 E% M$ N) N" T9 \325 | 7 Y0 ?4 q8 K, u! i7 V
300 | ' i4 G" t J; U$ k( m
275 |
i' r2 [, u) s( x7 N5 P | ! g" [4 X6 X7 }$ E
F=每批每千英里的费用$
; b5 x- U2 {- K7 P' o0 C决策变量:
1 \) B0 B6 w& Q =日常从工厂i运输到市场j的总量(批数cases) 这里 适用所有i,j 0 l" n4 V. c! a- ]" _5 `
约束: 3 x% W8 b* s4 y" q" Q# V/ |
在工厂i的供应量**(批数cases): 适用所有的i 在市场j的需求量: 适用所有的j 8 k4 V. M( d4 O3 ?3 U: C
目标函数: 7 E2 n+ I# o2 s# W4 v% z
Minimize (千元) 8 f" R! S; L' s& C0 r0 }3 Q( e4 w
g# z- n$ A4 @+ R0 }% G, y! e+ H0 a
0 x8 ~8 ^% N8 N# f# ^6 B. @; B7 f* j" f' ?2 p/ o
| |
8 ?+ a+ K' T2 d/ ^* R GAMS模型 | 7 f( Y _7 F3 {6 Y4 T
同样的模型在GAMS中建模.简练的代数描述使得模型高度紧凑,并带有逻辑结构.内部的文档,比如对参数的解释和测量的单位,使得模型很容易读懂.
5 E+ k; @7 j4 P) N 集合(Sets)
: N, x* P+ N# B( Z! \, F
9 {7 l; r$ i3 t" {& u& _GAMS让您以直接的方式指定指标:声明和命名集合(这里是I和J),并列举它们的元素. & s9 K2 Q0 @; G/ i
参数
+ a. U4 Z* q; y6 Z v 8 {! M% t f3 [. M7 I7 j
这里的数据输入被作为指标参数A(I)和B(J),值简单的被列出. 1 Q: k6 ]6 x5 l/ I/ y( \* B0 U
GAMS让您可以在模型的任意位置放置解释性文本(以小写格式显示),当您在开发它时.您的注释自动被结合到输出报告中的合适位置. # g: ]. m: g5 v3 q
表格 7 ?& O. D* ]( C% E
 数据同样能够以方便的表格形式输入.GAMS让您以数据的基本形式来输入数据-转换是特定的代数化的.
5 k7 G# x! R9 M- n标量(Scalar) ( U3 L' |$ f, i% f, q C
 常量能够被声明为标量,它的值是指定的. 5 o# e$ d) k6 U) W B& I7 N
数据处理
0 k: _% C) w3 `- n# Y4 M/ H ; \9 E$ F+ a$ r2 `
当数据值要被计算前,您首先要声明参数(比如,给它一个符号,随意给它编个指标),然后给它一个代数公式.GAMS将自动进行计算.
, W; x7 Y i* j变量 : ]8 J1 ?* _6 b
 & ? U& V' ?, G8 ]7 S* U
决策变量以代数的方式表达,带有特定的指标.从这种常见的形式,GAMS在域中生成变量的每个实例. 4 H- K1 |" P; u5 d: W0 z
变量可以被指定为下列类型:任意(FREE),正值(POSITIVE),负值(NEGATIVE),二元(BINARY),或者整数(INTEGER).默认是任意(FREE). 5 P0 I, q) N% P; F" W- o, I
目标变量(这里是z)仅被声明,没有指标(index). " m& R# l" J) Z, ?
方程式 : ~, E. e$ _3 v+ h0 @/ L
 1 j) T, y3 r# V% _* l# o! G
目标函数和约束方程式首先被通过指定名字来声明.然后它们的概括的算术公式被声明.GAMS现在已经有了足够的信息(从上面的数据输入和从在方程式中指定的算术关系)来自动生成每个单独的约束声明-就像您能在下面的输出报告中看到的.
0 g8 v( }$ {7 p3 {. j& h1 D=E=表示'equal to' (等于) =L=表示 'less than or equal to' (小于或等于) =G=表示'greater than or equal to' (大于或等于)
! p7 _, k, |9 ]& v8 a q: n; C& j+ c6 |) Q模型声明 7 K: c2 r, Q1 x ~3 A
 " m/ G) q, l" U8 N
模型被指定了一个唯一的名字(这里是TRANSPORT),模型缔造者指定那个方程式应该被包含到这个特别的公式中.在这里我们指定了ALL,也就是说所有的方程式都是模型的一部分.就等于是MODEL TRANSPORT /COST, SUPPLY, DEMAND/ . 这个方程式选择使您能够在单个的GAMS输入文件中以公式表达不同的模型,基于相同或不同的给定数据. 9 v' g$ s% R. Q" E" T
求解声明
( C: z k" {" w ) E4 ~5 X7 x$ S- D
求解声明(1)告诉GAMS那个模型要被求解,(2)选择要使用的求解器(在这里是LP求解器),(3)表明优化方向,或者是求最小值,或者是求最大值.(4)指定目标变量. ! A1 _ i' v2 p
. h. Z2 e* `; D1 i5 w2 j% R3 t, O! o- S; n( d/ s. }
. F3 W* d4 [+ R' I
| | / @2 L1 L, V$ R% n
GAMS输出报告(部分摘录) |
+ C9 z1 B H/ R7 o完整的GAMS输出报告比下面列出的部分摘录详细的多,包含了更多的帮助用于解释和诊断您的模型.甚至您能够修改输出格式来符合您的特定的需要. + ?$ n3 R' r% a! _
方程式列表
# V& ^; H3 o$ s( J 0 ], G2 ]0 e X; Q) }' l2 e
方程式列表显示从在GAMS输入中指定的分区(block)生成的单独的约束.在GAMS中使用者可以以一种非常紧凑的形式写下被索引的方程式分区(block),这将产生大量的单个方程式.在我们的示例中,我们指定了3个方程式分区,生成了6个单独的方程式.
$ E" i. E6 E3 z* ?5 [; O列列表 5 A3 F% r; J: C- w
 5 M4 I9 E% x2 k, q4 V
列列表提供信息到生成的单独的变量上.变量X(I,J)扩展出6个单独的变量.当许多变量从一个分区中被生成,默认的列表只显示最初的3个(用户可以修改). + g- K' |, @$ o# R
4 l0 G8 J2 D9 p7 X+ Y( ]# V+ |2 y4 v h' C. o
1 M0 l) R" w& ~8 X: w% u
| |
3 d% Z, H. K P 求解信息 |
* `# y) C% D( L- ^$ m0 Y ( A( y/ Z+ V0 b& E( F# O! t4 }: m0 N
求解声明将生成模型(单个方程式和对应到特定模型的变量的产物).首先一些关于生成的模型的统计表将会被显示:方程式数,变量和非零元素. 1 u# M5 \" T! P; t: p% I, W
在求解汇总信息部分,我们看到BDMLP被调用来求解这个模型.BDMLP经过4次反复,耗时0.18秒找到了这个问题的最优解.求解信息下列的消息来自求解器. 9 y* |" D. i. f8 | W; w; y8 m
解(Solution)
5 O- O- ^% m' s+ | ^9 K- _% K6 ?; ?2 o& a. b* N
解被显示在这里.边际值(marginals)对应方程式的重复和变量减少的花费. 6 V& y$ W ~; J8 r# {$ _. ?
写工具不需要学习一门其它的语言.在GAMS所有的数据处理,模型定义和报告编写都是在一个单独的环境中完成的.
- U' g8 z) l1 B, ?( n, K( ?2 }% I3 J+ c5 `! K" m5 {; v% u; F6 H* ~: c
% i- j( b3 i5 X, `; ?9 {3 l: B
7 {) B5 i* d. y4 K; z6 s( @| | & a4 w6 }# r% e3 D4 l7 x8 E2 J) `
参考 |
( m. }4 N* m7 H S$ P+ BDantzig G. B., Linear Programming and Extensions, Princeton University Press,Princeton, New Jersey, 1963, Chapter 3-3. |