数学建模社区-数学中国
标题: GAMS示例——运输问题 【代码及演算过程】 [打印本页]
作者: huashi3483 时间: 2009-11-14 04:27
标题: GAMS示例——运输问题 【代码及演算过程】
GAMS示例
) W' h+ @, D! o1 f r& V6 ~
下面这个问题主要是用来举例说明GAMS是如何让您以一种自然的方式建立模型.GAMS能够处理大的多和高度复杂的问题.在这里只展示了GAMS的很少一部分的基本特征.
9 O0 S' s* F0 l3 O, @! j: T
; {. P+ c" l- \$ Y! ~' l2 Y7 g r
' s& R3 u: p% o) n| | " ]9 k/ Z0 }( A% T( [ l1 d
代数描述 |
) v$ S* d' L2 Q/ b- d+ o3 u0 H下面是问题的标准的代数描述,这是用来最小化把货物从2个工厂运输到3个市场的费用.受约束于供需约束.
/ q9 M' B6 A$ B0 i2 `0 t
指标:
8 G' F, k {; L1 w" X+ I. y
i=工厂(plants)
j=市场(markets)
$ P% ]! e, z" B9 l& L" V9 ]给定的数据:
' K: M( a2 e* }5 G1 W# K7 d
=在工厂i日常供应量(批数cases)
=在市场j的日常需求量(批数cases)
=在工厂i和市场j之间的距离(千英里)
=在工厂i和市场j之间每单位的运输费用($/批/千英里)
: C* N$ y) Y! r; @4 l, @$ W Y3 ~, t3 p# W% ]! Y
4 T: M1 X, @! O7 A( a4 }3 }
% T) H8 X0 d# S* ?5 V9 d% `| 距离 | 1 e5 ~2 E& e, P6 M' v4 _; g% z
|
: x& K8 K, m2 J6 G( i
. J& f/ J4 u2 f% @: l8 M
| |
/ S. Y4 V. V A7 g; \' e" t7 y* h市场 |
7 u6 d6 P) p' ` |
5 ]- _# L6 [& x7 @" o
3 ]) Y+ y5 _8 _
| 工厂 | 8 N2 H# N/ w# d6 r0 z
New York | ; s/ z# [9 O2 k! Z- ~ B* P
Chicago |
0 r% {4 J0 y1 T# ?% RTopeka |
7 d' d# [# j1 V$ B供应量 |
/ r- V( Q. H, }! b X
$ `9 O% |# j) s% q" a9 T| Seattle | ; \5 f6 {' a; L! j
2.5 | 0 Q; D, _8 @; x" R" v2 ^3 l+ P0 a2 q
1.7 |
/ o4 a( f! \4 g: t. v, ?1.8 |
2 [* f8 u& j3 q) H350 |
* B0 r/ d* C0 b4 |/ c3 j
* Q$ g2 ]5 \- N; a# k0 Y| San Diego | 2 l x' J& I9 h4 h0 p! H
2.5 |
1 H, I# P4 m Z0 J# j% A5 j1.8 |
4 ]3 j5 A& _: @0 b, W' f# Y1.4 |
, Z7 f, d M. [, N6 F600 |
! a& a2 S; W5 @. Y. }6 f+ i* C
) r8 K' E ^9 a* ^) b7 C4 b: y9 T2 F| 需求量 |
) w/ V& a% q/ z2 T325 |
: R! B1 L. W# W5 @300 |
/ |/ j9 _& w$ S- C/ E/ {275 |
6 p: D) I2 e7 V |
$ [$ j1 V) T( p9 w' a8 w
F=每批每千英里的费用$
7 i" s D7 B# B( e决策变量:
1 e9 ?- s9 h- J$ a* ]+ W q5 B
=日常从工厂i运输到市场j的总量(批数cases)
这里
适用所有i,j
/ N6 |$ O1 d9 q
约束:
4 Y$ I1 e8 h1 J# m
在工厂i的供应量**(批数cases):
适用所有的i
在市场j的需求量:
适用所有的j
% @4 I. E7 N; ^1 X) B6 r目标函数:
% B8 o- o! Q2 ?Minimize
(千元)
! C$ r9 Q% ~$ ~, P" j( z) y
: l' n6 y# C: Q/ Q' K+ _) q
. K# U! P6 p4 ]0 p- C6 @6 ~' V& @3 b" ^- G8 R! G0 o
| | 6 j6 r0 h, k3 O- a# A$ K6 _
GAMS模型 |
. S: _1 X% X7 y5 a- a同样的模型在GAMS中建模.简练的代数描述使得模型高度紧凑,并带有逻辑结构.内部的文档,比如对参数的解释和测量的单位,使得模型很容易读懂.
@" \8 }% \7 z2 b
集合(Sets)
- k# L! J. z" b$ Q+ B. W8 T
1 q. }+ K- u0 {" A
GAMS让您以直接的方式指定指标:声明和命名集合(这里是I和J),并列举它们的元素.
& ~9 ~/ o& J! s" F( w
参数
- b- I" X$ w) Z+ \1 B

$ s7 ?+ H) Q" N+ Q# g! U
这里的数据输入被作为指标参数A(I)和B(J),值简单的被列出.
* i8 k" X1 C) |! m% [/ I* t4 x; C
GAMS让您可以在模型的任意位置放置解释性文本(以小写格式显示),当您在开发它时.您的注释自动被结合到输出报告中的合适位置.
' G) o% ]! G( B) [2 ^3 P
表格
8 r/ b a7 q4 v$ \" [

数据同样能够以方便的表格形式输入.GAMS让您以数据的基本形式来输入数据-转换是特定的代数化的.
8 n5 ]8 j5 }0 o$ N5 G标量(Scalar)
& v" U7 R- F7 `( B
常量能够被声明为标量,它的值是指定的. , |' C! l' z: L7 l
数据处理
' f& W7 P# c3 w9 E3 X6 O
8 u* L( j2 _9 }6 m+ o& D2 h
当数据值要被计算前,您首先要声明参数(比如,给它一个符号,随意给它编个指标),然后给它一个代数公式.GAMS将自动进行计算.
9 e9 Y1 \4 n" C2 J
变量
. n; p$ C! ~ U* ^

% M& }8 T/ q: x, y
决策变量以代数的方式表达,带有特定的指标.从这种常见的形式,GAMS在域中生成变量的每个实例.
f) c' ^' L: Q3 _- [变量可以被指定为下列类型:任意(FREE),正值(POSITIVE),负值(NEGATIVE),二元(BINARY),或者整数(INTEGER).默认是任意(FREE).
6 v; a* `5 I# y% |+ E2 p目标变量(这里是z)仅被声明,没有指标(index).
( H R: i" w; k7 t
方程式
% w. P+ K% b1 j0 Y6 S: Q1 }6 n9 f
' j- j, A5 B5 W) K/ C) V目标函数和约束方程式首先被通过指定名字来声明.然后它们的概括的算术公式被声明.GAMS现在已经有了足够的信息(从上面的数据输入和从在方程式中指定的算术关系)来自动生成每个单独的约束声明-就像您能在下面的输出报告中看到的.
. y0 O2 T; D1 [5 ]% l' \
=E=表示'equal to' (等于)
=L=表示 'less than or equal to' (小于或等于)
=G=表示'greater than or equal to' (大于或等于)
1 P# k/ H- ~* `/ V' h模型声明
) ~8 m& X& i& j

