数学建模社区-数学中国

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

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

GAMS示例

3 Y- N' h8 c+ @+ A; b

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

9 |% r, g9 [ C% X5 R, |( ]/ A9 k: S, m5 i; r# Z/ a# X3 O, _( U C* ~0 u' M$ U& U, e5 b) [2 Q) p! a" @' a1 Q3 W i. E4 s3 ]& _- f
   代数描述
/ s9 _) W" B$ O1 Y+ P- O3 Z: U

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

, m5 _+ n: |6 J# w& ?$ I5 b: }- d

指标:

3 X, C0 _% b6 q

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

K: ^8 Y" G2 n/ A8 D/ J: u" y0 D

给定的数据:

, ^2 t5 X1 a: ?# p5 F/ `' t+ W

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

+ X( E: q% H+ N1 A# I+ c" V# V 7 Y; W# b2 Y- l) `! B& f6 l/ L5 z* e/ z, e' {. u4 v0 N4 v# B2 n) ^6 t' f1 `/ G1 t" ?( ]2 N' r9 j0 x' k( J- d! J3 r- d( L) N; D0 Z, u1 J6 V. m* V) q2 y7 h$ v/ P& N3 C! a v) |' c0 ~ [( b; C; ^" N6 Q/ R0 `& m! j* l# v1 B: F+ i3 L2 V* y- K* V( x2 J% i/ Y* R! j+ u4 G$ ~( m0 ]- g: @9 v) I7 M! P( f- c8 j; l3 [# k3 h: z$ }# E9 h" V- ^1 S F, J: }% O9 A6 L% A* y9 j: g1 J+ k( Z% C4 X* q( p) K0 k+ [7 ~0 X& p8 X/ g% w) `' r" g' b& ] o* k* L! O6 t+ t) ]3 A, F/ [- k" L! h( Q' D& o0 l& T. ?; a5 N7 r+ Y8 q) a/ D5 G: w" Q5 u+ C5 s6 M/ c1 x. \ R5 I- X" M3 U" M! _; M( [0 P$ _0 a7 j' L' _% g# j3 _* F$ \- V$ x1 `/ w* B: V& v3 _8 x' R/ o/ e" x% o4 X) s0 W; k( ~# g$ F( ?! _% c: \; W2 Y+ q/ |3 R/ x% m0 m) V) L2 n' G1 H% O) X8 d- Y8 X. f1 g. y9 |% @
距离  
  市场  
工厂 New York Chicago Topeka 供应量
Seattle 2.5 1.7 1.8 350
San Diego 2.5 1.8 1.4 600
需求量 325 300 275  
" w; _. i# i& t" E

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

( G$ q( j8 t# c; f ^5 r9 m

决策变量:

$ X4 ]# |4 h/ y0 h2 i" `

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

: C% h/ [) S6 ^7 o

约束:

! Z0 C, C( O; |. |2 P j" s

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

" ~. w. d, i0 j

目标函数:

/ J, B! D# ?1 h W d) S6 u# I

Minimize (千元)

# U8 r( h( n4 i. `6 T& i; Q$ ~0 J+ J2 W2 m* x/ J) Q0 M$ I$ o6 T* `$ T! r' v% E+ C5 q" D! y- r' U0 R( ]7 Q" S2 t/ i% Y/ K9 T- c
   GAMS模型
( q3 l( H4 Z, x; Q' f/ x5 O

同样的模型在GAMS中建模.简练的代数描述使得模型高度紧凑,并带有逻辑结构.内部的文档,比如对参数的解释和测量的单位,使得模型很容易读懂.
5 i0 q/ u% o; J6 K. L' q( m

集合(Sets)

" O( l0 B9 N0 B" ?7 f) U

9 ^/ ? F0 }& A$ {& J

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

. U8 N p& o$ c

参数

& b6 z: r6 |4 T- ^& P

1 I' S# E1 u1 j! S* o( g- J

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

; D Q7 w5 s; ]8 {+ W9 a; S

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

- T$ f8 D8 ?0 k. Z; d, h

表格

0 @* b$ j& ~1 }3 H; \, J2 T


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

4 t h; B# F. F) `

标量(Scalar)

4 h" p5 p2 f, i9 I% Y3 G2 y% ^/ ^


常量能够被声明为标量,它的值是指定的. & C7 o) Q u m) h1 f# r, y' D. }

数据处理

. x/ o- N9 K, S) G# Q6 L" e4 Q

