数学建模社区-数学中国

标题: GAMS示例——运输问题 【代码及演算过程】 [打印本页]

作者: huashi3483    时间: 2009-11-14 04:27
标题: GAMS示例——运输问题 【代码及演算过程】

GAMS示例

5 C1 E7 v# Q2 |" P9 T4 {

下面这个问题主要是用来举例说明GAMS是如何让您以一种自然的方式建立模型.GAMS能够处理大的多和高度复杂的问题.在这里只展示了GAMS的很少一部分的基本特征.

7 m/ d/ J2 f+ q7 E' k9 X& K- ?' N/ o, s5 h! D2 J3 u3 ]! F# C0 f! D4 t' z9 ~/ [* T' h- f' d. H5 U( q$ T& S
   代数描述
9 {+ e$ |+ w! m n( f

下面是问题的标准的代数描述,这是用来最小化把货物从2个工厂运输到3个市场的费用.受约束于供需约束.

- ~* B9 i$ I, p0 ~ _. O+ l% z

指标:

' h _, j: {$ i+ r9 f$ r

 i=工厂(plants)
j=市场(markets)

. f. M+ A. N6 F# f* L2 e2 h! O

给定的数据:

4 d0 r& |# b. f* ]" U! ]

=在工厂i日常供应量(批数cases)
=在市场j的日常需求量(批数cases)
=在工厂i和市场j之间的距离(千英里)
=在工厂i和市场j之间每单位的运输费用($/批/千英里)

. k4 f) U5 ]1 r& i 4 L8 c& D9 n4 Q9 B3 @: t/ z! l3 D* e: N( U& Z( r8 Z1 P k7 c8 S( z4 O* c/ g" q1 _' E5 [0 a) P# J% p |- R4 Z' S% Z T4 q2 @) x( H( b) @) u4 m* f) Q4 k7 t+ F4 t3 m1 ~# `" j+ `3 U$ r( D' S, l, P/ t6 L$ C: R1 E, y4 j4 a) J6 I% n, |0 p$ `% B! N7 W* \- C& Z! z) {; `" j- b! R+ ]# I% U$ k( m" b7 U* C( r. i. J9 s' F4 d% M" |" [0 j( G. z1 X3 ?1 Z% u l' T* K' H$ z9 X5 U) W( T3 V c# L/ b/ Z* D# p% O# ~' I2 b4 T1 W; Q0 D" {+ V+ L0 j% d! y' ^$ f. x. G' P S& v' d2 Q8 `$ \. f- W8 ]0 T; T" ]* U5 m) h+ f8 F) C7 E! }/ z/ z; e9 k9 \' ~; q, A: Y' m; O8 R, A/ A, V' p6 H8 ?! d4 q, w B( ]/ m- \# H8 k5 K) q+ Z- c4 e3 n- A6 q2 a' Z& o! Q, u* h6 h& r0 I/ y7 F- l- E5 Y# }& M9 f5 x r8 `8 s# X% Y1 ?8 v E; c& D: Q$ L! i+ A4 [( z) O" Z- W# ?# Z% A6 _
距离  
  市场  
工厂 New York Chicago Topeka 供应量
Seattle 2.5 1.7 1.8 350
San Diego 2.5 1.8 1.4 600
需求量 325 300 275  
- T! S3 q7 @5 z7 \! b

 F=每批每千英里的费用$

1 _! ~8 p }) f

决策变量:

$ d. F& g/ N) p3 m( u) ^, N# G

=日常从工厂i运输到市场j的总量(批数cases)
这里 适用所有i,j

" Z& D3 i- x* I8 M1 }

约束:

) t' r) \% @3 X

在工厂i的供应量**(批数cases):适用所有的i
在市场j的需求量:适用所有的j

& B8 g: u, Y, ~9 w

目标函数:

! S& K) p1 y# s% |. ], E

Minimize (千元)

, C5 n- l2 R9 P) n5 J; N. U% p4 p# v3 w- `, T% Q4 u3 c g" C. w! Y' `2 |& V4 V! h5 k) Y- u$ l% [% O! G' ]
   GAMS模型
6 x' f9 P- ]7 W' a7 n