& A$ V& ?3 T9 X5 r( m* A! n
模型被指定了一个唯一的名字(这里是TRANSPORT),模型缔造者指定那个方程式应该被包含到这个特别的公式中.在这里我们指定了ALL,也就是说所有的方程式都是模型的一部分.就等于是MODEL TRANSPORT /COST, SUPPLY, DEMAND/ . 这个方程式选择使您能够在单个的GAMS输入文件中以公式表达不同的模型,基于相同或不同的给定数据.
1 ?6 S2 a7 I e& C% c9 F% l; s求解声明
! z! o/ H: r i2 |) x" r2 n
+ s! G4 v4 z& u2 i/ y: H+ I求解声明(1)告诉GAMS那个模型要被求解,(2)选择要使用的求解器(在这里是LP求解器),(3)表明优化方向,或者是求最小值,或者是求最大值.(4)指定目标变量.
: r3 ?- W! c7 z9 M
7 w: r& l& D6 ]. s! V. d3 X- K5 ]8 G ]
" V; R% s3 \' e! g1 U
| | 3 i0 C5 }& e' X- f& s: A1 B9 ~
GAMS输出报告(部分摘录) |
8 m6 K' R, O8 ?5 S- z0 A( P, y
完整的GAMS输出报告比下面列出的部分摘录详细的多,包含了更多的帮助用于解释和诊断您的模型.甚至您能够修改输出格式来符合您的特定的需要.
2 q1 a# d: g' _' X方程式列表
" T/ y2 G, [& N4 S
1 p0 G# s6 Z3 e, g方程式列表显示从在GAMS输入中指定的分区(block)生成的单独的约束.在GAMS中使用者可以以一种非常紧凑的形式写下被索引的方程式分区(block),这将产生大量的单个方程式.在我们的示例中,我们指定了3个方程式分区,生成了6个单独的方程式.
# @* z' I5 l3 N; J列列表
8 e* l3 T2 t) }+ A6 Q' A @
' u, o2 N" h- ^; k: S3 T$ Q- P! j
列列表提供信息到生成的单独的变量上.变量X(I,J)扩展出6个单独的变量.当许多变量从一个分区中被生成,默认的列表只显示最初的3个(用户可以修改).
. E1 k4 `* _& e4 D% |
% X: M- }+ l6 }8 m7 N
/ B! ^3 E3 J" B: }$ k: k* F, k% Q" _
| | - U1 K8 |) x P+ @
求解信息 |
! B. u: ~+ S) c3 P N$ [0 r
$ l9 [' z9 S/ v' r- g3 H求解声明将生成模型(单个方程式和对应到特定模型的变量的产物).首先一些关于生成的模型的统计表将会被显示:方程式数,变量和非零元素.
5 n- @8 w) Z( S k) J. _在求解汇总信息部分,我们看到BDMLP被调用来求解这个模型.BDMLP经过4次反复,耗时0.18秒找到了这个问题的最优解.求解信息下列的消息来自求解器.
. j: E) p E) t: k: H( [解(Solution)
8 P( O/ K1 e+ ?- u: d

9 e- d% R7 K" W4 v$ A3 O
解被显示在这里.边际值(marginals)对应方程式的重复和变量减少的花费.
+ X# ~7 M+ y8 w1 Y, I( J: r
写工具不需要学习一门其它的语言.在GAMS所有的数据处理,模型定义和报告编写都是在一个单独的环境中完成的.
& P4 K4 H3 h9 r1 M4 @/ t% w Y% c2 `" Y6 {
0 J! i3 B# B& E @: u; J' M# J. e& H8 q: m4 h
| | - |0 ~" _& e( y8 b, D! @
参考 |
& t; f4 Q, i' |& j- RDantzig 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
呵呵 这个例子做入门非常不错啊 支持一下 辛苦版主了 7 p. r6 w: ]9 w D+ \( I4 l
作者: gaoshanliu水 时间: 2010-12-20 09:56
辛苦版主啊
0 F) V0 o# P+ q8 X8 A( s# k; U
6 n' x3 S3 p! w4 B6 b* M+ w$ N$ Q+ T. r V/ [4 @5 |
作者: 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 `( b) R" B i1 G' q5 i# L
帖子很好啊,入门很好啊。
0 I* X4 ^0 V, N( |; ~; Z7 K
你的时间怎么是明天呢?
作者: 邓浩考研 时间: 2012-12-10 10:08
wsq200808 发表于 2012-12-9 22:55
+ p8 o7 g/ G+ p2 g2 d6 |1 e
你的时间怎么是明天呢?
1 k% _5 z/ e* u6 f
我是外星人。。。嘎嘎嘎
作者: 他山石 时间: 2013-7-30 09:03
版主辛苦了!
作者: 鸣凤123 时间: 2015-8-14 08:24
楼主的帖子很不错,我很喜欢3 J" {0 v; k9 ]6 S; Y& @# J
作者: LYJA 时间: 2015-10-13 07:31
very good, thank you very much!0 s* T4 Y) ^) P" t( B/ C/ j
作者: xiangbeihai 时间: 2017-3-1 21:23
不错,已收藏
& H& r5 n! \# s+ z: c0 d
作者: 板砖sy 时间: 2017-3-10 10:20
入门看这个就足够了,但是一旦独立进行编程的话,会出现很多bug,还有错误代码,都不知道什么意思,大神有没有解决这些问题的方法,辛苦了
- q- O) u+ [, V: n' x7 l$ S, Q
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |