数学建模社区-数学中国

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

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

GAMS示例

, ?7 E, S2 [/ j+ N% ]0 v' L2 Y

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

' I! J% a8 [) z" a) B* Z7 v4 P3 s8 b a' J: o, {. h2 e- X2 X8 g2 n* s U' R) D! L+ i9 L; ?% l4 q6 _& T: Z8 u0 w9 z% O
   代数描述
% O, i/ x2 W5 Z# q

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

% m2 t) x; j) Q7 k

指标:

) b; z# t; Q3 B: l# y2 z

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

+ ?! {! [7 }# ]

给定的数据:

$ P' X4 K1 n: e' @ c/ t9 ]

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

+ k3 C& b1 U y( W* ~9 x % B2 | Y; q9 ?/ N5 i" x8 I8 Q/ j/ f. F1 A" i& k/ Z# P8 q. G- t. b5 G5 Y5 l# ^5 S( B0 n# ~0 B5 u2 H! U9 ]/ F7 F+ b+ ]% d' I8 B/ ]7 j" Y. _" z5 L! q& @& q/ }5 R, a- [% |& I4 a* k2 J l+ N5 V7 c) ?+ d6 N1 h. R! {$ x( V' t A) T" R- E8 a* r* b9 G8 N2 D* }8 n9 \ @) S3 |! o) T- n# E1 `0 K$ k! W5 A- V: n3 p1 x' r" N/ c( x6 L& k) n! O* N9 J$ |+ B8 L6 G1 p- f9 ` W1 I% U9 O9 H( a5 Y1 ]: v0 H$ R" ~8 L, F: O/ q* ^* X, J# z/ I; \, E" g' e3 y" I" C0 I/ H) l- ~8 A7 w+ Y2 j0 f5 ]' C9 g! I1 a; N' Z" t% d* r# |/ H$ {; U. j- W4 L( j, ]- D5 k5 B7 M7 ~1 ?$ O2 y/ G1 r1 @. F4 ]9 d0 d; m4 s, y* G8 a* Y9 ^) ~( ?3 N, P7 J) v4 R" x4 |, c9 Z" q7 I# b+ ^8 m1 n$ M# q1 R% l& H& @# [7 \+ C; f7 h: W$ S" J$ j0 A# J$ S' m9 C* ~5 C k1 @3 _+ f S$ \+ e
距离  
  市场  
工厂 New York Chicago Topeka 供应量
Seattle 2.5 1.7 1.8 350
San Diego 2.5 1.8 1.4 600
需求量 325 300 275  
) Q B2 j6 M2 T( F2 Y5 N9 U% k

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

/ N- ~; X) z4 a j* t! B9 u- |

决策变量:

1 B" _: F9 `* w( c, L$ ]- i$ B

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

% d) p$ d+ B; b3 |5 R* t

约束:

8 q }$ N) r/ m- m

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

4 {5 L; }. _# h8 ?

目标函数:

1 i/ Q. V* B4 u3 O0 k6 M) n$ k

Minimize (千元)

( Z$ Q: t4 T. g+ M9 Z$ l- Z % L9 y, ]! t# m% K: y- {- w5 q; h" f' G% ~7 ^0 i2 O3 [" t7 g u9 T5 l$ l) v3 C+ K' G; y! H- J
   GAMS模型
