1. GAMS是什么?
GAMS (General Algebraic Modeling System) 是一种高级建模系统,专为解决数学规划和最优化问题而设计。它由美国世界银行的开发团队在20世纪70年代末期创建,其核心目标是提供一个统一的、高层次的语言,让用户能够以代数形式清晰地表达复杂的模型,而无需关注底层求解器的细节。
GAMS 的独特之处在于它将模型描述(即代数公式和数据)与求解算法(即求解器)完全分离。你只需用 GAMS 语言定义模型的所有元素(包括集合、数据、变量、方程和目标函数),然后 GAMS 系统会自动选择或允许你指定合适的求解器来解决该模型。这种“声明式”的建模方法使得模型更易于理解、维护和扩展,极大地提高了建模效率。
GAMS 广泛应用于经济学、工程、能源系统、供应链管理、环境科学和农业等多个领域,用于解决线性规划(LP)、非线性规划(NLP)、混合整数规划(MIP)、混合整数非线性规划(MINLP)等各种复杂的优化问题。
2. GAMS的核心建模元素
一个完整的 GAMS 模型通常由六个核心部分构成,每个部分都服务于特定的目的。
2.1 集合 (Sets)
集合是 GAMS 语言最基本的构建块,用于定义模型的维度和索引。GAMS 模型的强大之处在于它能够处理大型数据结构,而集合正是实现这一点的关键。通过定义集合,你可以用简洁的代数形式来表示成百上千个变量和方程。
-
语法:
SETS
关键字用于声明集合。SETS i "工厂" / 1*10 / j "市场" / A, B, C, D / ;
在这个例子中,
i
集合代表10个工厂,j
集合代表4个市场。你可以通过这些索引来定义变量和数据,例如x(i, j)
代表从工厂i
到市场j
的运输量。
2.2 数据 (Data)
GAMS 提供了多种方式来声明和输入数据,确保模型与数据是分离的。
-
SCALARS (标量): 用于定义单个数值。
SCALARS f "运费" / 90 / e "排放上限" / 1000 / ;
-
PARAMETERS (参数): 用于定义带索引的数据,通常是向量或矩阵。
PARAMETERS a(i) "工厂产能" / 1: 150, 2: 250, 3: 120 / b(j) "市场需求" / A: 100, B: 200, C: 150 / ;
-
TABLE (表格): 用于定义二维或多维矩阵,提供更直观的数据输入格式。
TABLE d(i,j) "工厂到市场的距离" A B C 1 10 20 30 2 15 25 35 3 18 28 38 ;
2.3 变量 (Variables)
变量代表模型中需要优化的未知量。GAMS 要求你声明每个变量的类型。
-
语法:
VARIABLES
关键字用于声明变量。VARIABLES x(i, j) "运输量" z "总成本" ;
-
变量类型: GAMS 提供了多种变量类型来适应不同类型的优化问题。
-
FREE VARIABLE
(默认): 无约束变量,可为正、负或零。 -
POSITIVE VARIABLE
: 非负变量(ge0)。 -
BINARY VARIABLE
: 二进制变量(0或1)。 -
INTEGER VARIABLE
: 整数变量。
-
你也可以为变量设定上下界。
x.lo(i,j) = 0 ; ( 运输量不能为负 )
x.up(i,j) = 100 ; ( 运输量上限为100 )
2.4 方程 (Equations)
方程是定义模型约束和目标函数的代数表达式。GAMS 的方程语法与数学表达式非常相似,易于理解和编写。
-
语法:
EQUATIONS
关键字用于声明方程的名称,然后在模型部分定义其具体代数形式。EQUATIONS cost_equation "定义总成本" supply_constraint(i) "工厂产能约束" demand_constraint(j) "市场需求约束" ;
-
方程的定义:
cost_equation.. z =e= sum((i,j), d(i,j) * x(i,j)) ; supply_constraint(i).. sum(j, x(i,j)) =l= a(i) ; demand_constraint(j).. sum(i, x(i,j)) =g= b(j) ;
这里的
e=
代表“等于”(equality),=l=
代表“小于或等于”(less than or equal to),=g=
代表“大于或等于”(greater than or equal to)。sum
是一个内置函数,用于对集合中的所有元素求和。
2.5 模型与求解 (Model and Solve)
在定义完所有元素后,你需要将它们组合成一个完整的模型并进行求解。
-
MODEL: 将相关的方程和变量捆绑在一起。
MODEL transport_model / all / ;
/ all /
是一个简写,表示包含所有已声明的方程。你也可以显式地列出方程名称。 -
SOLVE: 执行求解过程。
SOLVE transport_model USING LP MINIMIZING z ;