: W$ _' Q9 I$ |+ b, ? j

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

% F2 q1 b( s/ e5 q4 U* \

变量

6 _4 a' [/ H; s2 J/ G- G$ J8 o

, J& q9 E5 @) `7 H5 Y

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

& @8 V4 [! W) v) \

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

; _5 x- H( ?6 O* ` C

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

# v* q) f/ b2 o' X

方程式

$ J/ ]- K8 f$ r) X

4 h0 ^6 w1 n& S$ v$ I* E

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

3 u- E7 a, t; ?& P! H& T4 W

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

3 e6 H& j/ t' R8 h+ \

模型声明

7 H8 h1 t9 R' F9 g- m

/ M7 X) `0 N* ~) A# ^2 z

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

6 ^0 u1 A6 I# k- R5 n m( C; Q! w0 {. }

求解声明

1 q( F" `9 J9 G( F) h$ B' l2 X

) h2 g# i9 k+ k4 U$ M- g! w

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

$ f# W4 K8 M' U7 n2 g" t+ P/ f# Y2 X; J) f. t# p/ v; V* n% k3 H) ]& _+ W) ?% Q A) p2 y! P7 J; _% v; I* ]" Z
   GAMS输出报告(部分摘录)
( k& U' z! q& p$ j j8 Z- L

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

! Y* E3 h7 X9 Y3 y1 T; J

方程式列表

0 D7 \2 E' D' j" z% }' t

$ s) R' B8 v! v0 q& W* \) T2 R

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

' v6 g5 r8 C6 {- [* |: O

列列表

' J4 d4 `$ E) g0 p2 x

9 ?) g D; k: Z- Y* W

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

& d- a" _1 u' k O* S p* u) T/ _( B: _( d( S$ K q( A; O- v- ? u5 F- w& k; e# ?% u- { Y# j& x, N6 y8 Q4 D% `/ u: H$ j" [' `0 ^7 E: a# [, P
   求解信息
9 }0 d- Y0 W/ b1 n7 t) [8 R

* t" g" Y2 _; b# E

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

' F; [* R4 _* A/ M0 I0 Z, j' H

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

; A8 k) Y+ g8 \

解(Solution)

$ z! W9 w0 U! r/ z' P% o4 S1 ?

_& T+ B1 \6 Y A& L& I

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

" }" w3 Y( j7 f( l Y, N

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

* z9 w0 V3 ?6 Q1 C$ ~6 n! e5 \& N) ]. s8 x0 L- s4 f: V/ }7 X3 `/ d7 h) n( s* H% d5 T8 H- { F* X& S6 Y( j- u" M
   参考
6 ~' b" f7 H' H( |6 j

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
呵呵 这个例子做入门非常不错啊 支持一下 辛苦版主了
7 v' j8 j* J$ G% e( t
作者: gaoshanliu水    时间: 2010-12-20 09:56
辛苦版主啊
) _1 n1 k& P& q: L5 ?8 G2 ]" ]0 e2 b) x/ y0 O7 _$ {
- a; g9 y1 H3 q% U* y* w5 W+ A' T
   
作者: 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
1 d3 ~( A, E* i" n帖子很好啊,入门很好啊。
* W: r7 {( e9 V. t4 {
你的时间怎么是明天呢?
作者: 邓浩考研    时间: 2012-12-10 10:08
wsq200808 发表于 2012-12-9 22:55
6 F: S3 d+ Y- J- u. X你的时间怎么是明天呢?

8 q/ L) z% X  m# o3 E我是外星人。。。嘎嘎嘎
作者: 他山石    时间: 2013-7-30 09:03
版主辛苦了!
作者: 鸣凤123    时间: 2015-8-14 08:24
楼主的帖子很不错,我很喜欢
( I% P9 B" R5 {; b  o- M
作者: LYJA    时间: 2015-10-13 07:31
very good, thank you very much!
8 A8 [+ V9 b- ~9 }( @# g
作者: xiangbeihai    时间: 2017-3-1 21:23
不错,已收藏) S5 g% K/ V& r) C! ^& M& q3 c

作者: 板砖sy    时间: 2017-3-10 10:20
入门看这个就足够了,但是一旦独立进行编程的话,会出现很多bug,还有错误代码,都不知道什么意思,大神有没有解决这些问题的方法,辛苦了
$ t( A8 s; ^6 Q/ S& Q% m




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