( V" Q1 h! c+ x9 {6 ]: F8 f

同样的模型在GAMS中建模.简练的代数描述使得模型高度紧凑,并带有逻辑结构.内部的文档,比如对参数的解释和测量的单位,使得模型很容易读懂.
" w5 i, b% i% h( Z' y: B- n/ v

集合(Sets)

( _1 `- H5 q) h6 \

* x: O U& _" x- u1 M

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

5 g7 |0 \6 H8 \/ x( V9 ~4 J4 V* }

参数

7 k! Q# \% ?4 n; M; W3 ^$ O- r: L

/ _: F7 ~7 o2 S% q

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

7 |) ^* L$ F' C9 K( q/ @4 {: V3 Y

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

0 d$ q& w, s$ k9 m) t

表格

; e6 p5 F9 f) K, ?$ p: r


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

/ t9 p3 w. W4 K, n* w4 {: H7 y' U

标量(Scalar)

( i w. J) g# i) W


常量能够被声明为标量,它的值是指定的. , M& l2 b; U6 ~: v6 `" `

数据处理

3 U& u2 j1 [, b! e+ E: {: v) t) S: a7 Q

$ l4 m# }( {1 d! Q1 {" W

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

* Z& E7 [) x" t( T

变量

/ `$ N5 m3 D) A! i) x' a, q

; @4 ^! j2 b) r3 S

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

. \, p4 M. m: P3 s& K8 C

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

' [) L, a2 }5 t7 S2 Y

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

+ l5 f/ r6 _6 P

方程式

8 L' c" f4 m+ q! I+ O, B# c. x! U% \

" k% w8 Z: a9 A" m+ e7 z, ?

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

- }. y8 t5 Y0 k1 v7 R; v

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

u6 K2 B+ n1 O: t) R

模型声明

% |2 U7 q+ c: a! Z

* o( I: o7 G) c' o a- Z. b o: {4 y

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

2 ^, h- s7 X: @% _# ?7 `

求解声明

5 x- b; ~: x* s8 r& T

' _% k9 M; j& G- S2 s) Q

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

0 h# O/ A, a4 \9 e7 s. N4 C4 T! V; ?# f+ S( S1 A0 X3 m- J$ J q- c) [6 z% z$ J& K4 s- U: c& ?- q! p' N# _- E+ K/ N* h% l% x6 y3 b
   GAMS输出报告(部分摘录)
7 b7 X+ b0 _/ a" Q

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

3 I. R( g+ c% p5 V! ~' }3 \0 i( e

方程式列表

: x$ m+ h" d" x/ |

4 l1 J: s8 U$ w: W

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

: b+ K- ^, d" T& `

列列表

2 p9 ^& |0 L9 Z9 b* e

) P9 K; O) l! h2 g- e

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

! d2 b8 U1 T% @/ H( s( {. e- j: w r6 C& p, |9 F$ b% _4 g9 Z0 R4 Y' P$ D/ _2 w% h$ F* f! ~+ N% Y& H% N) s; K3 `3 r, J" v
   求解信息
u" k/ C5 l" B' ^8 z1 Y7 E

- z% F W9 m$ Y

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

- K6 v+ H/ ?' Y' a2 i

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

8 {- R0 F& w& f2 b- {

解(Solution)

2 N/ B0 g1 |, B$ Z

3 t$ `1 q9 b# E# N8 t' t

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

6 s1 x3 m9 @( B- Z; y6 V' V

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

8 m% C3 K, Z5 @$ R0 Z 3 w" N) [$ K" x9 o6 g# {$ Z9 M5 v# c6 J4 k- s" j) A% f5 F) B5 N) T, E, z# @' c# \6 a8 T, Q; g" n, Y: a
   参考
! g9 d# O/ m, h6 v% o) W

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
呵呵 这个例子做入门非常不错啊 支持一下 辛苦版主了
, x9 I- Z- w$ O* W. k1 W  M
作者: gaoshanliu水    时间: 2010-12-20 09:56
辛苦版主啊
+ y* L/ y6 j. R- [8 v' ?* r. d# {; F' S

* N% C/ _8 R3 E4 e   
作者: 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
) e/ V0 E/ {: a9 K5 M  f帖子很好啊,入门很好啊。
! [0 |/ H/ X% P0 a. {
你的时间怎么是明天呢?
作者: 邓浩考研    时间: 2012-12-10 10:08
wsq200808 发表于 2012-12-9 22:55
- h" h4 Z9 d1 \你的时间怎么是明天呢?
# C( D+ W9 u. D! v$ f0 Q
我是外星人。。。嘎嘎嘎
作者: 他山石    时间: 2013-7-30 09:03
版主辛苦了!
作者: 鸣凤123    时间: 2015-8-14 08:24
楼主的帖子很不错,我很喜欢. C! O2 w/ j2 }6 O3 Y2 ~9 W" k

作者: LYJA    时间: 2015-10-13 07:31
very good, thank you very much!. N3 `! L* B' N8 d0 b+ R5 ]

作者: xiangbeihai    时间: 2017-3-1 21:23
不错,已收藏& b' g6 ?+ @. e  A8 a$ X

作者: 板砖sy    时间: 2017-3-10 10:20
入门看这个就足够了,但是一旦独立进行编程的话,会出现很多bug,还有错误代码,都不知道什么意思,大神有没有解决这些问题的方法,辛苦了: _* f; M+ g  q





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