首页 GAMS 使用心得+经验+技巧+实例(中文版)

GAMS 使用心得+经验+技巧+实例(中文版)

举报
开通vip

GAMS 使用心得+经验+技巧+实例(中文版) GAMS 使用经验和技巧 能看到这篇文字的同学,恐怕大多数是在灯下苦读的学子。实际上学习某种 工具并不重要。真正要学习的是知识,是思维的方法。就像很多计算机系的学生 一样,把数据结构和算法精通了,任何工具都是一样的。所以,你用 GAMS 或者 不用 GAMS,都没有关系,要把握事物的本质,最关键的东西抓住了,任何语言 就是一种输入法。另外,学习一定要有兴趣,要认识到他的 beauty,不要把什 么都换算**民币,那样你会觉得很累。 GAMS 编程简单的说就是不很多相关的约束和目标函数组合到一起,然后调用不 同...

GAMS 使用心得+经验+技巧+实例(中文版)
GAMS 使用经验和技巧 能看到这篇文字的同学,恐怕大多数是在灯下苦读的学子。实际上学习某种 工具并不重要。真正要学习的是知识,是思维的方法。就像很多计算机系的学生 一样,把数据结构和算法精通了,任何工具都是一样的。所以,你用 GAMS 或者 不用 GAMS,都没有关系,要把握事物的本质,最关键的东西抓住了,任何语言 就是一种输入法。另外,学习一定要有兴趣,要认识到他的 beauty,不要把什 么都换算**民币,那样你会觉得很累。 GAMS 编程简单的说就是不很多相关的约束和目标函数组合到一起,然后调用不 同类型的 solver 来解决。 说到这里,大家对 GAMS 只能有一个大概的了解。我觉得写 GAMS code 并不难, 难的只有两点: 1.定义你的模型。要选取最 efficient 的方法 2.定义好你的 set。模型里面所有的东西都和它有关,正所谓牵一发动全身。; v) Q s7 k8 d* v( F7 ` 其他都是水到渠成。 0 d* Z, U9 c' v3 8 F$ U D* R0 `/ N) F8 S0 G 第一章,基本概况 GAMS 是一种非常简单易学的运筹学建模语言 (www.gams.com),是由 WORLD BANK 开发的。由于近几十年计算机软硬件的的高速发展,世界银行决定投资开发 GAMS, 来提供:, c, d" w% H7 T B 1. 建立复杂模型的高级语言- h( {. y+ X, e$ z2 D 2. 简单易学 6 u# P% T: X* U2 J% z 3. 强大的描述代数及逻辑关系/ X# @' K9 [3 [# z! z. w7 {$ n 4. 模型可以独立于算法系统 9 T! t6 z A) V! { GAMS 可以让使用者专心致力于模型的建立而省略了解法方面的考虑因为 GAMS 包含了解决通用的 LP,NLP,MILP,MINLP 等各类模型所需要的 solver. 另外, GAMS 提供了和外界进行交互的输入输出借口。使得用户很方便的导入导出 data。 % ^$ X% j% E1 Z( a+ J 下面当然是 tutorial 了,就想学习任何一种编程语言一样,最开始都要学习输 出 hello world. 我们这里当然要复杂一点了,举一个最简单的例子,运输问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 . 这是一个经典的 LP问题(不用解释什么是 LP吧,呵呵): t5 T7 `& p2 O; h2 b+ X+ e7 i 用点英语,呵呵,) x8 P( N# }/ r+ a In the familiar transportation problem, we are given the supplies at several plants and the demands at several markets for a single commodity, and we are given the unit costs of shipping the commodity from plants to markets. The economic question is: how much shipment should there be between each plant and each market so as to minimize total transport cost?& W- a4 h! A. M) t 就是说,我们已知有一些工厂,生产出的产品要运往一些市场来满足他们的需求, 每一个工厂的生产能力(每个工厂能提供产品的数量)以及每个市场的需求(每 个市场需要产品的数量)是已知的。另外,我们还知道从特定的工厂到特定的市 场,运输一件产品的运费。那么我们怎么样设计从每个工厂到每个市场运送货物 的数量,使得总运费最小? Indices:( |! R; Q" Z( Y- V& J) Q$ a i = plants j = markets Given Data: ai = supply of commodity of plant i (in cases)& ~: g8 s: _. H' U1 z bj = demand for commodity at market j (cases) cij = cost per unit shipment between plant i and market j ($/case) Decision Variables:/ M9 v A+ J' Y8 b. j Xij = amount of commodity to ship from plant i to market j 在这里唯一的连续变量是 Xi,j, 模型就不用我说了吧。。。。# ?. [$ X# f, W( D( t4 y ( c$ o& f0 V! R- H; T 这是一个典型的线性规划问题,他的 GAMS code is 7 E5 v! U) i7 r; \" J% p4 {! V Sets! Q) d- O& t- s8 I n i canning plants / seattle, san-diego / j markets / new-york, chicago, topeka / ; Parameters P! W1 G4 p" Z {* ~' X a(i) capacity of plant i in cases / seattle 350 san-diego 600 / b(j) demand at market j in cases / new-york 325 chicago 300' M& r! T5 W8 l+ R3 w topeka 275 / ; Table d(i,j) distance in thousands of miles new-york chicago topeka seattle 2.5 1.7 1.8$ `# {1 y) F; `- H; S san-diego 2.5 1.8 1.4 ; Scalar f freight in dollars per case per thousand miles /90/ ;8 m# D1 K0 h( ~! e+ \ Parameter c(i,j) transport cost in thousands of dollars per case ; c(i,j) = f * d(i,j) / 1000 ; Variables" k$ \% |& D1 i7 M1 ~+ H% B7 }, I x(i,j) shipment quantities in cases z total transportation costs in thousands of dollars ; Positive Variable x ; Equations cost define objective function supply(i) observe supply limit at plant i demand(j) satisfy demand at market j ; cost .. z =e= sum((i,j), c(i,j)*x(i,j)) ;8 L5 t: B; ^$ Y8 Y A supply(i) .. sum(j, x(i,j)) =l= a(i) ;# X$ [) M2 t) f: P, u8 w! {4 | demand(j) .. sum(i, x(i,j)) =g= b(j) ; Model transport /all/ ; Solve transport using lp minimizing z ;. C6 p9 }0 e P4 [* | Display x.l, x.m ; 这是一个非常典型的 LP(linear programming)问题,所有的变量和约束都是线 性相关的。 其实上面的 LP例子虽然很简单,从 GAMS 的角度已经勾勒出大致的轮廓了。首先, 我一般把 GAMS 模型分割成两部分。数据和模型,在 gams 里面最好要把数据和模 型最大程度的分割开来。具体的建模的经验已后再详细论述。 首先,我们看到的是数据中最抽象得部分:set.set 是模型中最最基本的部分。 通常我们用 i,j 来表示。例如,时间的维度可以用 set t /t1*t10/来表示,当 然还可以有更加具体的形式:/1990*2008/。这里面当然代表的不是数字而是 string 了。 parameters 是和 set 紧密相连的已知的 Data。基本上很容易理解。可以用 A(i,j)来表示一个已知矩阵 data 的每一个元素。 variables 当然有很多种了,在这里都是连续变量。可以先定义(所有变量都要 先定义后使用)成 variable x(i,j)再约束:positive variables x. 上一部分除了 variables 之外的都是属于 data 的部分。这里说的好像有点啰嗦, 我反复给大家灌输一个思想:数据和模型要尽量的分开,数据只不过是输入,模 型是 engine。) {, }: V4 [- R 变量有很多种,可以根据自己模型的需要定义。binary variables 非常的重要, 在模型里面主要是作为决策变量的。interger variables 实际上可以用 binary 变量来表示。 模型的主体实际上就是一系列约束的组合。你可以定义很多约束条件,也可以定 义很多 objective function。然后根据自己的需要组合成不同的模型。所以 GAMS 编程简单的说就是不很多相关的约束和目标函数组合到一起,然后调用不同类型 的 solver 来解决。 说到这里,大家对 GAMS 只能有一个大概的了解。我觉得写 GAMS code 并不难, 难的只有两点: 1.定义你的模型。要选取最 efficient 的方法 2.定义好你的 set。模型里面所有的东西都和它有关,正所谓牵一发动全身。; v) Q s7 k8 d* v( F7 ` 其他都是水到渠成。 先从 set 开始。 Set 有很多的用法可以定义。最常见的形式就是:set t /Jan,Feb,Mar/ 这里最好不要用简单的,i,j 来表示,或者如果想和自己的模型一致的话,可以 把 general symbol 写成 i,j,t 的形式然后把每一个 elemement 写成具体的。 每一个 set 还可以有自己的 alias。也就是别名。因为很多时候还要建立很多二 元操作。可以这样写:alias(c,cp,cpp,cppp); 定义 subset: set set01(set02): set01 是 set02 的 subset1 N8 q+ t1 k3 c8 b 高维度 set:主要是定义 mapping:mapping(i,j)/i1.j1,i2.j2/如果在模型里面 要定义某种特定的操作,可以先在 set 里面定义。 (a,b).c.d a.c.d, b.c.d (a,b).(c,d) .e a.c.e, b.c.e, a.d.e, b.d.e (a.1*3).c (a.1, a.2, a.3).c or a.1.c, a.2.c, a.3.c 1*3. 1*3. 1*3 1.1.1, 1.1.2, 1.1.3, ..., 3.3.3# D6 H5 t6 l3 A set 的 domain 可以用 card(i)来表示,顺序可以用 ord(i)来表示。这两个操作在 模型里面非常的重要,很多复杂的集合操作都是建立在这两个基础上的。 下次开始讲 data6 F2 U s+ _, x7 Q' w# l; {. c }- ~ 顺便说一句,微软已经开发一个 solver foundation 来抗衡象 GAMS 这样的工具。 你可以在 excel 里面建模。非常的简单。 今天讲讲 Data。 在 GAMS 里面 Data 无非就是你所已知的数据。主要有 scalar, parameters,tables。 在 GAMS 里面没有像 java 一样的 private,public and protected 变量的分别。 可以说所有的变量都是全局的。( I( y0 j" y5 V$ r- ~& m# W scalar item1name optional explanatory text /numerical value/; Parameter 6 n* u2 R4 L3 q data (i,j,k) / i1.j1.k1 10 , i2.j1.k2 90 /; Table RESOURUSE(RESOURCE,PROCESS) RESOURCE USAGE Makechair Maketable Makelamp 4 r( t& V- i6 e: f plantcap 3 2 1.1 salecontrct 1 1 ;& S6 }* o/ r7 [) g; [9 C* ~ 这里没什么可以讲的,就是注意把table的行和列分清楚就可以了。 在这里其实我语言方面讲的很少,觉得有 gams 的手册,大家都可以慢慢得理解。 但是我反复说明一个观点,数据和模型的形式一定要尽量的 general。在建立模 型的时候一定要考虑到以后模型的地扩展性。在修改数据的时候,要尽量只修改 数据的部分。各个模块要尽量的独立。刚刚开始很多人没有引起相应的重视。模 型越来越复杂,到后来只好推倒重来了。 最好的办法,是把数据完全和模型分离开来。可以写成 txt 文件放到 gams 里的 classpath 里面,在模型的源代码里面引用。(include....)这样,修改好数据 后,只要修改相应的 include file 就可以了。, L7 k2 y m8 `1 o+ Y+ D 在模型里面,可以包含变量的声明和定义和初始化。但是经常改变的变量最好放 到 data.txt 里面。 下面讲一下变量:Variable 变量是组成模型的最基本的元素。最好是先声明 declare 变量,再进行初始化。 % h& p' [1 Z9 y5 K- h9 {+ G7 l c! v 任何不加以约束的变量可以写成 variables 或者是 free variables。 另外还可以因需要定义:positive, nonnegative, negative, binary and integer 变量。 这里需要提醒的是 binary variable,只能有 0,1两个值。通常用来做决策的。 $ U$ ]$ @8 [+ t( \. z 还有 integer variable 的默认范围是从 0到 100。改动它的上下限已后会详细 介绍。 其实,整数变量可以由 01变量通过线性组合得到。这里就不介绍了。7 q1 W5 j$ V- y0 F4 Q# s+ C 另外,gams 还支持另外两个特殊变量:6 A1 Y. X# M/ K# R6 n SOS1 和 SOS2 变量。SOS1 变量值在一组变量里面,只有一个变量可以是非零的。 但不一定是 1。& G0 l2 ]0 B) G2 m SOS2 指一组变量里面,只有两个相邻的变量是非零的。 这两个变量在比较高级的 MILP 模型中会遇到。1 c* q" `8 R1 G+ k; U5 S3 J+ C$ r F 变量声明方法示例: Variables/ D8 U8 G2 T3 T) z" R( I0 E: [9 g' U: m Tcost 'Total Cost Of Shipping- All Routes'; Binary Variables Build(Warehouse) Warehouse Construction Variables; Positive Variables Shipsw(Supplyl,Warehouse) Shipment to warehouse 5 t, z5 p- z" ]- h0 u% ` Shipwm(Warehouse,Market) Shipment from Warehouse Nonnegative Variables Shipsm(Supplyl,Market) Direct ship to Demand; Semicont Variables( D! k! |1 f2 ?( @( q; ]" e! z X,y,z; 下面说说变量的 attributes。 对于变量通常会有很多的约束条件,我们可以把它们写到 Equations 里面。但是 变量的很多 attributes 可以对变量进行很多的简单的操作以免让 equations 的 部分看起来过于繁杂。 另外,在建立模型的时候,要设计某些算法,在算法执行的过程当中,不能嵌入 equation。所以,要用到很多变量 attributes 的操作。 其实, equations 表示的是一种关系,而对于变量的 Attribute 操作实际上是 一种赋值的操作。, j; _; x4 ~/ U* n+ |9 V( q* { 以变量 X为例, 2 g& ?, O+ o7 r$ c4 r8 { x.lo=10000;设置变量下限。: ~# F8 c: s( w8 C2 ]! D % g5 J4 |6 m1 H4 t" @$ x x.up=20000;设置变量上限。) W4 K- c7 k5 m: y: k9 e# u* M x.fx=0;固定变量的值。 下面说说 equation 的写法。和变量的声明一样,equations 也一定要声明后再 定义。具体写法: ! Z: j A, X% H( I* X- _9 f Equations3 l) e4 w j/ G6 k! }* P( F supply(i) observe supply limit at plant i demand(j) satisfy demand at market j ;. G. W$ D' A+ N, U1 b cost .. z =e= sum((i,j), c(i,j)*x(i,j)) ;' O2 L d( h |: m supply(i) .. sum(j, x(i,j)) =l= a(i) ;! S: p6 \: {6 I7 T* Y demand(j) .. sum(i, x(i,j)) =g= b(j) ; - J" @3 T9 C# Y4 M% L: j( G: W equations 之间的声明用逗号连接,最后用;具体的格式见上面的例子。这里要 说的是 equation 括号里面表示了这个 equ 的维度,这样我们就可以很轻松的计 算模型的大小了。虽然不能够完全衡量模型的复杂度,但是总会有帮助的。 当然,并不是所有的 equ 都对于每一个 i或者 j,这就需要用$来控制。以后会详 细讲到。这里要说的是,模型就是不同 equ 的组合,你可以写很多 equations, 让后根据自己的需要来组建不同的模型。 模型当然可以随意的组合,例如: 6 n. q) a( Q @; x$ N6 m5 K MODEL PROBLEM /equ1,equ2,equ3/; {9 `; K, S& |8 v3 Y( L) {. ~! v 或者 model problem02 /all/; 一般来说,如果你的模型涉及到算法的话,可以改变 equations 的形式或者变量 的值来实现。或者可以定义几种不同种类的模型,然后在设计算法来实现不同模 型之间的交流。 最后当然是解模型啦。 4 }4 j) f3 h6 i! g SOLVE transport USING LP MAXIMIZING Z; 值得注意的是 GAMS 里面没有直接 MILP,要写成 MIP.4 c) l0 v$ b5 l$ B2 | 如果模型很大,变量很多的时候,查找特定的变量的值很麻烦,可以用 display 来解决。你可以写成:3 S; M$ C6 Q2 u9 b* a' _& } display x.l;! Y5 s. Q# E7 a$ X 当然了,非常复杂的模型需要用 put 等更加高级的工具来输出。 这里顺便说一下 GAMS 的下载和获得。 一般来说,就是在 www.gams.com 上下载相应的版本。然后在安装的过程中再把 license 文件放到相应的位置就可以了。 开始如果选择 no 的话,在 solver 里就显示的 demo Demo 的意思是试用版,这个不解释,大家都懂。 GAMS 试用版对变量个数有限制 ; A# t; v# H' m1 ^5 J Without a valid GAMS license the system will operate as a free demo system with these limitations: $ T$ y- Z7 z' o9 H* l& r4 l Model limits: Number of constraints and variables: 300 & g5 j. j6 F4 l9 P2 n1 X" M2 S3 ^& l Number of nonzero elements: 2000 (of which 1000 nonlinear) Number of discrete variables: 50 (including semi continuous, semi integer and member of SOS-Sets) % a* m' n- a1 t* J7 B Global solver limits: & ~% }& O1 M W! S) G Number of constraints and variables: 10 但 student version 可以免费获得,但是只能计算比较小的模型(0 1 变量** 到 50)。 但是对连续变量的要求要放松的多了。 另外还有一个小技巧来计算大模型。就是你在自己的 student version 下面编 译好了以后,提交到 NERO 里面来计算。大家可以 google 一下就知道了。 需要注意的是:在使用 neos 的时候一定要将模型和数据放到一个文件里面。 另外在 neos 里面不能用 cplex 计算 MILP,需要另外想办法。 下面这个问题主要是用来举例说明 GAMS 是如何让您以一种自然的方式建立模 型.GAMS能够处理大的多和高度复杂的问题.在这里只展示了GAMS的很少一部分 的基本特征. 下面是问题的 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 的代数描述,这是用来最小化把货物从 2 个工厂运输到 3 个市 场的费用.受约束于供需约束. 3 L3 R0 E& @, r3 A5 n$ }. P 指标: i=工厂(plants) j=市场(markets) $ s2 I) d9 y0 _7 j3 X* z8 r+ { 给定的数据: =在工厂 i 日常供应量(批数 cases) =在市场 j 的日常需求量(批数 cases) =在工厂 i 和市场 j 之间的距离(千英里) =在工厂 i 和市场 j 之间每单位的运输费用($/批/千英里) 0 _3 w6 u3 Z- x6 a1 { `- V% e$ y/ c* e9 H! S9 O D 距离 ) ]; N) L6 L* p, w _4 K2 x/ P 2 u/ H4 P- @5 l5 市场 I/ h# d7 a5 h 工厂 New York Chicago Topeka6 v+ i; l) }+ Y; S# V! B 供应量 Seattle 2.5 1.7 1.8+ y+ w/ q1 A' O- z 350 1 Z1 j Z: i- l* j, | San Diego' [0 q ]1 T. z _ 2.5 1.8 1.43 _) G9 Q9R3 y. I 600+ _' `. C3 q5 \ r3 u 9 _" g4 e( \, y( _+ T9 y) |3 y 需求量 325 300, K/ m& W" ] a5 E' k1 Y0 y" ~, t 275 F=每批每千英里的费用$ 7 b7 \7 A+ w" i; i+ h5 G! q/ s3 ?! o 决策变量: =日常从工厂 i 运输到市场 j 的总量(批数 cases) 这里 适用所有 i,j - d; {" E6 v7 I: p& X 约束: 在工厂 i的供应量**(批数 cases): 适用所有的 i 在市场 j的需求量: 适用所有的 j 目标函数: ( M" ]% O! o$ F, P5 Y* r) E Minimize (千元) 同样的模型在 GAMS 中建模.简练的代数描述使得模型高度紧凑,并带有逻辑结构. 内部的文档,比如对参数的解释和测量的单位,使得模型很容易读懂. 集合(Sets) L6 I1 g- i. `' y D 4 t) ^) K. L: ? GAMS让您以直接的方式指定指标:声明和命名集合(这里是I和J),并列举它们的 元素. 参数 这里的数据输入被作为指标参数 A(I)和 B(J),值简单的被列出. GAMS 让您可以在模型的任意位置放置解释性文本(以小写格式显示),当您在开 发它时.您的注释自动被结合到输出报告中的合适位置. 表格 数据同样能够以方便的表格形式输入.GAMS 让您以数据的基本形式来输入数据- 转换是特定的代数化的. }3 I b; I9 T- `2 |( h( D: D! A 标量(Scalar) 常量能够被声明为标量,它的值是指定的. , [& I) c4 d; { Y" E; t' u& s 数据处理 当数据值要被计算前,您首先要声明参数(比如,给它一个符号,随意给它编个指 标),然后给它一个代数公式.GAMS 将自动进行计算. 变量 9 X' I9 ?) A% U 决策变量以代数的方式表达,带有特定的指标.从这种常见的形式,GAMS 在域中 生成变量的每个实例. ( G5 E7 r/ |2 y! d6 j G5 |# t 变量可以被指定为下列类型:任意(FREE),正值(POSITIVE),负值(NEGATIVE),二 元(BINARY),或者整数(INTEGER).默认是任意(FREE). 4 F1 B9 e" Y* ^# y* q' s" x 目标变量(这里是 z)仅被声明,没有指标(index). # N# o, D3 l6 p Q9 N( h3 u% D 方程式 目标函数和约束方程式首先被通过指定名字来声明.然后它们的概括的算术公式 被声明.GAMS 现在已经有了足够的信息(从上面的数据输入和从在方程式中指定 的算术关系)来自动生成每个单独的约束声明-就像您能在下面的输出报告中看 到的. =E=表示'equal to' (等于) =L=表示 'less than or equal to' (小于或等于) =G=表示'greater than or equal to' (大于或等于) 模型声明 0 Q' X2 q8 m* h* T2 [' k 模型被指定了一个唯一的名字(这里是 TRANSPORT),模型缔造者指定那个方程式 应该被包含到这个特别的公式中.在这里我们指定了 ALL,也就是说所有的方程 式都是模型的一部分.就等于是 MODEL TRANSPORT /COST, SUPPLY, DEMAND/ . 这 个方程式选择使您能够在单个的 GAMS 输入文件中以公式表达不同的模型,基于 相同或不同的给定数据. ; m1 K; G* b( a( P! r 求解声明 0 W8 z6 M, j% S* {, I1 s 求解声明(1)告诉GAMS那个模型要被求解,(2)选择要使用的求解器(在这里是LP 求解器),(3)表明优化方向,或者是求最小值,或者是求最大值.(4)指定目标变 量. 5 w8 U' m9 |- `9 B5 Q8 P* m% x 完整的 GAMS 输出报告比下面列出的部分摘录详细的多,包含了更多的帮助用于 解释和诊断您的模型.甚至您能够修改输出格式来符合您的特定的需要. - m, b, S4 w0 x+ L9 v" ? 方程式列表 4 F# v4 S7 M' D; k 方程式列表显示从在GAMS输入中指定的分区(block)生成的单独的约束.在GAMS 中使用者可以以一种非常紧凑的形式写下被索引的方程式分区(block),这将产 生大量的单个方程式.在我们的示例中,我们指定了 3个方程式分区,生成了 6 个 单独的方程式. 列列表 * Q$ r7 n# B8 l, A T" y9 V- l 列列表提供信息到生成的单独的变量上.变量 X(I,J)扩展出 6个单独的变量.当 许多变量从一个分区中被生成,默认的列表只显示最初的 3 个(用户可以修改). 0 ?: W; |8 N$ A# w: Q! e f% n; J" L+ r 求解声明将生成模型(单个方程式和对应到特定模型的变量的产物).首先一些关 于生成的模型的统计表将会被显示:方程式数,变量和非零元素. 在求解汇总信息部分,我们看到BDMLP被调用来求解这个模型.BDMLP经过 4次反 复,耗时 0.18 秒找到了这个问题的最优解.求解信息下列的消息来自求解器. 解(Solution) 3 e" t) i5 m2 j% M$ d2 M8 i 解被显示在这里.边际值(marginals)对应方程式的重复和变量减少的花费. ( j) u# T) T! m% L2 n 写工具不需要学习一门其它的语言.在 GAMS 所有的数据处理,模型定义和报告编 写都是在一个单独的环境中完成的. 本例的参考文献 Dantzig G. B., Linear Programming and Extensions, Princeton University Press,Princeton, New Jersey, 1963, Chapter 3-3. GAMS Tips and Tricks + w% p* Q. }# v) W ? Below, a (random) list of useful tips and tricks for GAMS users is given. This list is oriented at graduate students who start using GAMS but already know the general syntax. The list is constructed largely as the result of concrete questions asked by GAMS users. Experienced users will find many well-known modelling features, but may find some items they didn’t know yet. " {; V5 f. X# n1 V) K U' T d. C In principle, almost everything can be found in the GAMS User Guide, which (among other interesting documentation) can be found on http://www.gams.com/docs/document.htm. Some new features are not in the official User guide yet; you can get these when you follow the very useful advanced GAMS course by Bruce McCarl. ' l3 z% Y5 J5 U, @ If you have any (good new) tips or tricks, or if you have found a bug / ambiguity in the existing tips and tricks, send an email to Rob.Dellink@wur.nl. + A" `7 s' v: O. l5 S0 r ________________________________________ / x9 a* _) \2 I, O8 o 1. Browse through the GAMS mailing list archive; it contains a lot of usefull tips and tricks (including some of the hints below): http://www.gams.de/3docs/gams_archives/external.html gives a summary of the main topics and the full archive can be browsed at http://www.listserv.gmd.de/archives/gams-l.html 8 [* B7 m9 o+ @+ I% q- v6 U {Contributed by Rob Dellink} ________________________________________ 5 ?/ h9 M5 y) m) O; x4 P2 X' F 2. GAMS comes with a library of 160 models; take a look at these models when building your own model (the library can be found on the hard disk in the MODLIB subdirectory and on the GAMS homepage). 7 |+ a% f9 k3 I {Contributed by Rob Dellink} 6 G: s8 Z0 B8 N7 E) f ________________________________________ 3. First solve a model using zero iterations to check whether the benchmark (i.e. the base data you provide) is replicated by the model. This is to make sure that there are no errors in the calibration of the model. .iterlim = 0; # |9 ~+ R; `3 x2 ^, k+ N7 a solve using maximising ; .iterlim = 2000; {Contributed by Rob Dellink} - T5 u' j3 o4 s& W- x4 z" e# a2 @ ________________________________________ 1 Z) D- n6 [/ L0 Q/ e' v 4. Use the abort statement if the model specification is incorrect, that is, if you end up with a solution that does not satisfy some condition you know that has to be satisfied; for example, if the benchmark does not replicate, you can use: 0 Q) L8 `# l/ J: {- m2 _, b ABORT$(.OBJVAL GT 1E-6) "DATA CALIBRATION ERROR! LARGEST ERROR: ", .OBJVAL; ; m% K2 v3 U( ]8 ~' a: m Or in case you know (by Walras’ law) that the level of C2 has to equal the level of X2: * t: K i/ b3 x) |& e6 Z# w ABORT$((C2.L-X2.L)**2 gt 1E-20) "Walras law not obeyed!"; 6 ?/ O5 r* c5 s! z {Contributed by Rob Dellink} ________________________________________ ( P& U8 I( j u5 u( u% m 5. Always check whether your model has been normally completed and found an optimal solution: 2 W" q& Z* [! ^( A. y' x DISPLAY .MODELSTAT, .SOLVESTAT; Both should equal 1 if the model is linear; solvestat should equal 2 for non-linear models. You can use an abort statement if one or both is incorrect: - S, p4 l, D- x ABORT$(.MODELSTAT <> 1) "Model not normally completed", .SOLVESTAT <> 2) "No local optimum found", {Contributed by Rob Dellink} ________________________________________ 7. If you want to comment out several lines, use the $ontext and $offtext commands. Make a habit of starting your GAMS files withsomething like the following: & k# [4 W8 \$ B c' ]. |% m $TITLE The name of my model, version xx $ontext 2 Z7 w: R* Q/ N/ d: {: u version: xx 0 z7 k5 s6 F0 W+ c6 @% w7 f3 g date: dd-mm-yy * S7 U% Z: @" n5 E' Y. N( h author of this version: initials based on: previous version x 2 B' M, \1 I F0 J! A8 o characteristics: … : v& j* L& O: k+ b) | new in this version: compared to version x " r4 D* K. @ L) } problem1: none?! note1: feature y still has to be included - s8 f5 U& v. [% B note2: feature z may need to be modified 1 {7 { g/ F2 Y. o2 Y $offtext {Contributed by Rob Dellink} # T/ `/ C. ^2 n+ w' a9 e% g4 D6 K9 E ________________________________________ 8. You can limit the output listing file by including the following statements: " @3 [6 g4 Z) I3 `7 k $offsymxref {This stops the print of a complete cros-reference list of symbols } 9 Q% ^- c& w F2 g1 h1 C' p& ~ $offlisting 4 ?) S0 _+ M- h {This stops the echo print of the input file} option limcol = 0; {This stops the print of the column listing} + I) V0 v4 Y6 q0 _5 _ option limrow = 0; {This stops the print of the equation listing} * n, Z" q [5 I8 j- ] {Contributed by Rob Dellink} 4 r6 [; L$ ~8 ~( ` ________________________________________ 9. If you fix the level of a variable (variable.fx = …), don’t forget to free it again: variable.lo = -inf; - ?6 [. t- h7 F& ^8 K variable.up = inf; . g7 N! T) ]) o3 W4 v5 e {Contributed by Rob Dellink} ________________________________________ ' ]+ J' }. L, J, K* q 10. When you are debugging your model, try shortening the execution time by using $exit to exclude the last part of your code: $exit will stop the GAMS execution, command after this line (perhaps including elaborate sensititivty analysis) will not be executed. 9 Y! ^$ m" Q1 R$ N4 R6 N: l9 q {Contributed by Rob Dellink} & w0 Y {8 |+ S' z ________________________________________ 11. If you have infeasibilities, there are (at least) three things you can do to aleviate your problems: 3 z M- q. A2 d9 t$ x- Q1 d S+ N* e 1. Remove all unneccesary upper and lower bounds and fixed variables from your code; 2. Provide better starting values; 3. Change equalities into inequalities (it is always a good thing to use inequalities in stead of equalities). {Contributed by Judit Szonyi and Rob Dellink} ) i3 y2 [; e. X5 a6 }6 K ________________________________________ 7 b; `2 |; |5 _$ V! k9 {$ d 12. Learn to use vector notation instead of scalars; it makes larger models much more campact: SETS J Sectors /1,2/; VARIABLES Y(J) Production; 2 j* j; o8 F2 _; J0 c Instead of: VARIABLES Y1 Producer 1 Y2 Producer 2; For two sectors, this does not make much difference. But imagine writing out 60 sectors or more. It is much easier to use the vector notation from the start, when your model is still small, than to have to rewrite it when yo
本文档为【GAMS 使用心得+经验+技巧+实例(中文版)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_899270
暂无简介~
格式:pdf
大小:235KB
软件:PDF阅读器
页数:28
分类:金融/投资/证券
上传时间:2011-08-21
浏览量:1239