GAMS教程 0:GAMS介绍
1. 前言
这学期在UW-Madison交流,选的课程中有一门课是CS 524:Introduction to Optimization。
我本来以为这门课程会讲优化中的一些算法,例如:单纯形法、匈牙利算法等等。结果没想到,不是这门课,而是CS 7xx的一门课才会讲解这些算法,CS 524这门课的授课目标就是让学生能够从现实问题中抽象出来一个优化模型,而后通过GAMS
去求解这个优化问题。
因此,CS 524这门课的授课目标就包含两部分:
- 介绍
GAMS
- 介绍常见的模型以及相应的
GAMS
求解
因此,学习这门课就得学习GAMS
这个软件的用法。而且我自己在学习的时候确实发现GAMS
这个软件挺有用的,所有就准备写个系列专栏记录下来。一方面是作为笔记,方便以后复习,另一个就是当做GAMS
的中文学习资源,分享在互联网上。
2. GAMS介绍
A. 概述
GAMS
全称The General Algebraic Modeling System
,是一款数学规划和优化的高级建模系统。
简单来说:
GAMS
就是一个软件,我们按照GAMS
软件规定的语法把我们的优化问题描述出来之后,就可以利用GAMS
这个软件进行求解。- 对应的描述优化问题的语言称为
GAMS语言
,一般在不做特殊强调的情况下,GAMS
既可以指代GAMS
软件,又可以指代GAMS
语言。具体指代的对象视上下文而定 - 使用
GAMS
程序规定的语法写成的、描述、求解优化问题的文件称为GAMS
程序,GAMS
程序文件的后缀为.gams
这样讲可能还是比较抽象,所以下面举一个使用GAMS
求解规划问题的例子
B. 真实问题:Top Brass 问题
Top Brass Trophy Company
是一家专门生产奖杯的公司,这家公司生产两种奖杯:
- 足球奖杯(Soccer)
- 橄榄球奖杯(Football)
卖出一个橄榄球奖杯将会获得$12的利润,而卖出一个足球奖杯将会获得$9元的利润。而生产一个奖杯,两种奖杯分别需要消耗:
- 木质底座:橄榄球奖杯需要4平方英寸大小的木板,足球奖杯需要2平方英尺的奖杯
- 奖杯体:各消耗一个
- 顶端的标志物:橄榄球顶端有一个铜制橄榄球,而足球奖杯顶端有一个铜制足球。
假设目前库存的原材料为:
- 1000个黄铜橄榄球
- 1500个黄铜足球
- 1750个奖杯体
- 4900平方英寸的木板
假设制作的所有奖杯都能够售出,那么
Top Brass Trophy Company
能够获得的最大利润是多少?
设生产橄榄球和足球分别为$f$和$s$个,上面的这个优化问题的数学语言描述是:
手算求解画出的可行域如下
然后通过做平行线,得到的解为
C. GAMS语言描述
使用GAMS
语言描述上述优化问题的程序如下(文件名为topbrass1.gams
:
// topbrass1.gams
$title Top Brass (LP) Example 5.1 of Rardin (1998)
free variable p "total profit";
positive variables
f "football trophies",
s "soccer trophies";
equations
obj "max total profit",
foot "brass footballs",
socc "brass soccer balls",
plaq "brass plaques",
wood "bdft wood";
obj..
p =e= 12*f + 9*s;
foot..
f =l= 1000;
socc..
s =l= 1500;
plaq..
f + s =l= 1750;
wood..
4*f +2*s =l= 4800;
model topbrass /all/;
solve topbrass using lp maximizing p;
scalar sst, mst;
sst = topbrass.solvestat;
mst = topbrass.modelstat;
display sst,mst;
D. GAMS软件求解
接下来我们使用GAMS
软件求解上述程序
求解后:
- 左侧的面板显示了所有的文件,其中
topbrass1.gams
是源程序,topbrass1.lst
是当前优化问题求解的结果 - 中间的面板显示了选中的文件,这里是打开了
topbrass1.gams
源程序 - 右侧的面板显示了求解过程中求解器输出的log信息
打开topbrass1.lst
查看求解的结果,会发现中间的面板被分成两部分,左侧显示了当前list
文件的结构,右边显示了list
文件的内容。通过点击左侧lst
文件的结构就可以实现快速跳转
我们直接跳转到最后去查看求解的结果。通过点击左侧的SolVAR -- > p
就可以直接看到最后的结果,利润最大为$17700
E. 总结
通过上面的例子,我们其实发现GAMS
其实并不是单一的软件或者一门语言,相反,GAMS
是求解软件 + 语言等等在内的一个集成开发环境,其目的就在于方便用户求解优化问题。
3. 后续
本节介绍了什么是GAMS
,并且通过举例具体得解释了GAMS
。从下一讲开始,我们就讲集中讲解GAMS的语法。