同样的模型在GAMS中建模.简练的代数描述使得模型高度紧凑,并带有逻辑结构.内部的文档,比如对参数的解释和测量的单位,使得模型很容易读懂.
. ^$ h( ^2 m. _$ m/ r1 o

集合(Sets)

0 W1 d/ R6 z7 ~& I

# u$ {* f; ?) L% j) O# L- ]0 s

GAMS让您以直接的方式指定指标:声明和命名集合(这里是I和J),并列举它们的元素.

0 G) {" I ?0 n0 a3 e: M

参数

+ ~2 [6 Z0 d F. S

/ Z4 l* u7 S8 L4 v& R

这里的数据输入被作为指标参数A(I)和B(J),值简单的被列出.

- G5 p4 ] f( T' }& F3 o% f

GAMS让您可以在模型的任意位置放置解释性文本(以小写格式显示),当您在开发它时.您的注释自动被结合到输出报告中的合适位置.

/ Q" ^$ O3 y" w

表格

* Y9 E$ L& Y E


数据同样能够以方便的表格形式输入.GAMS让您以数据的基本形式来输入数据-转换是特定的代数化的.

! M( h% H- i( [

标量(Scalar)

) N; t u: _ o


常量能够被声明为标量,它的值是指定的. 4 {* C3 a( b* A( n& b. h( V

数据处理

9 A! M& H9 `3 P$ K8 c& g

; P( d5 ^& p* t# [* ~! g; k \

当数据值要被计算前,您首先要声明参数(比如,给它一个符号,随意给它编个指标),然后给它一个代数公式.GAMS将自动进行计算.

/ w* A' C. I! ?& q

变量

9 D+ B4 D8 ?# Y9 Y# Q2 J; L$ D

) _3 a8 F* D: ^$ ^ v' V; p) D% T, S

决策变量以代数的方式表达,带有特定的指标.从这种常见的形式,GAMS在域中生成变量的每个实例.

+ y {4 P" T0 O1 i" f& [# i

变量可以被指定为下列类型:任意(FREE),正值(POSITIVE),负值(NEGATIVE),二元(BINARY),或者整数(INTEGER).默认是任意(FREE).

( T- O6 ^8 B+ C" F0 Q, t/ p

目标变量(这里是z)仅被声明,没有指标(index).

; j8 B& k/ Y3 `- C/ s8 P

方程式

) _$ U7 ?- g2 D4 {: _

5 y" R" D" @7 i7 K& }6 l

目标函数和约束方程式首先被通过指定名字来声明.然后它们的概括的算术公式被声明.GAMS现在已经有了足够的信息(从上面的数据输入和从在方程式中指定的算术关系)来自动生成每个单独的约束声明-就像您能在下面的输出报告中看到的.

* m1 n9 i! q- N# d! U1 \* D

=E=表示'equal to' (等于)
=L=表示 'less than or equal to' (小于或等于)
=G=表示'greater than or equal to' (大于或等于)

/ a2 D0 b8 ]: g) @" R# k

模型声明

6 O! @ o* L$ N* H

2 I/ f6 I0 |8 D0 C# L/ x

模型被指定了一个唯一的名字(这里是TRANSPORT),模型缔造者指定那个方程式应该被包含到这个特别的公式中.在这里我们指定了ALL,也就是说所有的方程式都是模型的一部分.就等于是MODEL TRANSPORT /COST, SUPPLY, DEMAND/ . 这个方程式选择使您能够在单个的GAMS输入文件中以公式表达不同的模型,基于相同或不同的给定数据.

. |7 ?& O" Y' F! n5 \( r

求解声明

& A6 ]) ?! l4 r3 W; U

8 V3 b, Q1 P8 b6 _, r Z! z

求解声明(1)告诉GAMS那个模型要被求解,(2)选择要使用的求解器(在这里是LP求解器),(3)表明优化方向,或者是求最小值,或者是求最大值.(4)指定目标变量.

0 d& M* `8 A+ W ( N7 V6 R! z7 R; h( y! N7 h/ y: N4 l8 S( m, \5 s, B) L0 b2 Q9 g- V% r/ o! G: S8 N3 C5 p& t+ n( t
   GAMS输出报告(部分摘录)
/ \; e. U3 I0 f( X6 r8 {+ K0 x

完整的GAMS输出报告比下面列出的部分摘录详细的多,包含了更多的帮助用于解释和诊断您的模型.甚至您能够修改输出格式来符合您的特定的需要.

) F# F3 r+ K5 S* v5 H) t* m+ Y

方程式列表

' {. l; `2 w. |+ `$ | f$ _

, r- t3 \1 Y8 e& ^; M! @/ `% ]! B

方程式列表显示从在GAMS输入中指定的分区(block)生成的单独的约束.在GAMS中使用者可以以一种非常紧凑的形式写下被索引的方程式分区(block),这将产生大量的单个方程式.在我们的示例中,我们指定了3个方程式分区,生成了6个单独的方程式.

6 f2 V% ?& N+ \

列列表

# X# ]# g! u3 d, Y6 ]

" W# U, M9 n! r3 d

列列表提供信息到生成的单独的变量上.变量X(I,J)扩展出6个单独的变量.当许多变量从一个分区中被生成,默认的列表只显示最初的3个(用户可以修改).

1 ?9 I# ~( u. J- y0 P5 D & m3 G3 @! @1 M+ A( B/ n3 E4 \9 L9 E- X4 {; p( {- N) ]; F; G% y0 w; O8 G& Y+ V5 o; j
   求解信息
- d) a7 C4 J- i2 h" U, F; `' G

0 v2 n0 ^7 Z1 T( U8 B4 M9 T

求解声明将生成模型(单个方程式和对应到特定模型的变量的产物).首先一些关于生成的模型的统计表将会被显示:方程式数,变量和非零元素.

# P! i4 n f; h; U

在求解汇总信息部分,我们看到BDMLP被调用来求解这个模型.BDMLP经过4次反复,耗时0.18秒找到了这个问题的最优解.求解信息下列的消息来自求解器.

4 u3 h, J% L. x' o( d' F

解(Solution)

; D/ @: `& ?8 M; [* z/ d

+ K+ r% S; {8 ], Y) X$ m

解被显示在这里.边际值(marginals)对应方程式的重复和变量减少的花费.

1 X" I# p$ ^! j0 U& n( Z

写工具不需要学习一门其它的语言.在GAMS所有的数据处理,模型定义和报告编写都是在一个单独的环境中完成的.

8 R3 I2 Z9 }+ o+ i2 v " g/ J) {/ u! z/ S9 M! b4 c1 P; A# v5 q0 T* T8 G; A8 q7 V) u$ _1 ], r4 }; H9 H2 w, w
   参考
) Y8 Q. n/ C5 k7 O; H6 r- g

Dantzig G. B., Linear Programming and Extensions, Princeton University Press,Princeton, New Jersey, 1963, Chapter 3-3.

GAMS Example.pdf

143.39 KB, 下载次数: 57, 下载积分: 体力 -2 点

GAMS 示例 (PDF格式)下载


作者: xiaoxiongwewe    时间: 2010-1-12 14:07
呵呵 这个例子做入门非常不错啊 支持一下 辛苦版主了
作者: gssdzc    时间: 2010-10-21 20:49
非常感谢楼主分享
作者: xupu3517    时间: 2010-12-20 08:42
呵呵 这个例子做入门非常不错啊 支持一下 辛苦版主了
# l1 U9 X9 x, G% u7 V1 J, ~: W
作者: gaoshanliu水    时间: 2010-12-20 09:56
辛苦版主啊/ t8 L% i) B8 \! x7 {
6 F3 U/ v# u. t( d$ ~7 D
7 s* ]1 L$ Q3 N: V* I4 w9 R
   
作者: domschke    时间: 2011-8-14 05:34
非常不错,辛苦
作者: WUSTLISHAN    时间: 2011-12-17 22:46
辛苦了,正在学习gams的使用
作者: →在别处。。    时间: 2012-2-7 21:27
好东西啊~~
作者: constancemoon    时间: 2012-4-24 16:17
辛苦了,楼主
作者: 市_长    时间: 2012-5-13 16:02
学习GAMS的路过,表示支持~
作者: 邓浩考研    时间: 2012-10-10 09:47
帖子很好啊,入门很好啊。
作者: wsq200808    时间: 2012-12-9 22:55
邓浩考研 发表于 2012-10-10 09:47
0 v. J. Z9 ^- g/ w5 I帖子很好啊,入门很好啊。
5 [" |6 q# [# B4 v0 p1 p$ d
你的时间怎么是明天呢?
作者: 邓浩考研    时间: 2012-12-10 10:08
wsq200808 发表于 2012-12-9 22:55 5 g. S' n% A6 q3 W$ {* b3 c. t
你的时间怎么是明天呢?

. K& m( c9 o2 ^; g  T. B5 J6 _1 @我是外星人。。。嘎嘎嘎
作者: 他山石    时间: 2013-7-30 09:03
版主辛苦了!
作者: 鸣凤123    时间: 2015-8-14 08:24
楼主的帖子很不错,我很喜欢5 [* G! }- H2 S$ c/ N7 j

作者: LYJA    时间: 2015-10-13 07:31
very good, thank you very much!  R+ t; P3 R  _6 K0 c! C: p# u

作者: xiangbeihai    时间: 2017-3-1 21:23
不错,已收藏
3 Z1 t1 ]! r9 o& Y* P
作者: 板砖sy    时间: 2017-3-10 10:20
入门看这个就足够了,但是一旦独立进行编程的话,会出现很多bug,还有错误代码,都不知道什么意思,大神有没有解决这些问题的方法,辛苦了
& q9 g* J7 ^4 i6 v9 ]




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5