Gams Tutorial
Gams Tutorial
Gams Tutorial
Maria Blanco
TUTORIAL
Guía de introducción
a GAMS
Maria Blanco
Universidad Politécnica de Madrid, CEIGRAM
Versión 2019
Modelos Agroeconómicos
Maria Blanco
Universidad Politécnica de Madrid, CEIGRAM
maria.blanco@upm.es
Version 2019
2 / 59
Guía de Introducción a GAMS
Contenido
Lista de Tablas ................................................................................................. 5
Lista de Figuras ................................................................................................ 5
3 / 59
Guía de Introducción a GAMS
4 / 59
Guía de Introducción a GAMS
Lista de Tablas
Tabla 1. Algunos solvers utilizados para cada tipo de problema ................................... 8
Tabla 2. Estructura base de un modelo en lenguaje GAMS .........................................10
Tabla 3. Ejemplo de matriz de programación lineal ...................................................13
Tabla 4. Correspondencia entre notación algebraica y lenguaje GAMS .........................18
Tabla 5. Principales palabras clave del lenguaje GAMS ..............................................24
Tabla 6. Términos con un significado predeterminado en GAMS ..................................25
Tabla 7. Algunos ejemplos de nombres de identificadores ..........................................26
Tabla 8. Operadores aritméticos .............................................................................34
Tabla 9. Operadores indexados ..............................................................................34
Tabla 10. Algunas funciones en GAMS .....................................................................35
Tabla 11. Tipos de variables ...................................................................................35
Tabla 12. Dos maneras de definir el tipo de variable .................................................36
Tabla 13. Valores asociados a cada variable .............................................................36
Tabla 14. Tipos de ecuaciones ................................................................................37
Tabla 15. Tipos de modelos ...................................................................................39
Tabla 16. Atributos de los modelos .........................................................................40
Tabla 17. Atributos de los modelos: solver status .....................................................45
Tabla 18. Atributos de los modelos: model status .....................................................45
Tabla 19. Algunos valores especiales.......................................................................46
Tabla 20. Operadores relacionales ..........................................................................47
Tabla 21. Operadores lógicos .................................................................................47
Tabla 22. Ejemplos de condiciones lógicas ...............................................................47
Lista de Figuras
Figura 1. Primer ejemplo de programación lineal: región admisible .............................13
Figura 2. Primer ejemplo de programación lineal: solución óptima ..............................14
Figura 3. Pantalla de inicio del programa GAMS ........................................................15
Figura 4. Crear un nuevo archivo de proyecto (.gpr) ................................................16
Figura 5. Elegir los solvers predeterminados ............................................................16
Figura 6. Abrir un archivo GAMS .............................................................................17
Figura 7. Crear un nuevo archivo GAMS ..................................................................17
Figura 8. Poner nombre a un archivo GAMS .............................................................17
Figura 9. Escritura de los datos del primer ejemplo en GAMS .....................................20
Figura 10. Escritura de las variables y ecuaciones del primer ejemplo en GAMS ............21
Figura 11. Resolución del primer ejemplo en GAMS ...................................................21
Figura 12. Archivo de resultados: lista de ecuaciones ................................................22
Figura 13. Archivo de resultados: lista de variables ...................................................22
5 / 59
Guía de Introducción a GAMS
6 / 59
Guía de Introducción a GAMS
Los datos pueden introducirse en forma de listas o de tablas, de forma que no resulta
difícil revisarlos o modificarlos. GAMS permite importar datos de otros programas (hojas
de cálculo) y exportar los resultados del modelo. Los datos pueden estar separados de
la formulación matemática del modelo.
7 / 59
Guía de Introducción a GAMS
También puede elegirse entre distintas versiones de GAMS (estudiante, profesional, etc.),
que se diferencian básicamente en su capacidad para resolver problemas de diferente
dimensión. Así, aunque la versión estudiante dispone de todos los solvers, el tamaño de
los modelos que permite resolver está limitado.
Es posible ejecutar GAMS en DOS (o UNIX) utilizando un editor de texto para crear los archivos
de entrada nombre_archivo.gms o bien podemos utilizar la interfaz GAMSIDE. IDE
(Integrated Development Environment) es un entorno gráfico para para editar y ejecutar
archivos GAMS. Este entorno permite resaltar elementos del lenguaje con colores e
incorpora, en la sección HELP, varios documentos de ayuda (en inglés), entre ellos la guía
de utilización de GAMS (GAMS Documentation). En esta guía se explica el uso de GAMS a
través de GAMSIDE.
8 / 59
Guía de Introducción a GAMS
1. Una vez que GAMSIDE está instalado en el ordenador (ver guía de instalación en Anexos),
• La formulación del modelo está separada de los datos. El modelo puede aumentar
de tamaño sin que ello implique aumentar la complejidad del mismo.
Los principales elementos del lenguaje GAMS se detallan en la sección 4. Pero antes vamos
a escribir y resolver un primer ejemplo en lenguaje GAMS. Ello nos permitirá comprender
mejor los principios de utilización de GAMS y la lógica del lenguaje de programación utilizado
por GAMS.
9 / 59
Guía de Introducción a GAMS
SOLVE SOLUTION
Instrucciones de ejecución Resultados y valores duales
10 / 59
Guía de Introducción a GAMS
• Todo vector xc que satisface las restricciones del modelo se denomina solución
factible del programa lineal (o programa posible). El dominio D de soluciones
factibles es la región factible o región admisible.
𝜕𝜕𝜕𝜕
= 𝑚𝑚𝑐𝑐 − � 𝜆𝜆𝑟𝑟 𝑛𝑛𝑛𝑛𝑐𝑐,𝑟𝑟 ≤ 0 ⊥ 𝑥𝑥𝑐𝑐 ≥ 0 [4]
𝜕𝜕𝑥𝑥𝑐𝑐
𝑟𝑟
𝜕𝜕𝜕𝜕
= 𝑑𝑑𝑑𝑑𝑟𝑟 − � 𝑛𝑛𝑛𝑛𝑐𝑐,𝑟𝑟 𝑥𝑥𝑐𝑐 ≥ 0 ⊥ 𝜆𝜆𝑟𝑟 ≥ 0 [5]
𝜕𝜕𝜆𝜆𝑟𝑟
𝑐𝑐
11 / 59
Guía de Introducción a GAMS
El grupo de ecuaciones [5] indica que el valor marginal del recurso r será nulo (λr = 0)
cuando el recurso no sea utilizado en su totalidad. Cuando el recurso sea utilizado en su
totalidad, λr será positivo. Para cada recurso r, el multiplicador λr mide el impacto sobre la
función objetivo de una variación marginal en la disponibilidad del recurso. Este
multiplicador corresponde al valor dual o valor marginal del recurso (precio sombra) y
puede interpretarse como el precio máximo que estaríamos dispuestos a pagar, en el
óptimo, por disponer de una unidad adicional del recurso.
Nótese que también podríamos haber formulado el problema utilizando una notación
algebraica más concisa, a través de las ecuaciones [1] a [3]. Sin embargo, se ha preferido
utilizar esta notación para facilitar el aprendizaje de GAMS.
1 El margen bruto por hectárea se define como la diferencia entre los ingresos por venta de la producción (precio
por rendimiento de cultivo) y los costes directos por hectárea de cultivo.
12 / 59
Guía de Introducción a GAMS
COLUMNAS
Restricción de tierra 1 1 ≤ 50
Restricción de
20 60 ≤ 1800
trabajo
Cada restricción de recursos puede representarse como un área delimitada por los ejes
cartesianos y una línea frontera (puntos en los cuales el recurso se utiliza en su totalidad).
Solo los puntos ubicados en el área sombreada de la Figura satisfacen ambas restricciones
simultáneamente. La región sombreada se denomina región factible o región admisible, y
cada punto de dicha región se conoce como solución o programa factible. Los puntos de la
región admisible representan el conjunto de todas las combinaciones de cultivos que
satisfacen todas las restricciones, así como las restricciones de no negatividad. Pero
algunas de estas combinaciones implican un mayor margen global que otras.
13 / 59
Guía de Introducción a GAMS
¿Cómo varía la solución óptima si cambia el margen bruto de los cultivos? ¿Cómo
varía la solución óptima si aumenta la disponibilidad de trabajo?
Hemos visto que la resolución gráfica nos ayuda a comprender los modelos de optimización
con restricciones de desigualdad. Sin embargo, solamente es aplicable en modelos con un
número reducido de variables de decisión. En general, debemos recurrir a algún algoritmo
de programación matemática para resolver el problema.
14 / 59
Guía de Introducción a GAMS
1. Creamos una carpeta de trabajo (utilizando WINDOWS EXPLORER, por ejemplo) donde
vamos a guardar nuestro trabajo con GAMS. Se recomienda crear una carpeta de
nombre corto y sin espacios. Por ejemplo, podemos crear una carpeta gamsmod
directamente en la unidad C: (C:\agrimod\gamsmod).
2. Abrimos GAMSIDE haciendo clic en el icono . Se abrirá una ventana (Figura 3).
15 / 59
Guía de Introducción a GAMS
4. Verificamos que GAMS ha abierto el proyecto que acabamos de crear (ver la línea
superior en la Figura 6). Antes de ejecutar modelos en GAMS, debemos elegir los solvers
predeterminados para cada tipo de problema. Para ver o editar los solvers
predeterminados, seleccionamos File>>Options>>Solvers en GAMSIDE. Se mostrará
una matriz con los nombres de los solvers en filas. En columnas aparece en primer
lugar el tipo de licencia y, a continuación, los tipos de modelos disponibles. Al hacer
clic en una celda de la matriz, se selecciona un solver predeterminado para un tipo de
modelo. En este ejemplo, seleccionamos CONOPT como en la Figura 5 y hacemos clic
en OK.
16 / 59
Guía de Introducción a GAMS
6. Se abrirá un archivo nuevo donde podremos escribir nuestro primer modelo (Figura 7).
17 / 59
Guía de Introducción a GAMS
Para escribir este problema en lenguaje GAMS, debemos tener en cuenta la correspondencia
entre la notación algebraica y el lenguaje GAMS (Tabla 4).
c índices sets
Z, x variables variables
Debemos comenzar por definir los conjuntos o listas de elementos (sets), que
corresponden a los subíndices de la escritura algebraica. En nuestro ejemplo, el único
subíndice que encontramos es el correspondiente a los cultivos. Por tanto, vamos a crear
un set para los cultivos, de la manera siguiente: en primer lugar, es necesario anunciar a
GAMS que vamos a introducir un conjunto, utilizando para ello la palabra clave set; a
continuación, damos un nombre al conjunto (por ejemplo, C), dejamos un espacio e
introducimos los elementos del conjunto entre signos slash (/); por último, vamos a
anunciar que hemos terminado de introducir conjuntos utilizando un punto y coma (;).
Resulta muy útil, aunque no es indispensable, escribir un texto explicativo al lado del
nombre del set para hacer comprensible el modelo para otros modelizadores:
18 / 59
Guía de Introducción a GAMS
A continuación, vamos a introducir los datos del problema, es decir, los parámetros
exógenos. Para ello, vamos a utilizar las palabras clave parameter, scalar o table.
La palabra clave scalar se utiliza para introducir datos simples. En nuestro ejemplo, el
tamaño de la explotación y la disponibilidad de trabajo son datos simples. Vamos a utilizar,
por tanto, la palabra clave scalar para introducir estos datos, siguiendo la misma lógica
que para los conjuntos, es decir, primero vamos a dar un nombre al escalar y, después de
un espacio, vamos a introducir los valores entre signos slash (/), terminando siempre con
un punto y coma (;):
scalar
DS disponibilidad de superficie (ha) /50/
DT disponibilidad de trabajo familiar (horas) /1800/
;
La palabra clave parameter se utiliza para introducir datos con una o más dimensiones (es
decir, parámetros con uno o varios subíndices). En el ejemplo, algunos datos (las
necesidades de trabajo o el margen bruto) están definidos en función del cultivo. Para
introducir cada uno de estos parámetros, en primer lugar le daremos un nombre e
indicaremos, entre paréntesis, su dominio de definición; a continuación, y siempre dejando
un espacio, introduciremos los valores entre signos slash (/). Utilizaremos un espacio para
separar cada elemento del dato asociado y una coma (o un salto de línea) para separar los
elementos entre sí:
parameter
NT(C) 'necesidades de trabajo (horas/ha)' /trigo 20, maiz 60/
MB(C) 'margen bruto (euros/ha)' /trigo 450, maiz 1000/
;
De esta forma, hemos terminado de introducir los datos del problema. El archivo
ejemplo1.gms tendrá el aspecto mostrado en la Figura 9.
19 / 59
Guía de Introducción a GAMS
Ahora, podemos definir las variables y escribir las ecuaciones del modelo. Las variables
son las hectáreas de cada cultivo (Xc) y la función objetivo (Z).
La función objetivo debe ser siempre una variable libre mientras que la variable Xc no
puede tomar valores negativos. Para especificar esto, introducimos las variables por
separado (para la variable libre utilizamos la palabra clave variable y para las variables no-
negativas positive variable).
variable
Z 'margen total de la explotacion (euros)'
;
positive variable
X(C) 'nivel de actividad (ha)'
;
Una vez que las ecuaciones han sido formuladas, nos queda dar un nombre a nuestro
modelo (utilizando la palabra clave model) y dar a GAMS las instrucciones para resolverlo
(utilizando el comando solve).
20 / 59
Guía de Introducción a GAMS
Figura 10. Escritura de las variables y ecuaciones del primer ejemplo en GAMS
21 / 59
Guía de Introducción a GAMS
El archivo ejemplo1.lst generado por GAMS es un archivo bastante extenso que contiene
mucha información, entre la que podemos destacar la lista de ecuaciones detalladas y la
solución del modelo. Las ecuaciones detalladas permiten verificar que no nos hemos
equivocado al formular el problema (Figura 12).
Otra forma de especificar las ecuaciones consiste en listar las variables con sus coeficientes
asociados en cada ecuación del modelo (Figura 13). Esta lista de variables permite
asimismo verificar que los coeficientes son los correctos.
X(maiz)
(.LO, .L, .UP, .M = 0, 0, +INF, 0)
-1000 MARGEN
1 TIERRA
60 TRABAJO
22 / 59
Guía de Introducción a GAMS
MODEL STATISTICS
Después de las estadísticas, se presenta un resumen del problema ejecutado (Figura 15).
GAMS indica el nombre del modelo a resolver, la función objetivo, el sentido de la
optimización, el solver utilizado (CONOPT) y el tipo de solución obtenida (óptimo, optimo
local, etc.). Esta última información es muy importante: debemos siempre verificar que
GAMS ha encontrado una solución óptima, es decir, que MODEL STATUS es 1 (Optimal).
S O L V E S U M M A R Y
23 / 59
Guía de Introducción a GAMS
Observamos que para cada ecuación y cada variable del modelo, GAMS muestra el nivel
elegido (LEVEL), así como el valor marginal (MARGINAL) y los límites inferior (LOWER) y
superior (UPPER). La solución óptima es X(trigo)=30 ha y X(maiz)=20 ha. El valor máximo
de la variable objetivo es Z=33500 euros.
Los términos del lenguaje GAMS se pueden clasificar en dos grupos (Tabla 5):
El lenguaje GAMS es un lenguaje de programación y, como tal, tiene reglas muy estrictas
de escritura. El modelo puede escribirse con cualquier editor de texto pero sin utilizar
formatos particulares ni tabulaciones (el archivo que contiene el modelo debe estar escrito
en texto plano).
24 / 59
Guía de Introducción a GAMS
2. Los elementos del código GAMS se identifican por tipo. La creación de cada elemento
comporta dos pasos: declaración y atribución. La declaración consiste en indicar el tipo
de elemento y darle un nombre. La atribución o definición consiste en asignar valores
o forma al elemento.
3. GAMS lee el modelo de principio a fin, de modo que no podemos utilizar un elemento
antes de que haya sido declarado (el orden de los elementos puede variar siempre que
ningún símbolo se utilice antes de ser declarado).
4 De esta forma, podemos introducir comentarios de más de una línea, así como utilizar acentos y otros símbolos
prohibidos, como la letra ñ.
25 / 59
Guía de Introducción a GAMS
8. Los identificadores (los nombres asignados a los elementos) deben obedecer las
siguientes reglas: a) comenzar por una letra; b) tener un máximo de 63 caracteres, c)
contener únicamente caracteres alfanuméricos, es decir, no incluir signos como @ ? "
( ) % $ (Tabla 7).
10. Además del punto y coma (finaliza una expresión), otros delimitadores importantes son
la coma (separa elementos) y la barra inclinada (da comienzo y fin a listas de datos).
26 / 59
Guía de Introducción a GAMS
set S /a,b,c/;
1. comenzar con la palabra clave set (sets) para indicar que vamos a introducir uno o
varios conjuntos,
2. dar un nombre diferente (identificador) a cada set, dejar un espacio, y añadir un texto
(comentario) si se desea,
3. asignar los elementos (etiquetas) de cada conjunto entre signos slash (/),
Los comentarios no forman parte del código GAMS y, por tanto, no son necesarios.
Pero resultan muy útiles para hacer fácilmente comprensible el modelo, tanto para
el modelizador como para otros potenciales usuarios. Conviene recordar que no
está permitido utilizar símbolos especiales tampoco en los comentarios.
set
nombre_set1 “comentario” /etiquetal_1, etiquetal_2,…, etiquetal_N/
nombre_set2 “comentario”
/etiqueta2_1 “comentario”
etiqueta2_2 “comentario”
etiqueta2_3 “comentario”
...
etiqueta2_N/
nombre_set3 “comentario”
;
27 / 59
Guía de Introducción a GAMS
Es posible crear un conjunto sin especificar los elementos que lo componen, como en el
conjunto nombre_set3. Es decir, es posible, asignar el nombre y el tipo (declaración) y
dejar la asignación de elementos (atribución o definición) para un enunciado posterior.
Si los elementos de un conjunto están ordenados (siguen una secuencia), es posible utilizar
el asterisco para simplificar la escritura. Por ejemplo, los conjuntos:
set
M meses /M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11, M12/
T tiempo /T1,T2, T3, T4, T5/
;
set
M meses /M1*M12/
T tiempo /T1*T5/
;
4.2.2 Alias
A veces resulta útil dar dos nombres diferentes al mismo conjunto de elementos. La palabra
clave que permite hacer esto es alias.
Para ello, una vez que hayamos declarado un conjunto, por ejemplo set_a, y le hayamos
asignado los elementos correspondientes, la instrucción a escribir es:
alias(set_a, set_aa);
28 / 59
Guía de Introducción a GAMS
Esta instrucción equivale a crear un conjunto set_aa que contiene los mismos elementos
que el conjunto set_a.
Esto resulta particularmente útil en los modelos input-output donde cada producto puede
ser utilizado en la producción de otros productos. En economía de la explotación agraria,
resulta útil para introducir rotaciones de cultivo o cuando deseamos introducir datos de
rendimiento para cada cultivo en función del precedente cultural:
set
C cultivos /trigo, maiz, girasol, remolacha, patata / ;
4.2.3 Subconjuntos
set
set1 “comentario” /etiquetal_1, etiquetal_2,…, etiquetal_N/
subset11 es un subconjunto del conjunto set1 que contiene únicamente los dos primeros
elementos del conjunto set1.
set
C cultivos /trigo, maiz, girasol, remolacha, patata /
CC(C) cereales / trigo, maiz /
;
29 / 59
Guía de Introducción a GAMS
Por ejemplo, podemos definir CI(C,I) como conjunto multidimensional que corresponde al
conjunto de combinaciones posibles de cultivos (C) y técnicas de cultivo (I):
set
C cultivo /trigo, maiz, tomate/
I itinerario tecnico /extensivo, intensivo/
CI(C,I) actividades productivas /trigo.extensivo
trigo.intensivo
maiz.extensivo
maiz.intensivo
tomate.intensivo/
;
4.3.1 Escalares
La palabra clave scalar se utiliza para definir un parámetro de dimensión cero, es decir, un
parámetro que no está definido sobre un índice.
30 / 59
Guía de Introducción a GAMS
1. comenzar con la palabra clave scalar (scalars) para indicar que vamos a introducir datos
simples,
2. dar un nombre específico (identificador) a cada escalar y añadir un comentario si se
desea,
4. asignar el valor entre signos slash (/),
5. terminar el enunciado con un punto y coma (;).
scalar
nombre_sca1 “comentario” /valor1/
nombre_sca2 “comentario”
nombre_sca3 “comentario” /valor3/
;
scalar
DS disponibilidad de superficie (ha) /50/
DT disponibilidad de trabajo familiar (horas) /1800/
;
4.3.2 Parámetros
La palabra clave parameter permite introducir datos con una o más dimensiones, es decir,
parámetros con uno o varios índices. Esta clave permite igualmente realizar cálculos, como
veremos en la sección siguiente.
1. comenzar con la clave parameter para indicar que vamos a introducir datos,
2. dar un nombre específico a cada parámetro señalando entre paréntesis sus dominios de
definición (separados por comas si hay varios) y añadir eventualmente un comentario,
4. asignar los valores entre signos slash (/),
5. terminar el enunciado con un punto y coma (;).
31 / 59
Guía de Introducción a GAMS
Los parámetros pueden tener hasta diez dimensiones diferentes. Si existe más de una
dimensión, en la asignación de valores los elementos se separan con puntos.
En el modelo ejemplo1.gms (primer ejemplo), las necesidades de mano de obra por cultivo
y el margen bruto del cultivo son parámetros:
parameter
NT(C) 'necesidades de trabajo (horas/ha)' /trigo 20, maiz 60/
MB(C) 'margen bruto (euros/ha)' /trigo 450, maiz 1000/
;
4.3.3 Tablas
Los parámetros con dos o más dimensiones pueden escribirse en forma de tablas. En
general, se repiten las reglas presentadas para los parámetros:
Destaquemos que, a diferencia de los datos introducidos con la palabra clave parameter,
los elementos introducidos con la clave table no se introducen entre signos slash (/).
Siempre la primera dimensión de la tabla se introduce en filas y la última en columnas.
32 / 59
Guía de Introducción a GAMS
Si una tabla tiene muchas columnas de forma que no es posible introducir todos
los datos en una misma línea, podemos fragmentar la tabla utilizando el signo "+"
para indicar que la tabla continúa debajo.
Una tabla puede tener hasta 10 dimensiones diferentes. Es posible escribir varios índices
en la misma fila o en la misma columna, separándolos por puntos. Recordemos que el
primer índice de cada fila debe corresponder al primer dominio de definición y el último
índice de cada columna debe corresponder al último dominio de definición, es decir, es
preciso respetar el orden.
Todas las formas que hemos comentado para condensar la escritura de los sets
pueden utilizarse también aquí.
Las instrucciones de atribución de valores nos permiten definir o modificar los valores
asociados a los escalares y a los parámetros.
Podemos utilizar estas instrucciones para asignar valores a los escalares y a los parámetros
declarados con anterioridad. Por ejemplo, el escalar nombre_sca2 fue declarado en la
sección 4.3.1 pero sin atribuirle un valor. Podemos atribuirle un valor ahora escribiendo:
nombre_sca2= valor2;
Recordad que la atribución de valores no comienza por una palabra clave (puesto
que la entidad nombre_sca2 ya se ha declarado previamente como un scalar) y que
cada expresión debe terminar con un punto y coma (;).
MB('trigo') = 480;
Por otro lado, podemos obtener nuevos datos realizando cálculos con datos introducidos
previamente. En este caso, conviene utilizar la clave parameter independientemente de
cuál sea la dimensión, así como separar la declaración del parámetro y la atribución de
valor (que se realizará en este caso utilizando una fórmula de cálculo) por un signo punto
y coma (;):
parameter nombre_par(dominio);
nombre_par(dominio) = formula de calculo;
33 / 59
Guía de Introducción a GAMS
GAMS utiliza los símbolos habituales para las operaciones aritméticas corrientes (Tabla 8).
Símbolo Descripción
+ adición
- sustracción
* multiplicación
/ división
** exponenciación
parameter
NT(C) 'necesidades de trabajo (horas/ha)' /trigo 20, maiz 60/
MB(C) 'margen bruto (euros/ha)' /trigo 450, maiz 1000/
;
parameter
RDT(C) rendimiento de cultivo /TRIGO 5, MAIZ 10/
PC(C) precio del producto /TRIGO 150, MAIZ 150/
CV(C) costes variables /TRIGO 300, MAIZ 500/
;
parameter
MB(C) margen bruto del cultivo (euros por hectarea)
MB(C)= RDT(C)*PC(C) - CV(C);
Para realizar cálculos sobre índices, podemos utilizar los siguientes operadores (Tabla 9).
Operador Descripción
sum suma
prod producto
smin valor más pequeño
smax valor más grande
operador((dominio1,dominio2), expresion);
34 / 59
Guía de Introducción a GAMS
Función Descripción
exp exponencial
log logaritmo
sqr cuadrado
sqrt raíz cuadrada
power potencia
Las variables en lenguaje GAMS corresponden a las variables endógenas en economía, a las
columnas o actividades en programación lineal, o a las variables de decisión en
investigación de operaciones.
La palabra clave variable anuncia que vamos a introducir variables endógenas, cuyos
valores serán determinados en el proceso de optimización. En general, la declaración de
las variables es similar a la declaración de los parámetros. De este modo, para cada
variable se establece un nombre, se especifica el dominio de definición y eventualmente
se introduce un comentario:
Límite Límite
Palabra clave Descripción
inferior superior
FREE -inf +inf variable libre
POSITIVE 0 +inf variable positiva
NEGATIVE -inf 0 variable negativa
BINARY 0 1 variable binaria
INTEGER 0 100 variable entera
35 / 59
Guía de Introducción a GAMS
Existen dos métodos alternativos para declarar las variables y especificar la clase: a)
declarar primero todas las variables y especificar a continuación la clase para las variables
no libres; b) efectuar la declaración de las variables por clase. El cuadro que se presenta
a continuación ilustra ambos métodos para el modelo ejemplo1.gms (Tabla 12).
Para fijar el límite superior o inferior de una variable, utilizamos los sufijos que acabamos
de presentar. Así, por ejemplo, para indicar que el valor superior que puede tomar la
variable nombre_var es valor, escribiremos:
nombre_var.UP(dominio) = valor;
En los modelos lineales, los límites por defecto (ver Tabla 11) son suficientes en la mayor
parte de los casos. Por el contrario, en los modelos no lineales es recomendable definir
límites para evitar operaciones indefinidas (división por cero, por ejemplo) o para definir
un espacio de soluciones “razonable” (lo que ayudará al programa a resolver el problema).
36 / 59
Guía de Introducción a GAMS
También es posible fijar el valor que puede tomar la variable. Para ello utilizamos
el sufijo .fx.
La introducción de las ecuaciones en GAMS se realiza en dos etapas. En primer lugar, todas
las ecuaciones deben ser declaradas y, a continuación, cada ecuación debe ser formulada.
La forma de introducir las ecuaciones es la siguiente:
equation
nom_eq2 “comentario”
nom_eq1 “comentario”
...
nom_eqN “comentario”
;
Los nombres de las ecuaciones deben respetar las reglas enunciadas para el resto de
identificadores. Es preciso introducir un punto y coma (;) al final de la declaración de todas
las ecuaciones, y también al final de la formulación de cada ecuación.
37 / 59
Guía de Introducción a GAMS
La mención del dominio de definición de una ecuación permite, como para las variables o
los parámetros de cálculo, beneficiarse de comodidad de la escritura con índices. Así, por
ejemplo, para expresar una restricción mensual no es preciso escribir la ecuación doce
veces sino una sola.
En el caso en el que una ecuación no se defina para todos los elementos de un conjunto,
sino sólo para algunos de ellos, podemos utilizar etiquetas de forma explícita en las
ecuaciones. Por ejemplo, si en el modelo ejemplo1.gms queremos introducir una restricción
para indicar que la superficie de maíz no puede exceder de 20 hectáreas, escribiremos:
El comando model permite dar un nombre al modelo así como identificar las ecuaciones
que forman parte de ese modelo. Si todas las ecuaciones definidas con anterioridad forman
parte del modelo que queremos resolver, utilizamos la palabra clave ALL; en caso contrario
es preciso especificar el nombre de las ecuaciones implicadas.
o bien
El comando solve se utiliza para dar a GAMS las instrucciones de resolución del problema.
Indica:
38 / 59
Guía de Introducción a GAMS
1. El modelo a resolver,
2. El tipo de cálculos a realizar:
- Programación lineal LP (linear programming)
- Programación no lineal NLP (non linear programming)
- Programación mixta MIP (mixed integer programming)
- Otros.
3. El sentido de la optimización (MAXIMIZING o MINIMIZING)
4. La variable a optimizar.
La variable objetivo (nombre_varobj) debe ser una variable libre y debe aparecer
al menos una vez en las ecuaciones.
Con esta instrucción estamos diciendo a GAMS que tiene que resolver (SOLVE) un modelo
que se llama ejemplo1 utilizando (USING) un algoritmo de cálculo de programación lineal
(LP) y maximizando (MAXIMIZING) la variable Z. GAMS puede resolver differentes tipos de
modelos (Tabla 15).
39 / 59
Guía de Introducción a GAMS
El modelizador puede cambiar algunos atributos de los modelos utilizando para ello
opciones. Algunas de las más utilizadas se presentan en la Tabla 16.
La primera parte del archivo de resultados es siempre el echo print, donde GAMS presenta
el modelo (elementos del archivo .gms) añadiendo números de línea.
40 / 59
Guía de Introducción a GAMS
Además de señalar los errores, GAMS da información sobre la naturaleza de los mismos y
sugerencias para corregirlos.
En el archivo .log, gams señala el error en una línea en rojo que comienza con
tres asteriscos (***) y la palabra error seguida de un número que indica la
naturaleza del error. A continuación, sugiere la forma de corregirlo. Haciendo doble
clic en la línea roja, gams se posiciona en el archivo .gms al lado del error.
En el archivo .lst, gams señala el error con cuatro asteriscos (****) y el símbolo
$ seguido de un número que indica la naturaleza del error. Las sugerencias para
corregir el error se presentan justo después del echo print del modelo.
La mayor parte de los errores tienen lugar porque olvidamos declarar un identificador,
olvidamos un punto y coma (;), declaramos una ecuación sin definirla o a la inversa, etc.
También puede ocurrir que GAMS no muestre mensajes de error pero que el modelo no
proporcione los resultados esperados. Esto puede deberse a que existen errores de
escritura que GAMS no puede detectar porque no se trata de errores de lenguaje. Para
evitarlos, debemos verificar que la escritura de las ecuaciones es correcta. Para ello,
debemos observar la escritura detallada de las ecuaciones (que se encuentra en el archivo
.lst) y verificar que corresponde a aquello que queríamos expresar.
41 / 59
Guía de Introducción a GAMS
Las ecuaciones se presentan de forma detallada, permitiendo así verificar que la escritura
es correcta. Recordemos que GAMS detecta los errores de lenguaje pero no otros errores,
por lo que siempre es necesario comprobar que las ecuaciones son correctas.
Las ecuaciones del modelo pueden agruparse en bloques (como en la escritura algebraica).
En este caso, en el archivo de salida, GAMS presenta las tres primeras ecuaciones de cada
bloque. El modelizador puede cambiar el número de ecuaciones presentadas utilizando la
opción LIMROW. Por ejemplo, si escribimos:
OPTION LIMROW = 1;
42 / 59
Guía de Introducción a GAMS
Z
(.LO, .L, .UP, .M = -INF, 0, +INF, 0)
1 MARGEN
X(TRIGO)
(.LO, .L, .UP, .M = 0, 0, +INF, 0)
-450 MARGEN
1 TIERRA
20 TRABAJO
X(MAIZ)
(.LO, .L, .UP, .M = 0, 0, +INF, 0)
-1000 MARGEN
1 TIERRA
60 TRABAJO
Como acabamos de ver para las ecuaciones, cuando se trata de variables con varias
dimensiones (como la variable X del ejemplo precedente), GAMS presenta las tres primeras
variables del bloque. Siempre es posible cambiar esta opción por defecto utilizando la
palabra clave LIMCOL. Por ejemplo, si escribimos en el ejemplo1.gms :
OPTION LIMCOL = 1;
4.7.3.3 Estadísticas
Después de la presentación de las ecuaciones y las variables, GAMS da algunas estadísticas,
principalmente el número de ecuaciones (bloques de ecuaciones y ecuaciones simples), el
número de variables (bloques de variables y variables simples) y el número de elementos
no nulos de la matriz (Figura 20).
43 / 59
Guía de Introducción a GAMS
MODEL STATISTICS
S O L V E S U M M A R Y
En esta sección se indica el nombre del modelo (EJEMPLO), la función objetivo (Z), el tipo de
problema (LP), el sentido de la optimización (MAXIMIZE), el solver utilizado (CONOPT) y la
línea donde se encuentra el comando SOLVE (84).
44 / 59
Guía de Introducción a GAMS
El model status indica el tipo de solución encontrada por el solver (Tabla 18):
Siempre es necesario verificar que el model status es OPTIMAL (para los modelos lineales),
LOCALLY OPTIMAL (modelos no lineales) o INTEGER SOLUTION (modeles con variables enteras).
45 / 59
Guía de Introducción a GAMS
Los valores LEVEL y MARGINAL son determinados por el solver. GAMS utiliza la notación
siguiente (Tabla 19):
Símbolo Descripción
- INF -∞
+ INF +∞
. 0
EPS epsilon (valor muy próximo a cero)
Una forma de verificar que el solver ha encontrado una solución óptima consiste en verificar
que el report summary es como sigue:
46 / 59
Guía de Introducción a GAMS
Una condición lógica es una expresión que puede ser verdadera o falsa. GAMS utiliza
números como condiciones lógicas : así, un resultado verdadero se representa por 1 y un
resultado falso por 0.
Operador Descripción
LT, < estrictamente menor que
LE, <= menor o igual que
EQ, = igual a
NE, <> no igual a
GE, >= mayor o igual que
GT, > estrictamente mayor que
Operador Descripción
NOT no
AND y
OR o (uno u otro)
XOR o (uno u otro pero no los dos)
Así, por ejemplo, dadas dos expresiones a y b, podemos expresar las condiciones lógicas
siguientes (Tabla 22):
47 / 59
Guía de Introducción a GAMS
5.1.2 El operador $
El operador $ permite introducir condiciones en los cálculos o en las ecuaciones del modelo.
Por ejemplo, si queremos escribir:
parameter a /10/
b /10/
;
a$(b > 15) = 2 ;
parameter a /10/
b /10/
;
a = 2$(b > 15);
48 / 59
Guía de Introducción a GAMS
Como ya hemos comentado, un conjunto puede ser declarado como una secuencia. Por
ejemplo:
El operador ord resulta muy útil para expresar cantidades que varían según una regla
aritmética. Por ejemplo, si un país tiene 56 millones de habitantes en el periodo base y la
tasa de crecimiento de la población es de 1,5 % anual, entonces el número de habitantes
en un periodo genérico posterior puede expresarse:
poblacion(t) = 56 * (1,015**(ord(t)-1));
49 / 59
Guía de Introducción a GAMS
Para indicar el paso del tiempo en los modelos dinámicos, podemos utilizar operadores
lineales (+, -) y circulares (++, --).
Los operadores lineales se utilizan para modelizar periodos de tiempo que no se repiten,
por ejemplo, los años. Los operadores circulares, en cambio, se utilizan para representar
periodos de tiempo que pueden repetirse, como los meses. En este caso, se considera que
el primer y el último periodo son adyacentes, de forma que «último ++ 1» es igual a
«primero» y «primero -- 1» es igual a «último».
set t /2001,2002,2003,2004,2005/
option decimals=0;
display a,b,c;
50 / 59
Guía de Introducción a GAMS
---- 12 PARAMETER a
2001 11, 2002 12, 2003 13, 2004 14, 2005 15
---- 12 PARAMETER b
2002 11, 2003 12, 2004 13, 2005 14
---- 12 PARAMETER c
2001 10, 2002 11, 2003 12, 2004 13, 2005 14
En el caso de los operadores circulares, todos los términos están definidos. El siguiente
ejemplo ilustra el uso de operadores circulares:
51 / 59
Guía de Introducción a GAMS
En cambio, la formulación:
Para obtener una presentación más concisa de los resultados, podemos utilizar el comando
display.
52 / 59
Guía de Introducción a GAMS
El comando display también resulta útil para mostrar cálculos intermediarios que no
provienen de la optimización. Es, por ejemplo, el caso de los parámetros de cálculo. Si
queremos que GAMS presente en el archivo de salida los valores de los parámetros de
cálculo, utilizamos el comando display:
También podemos elegir el formato de salida con el comando option. Por ejemplo, si
queremos que GAMS muestre los parámetros con dos cifras decimales, escribiremos:
option nombre_par1:2;
Si los parámetros están definidos sobre varios índices, es posible especificar el formato de
presentación de los resultados. Por ejemplo:
option nombre_par2:2:1:1;
Especifica que deseamos dos cifras decimales, un índice por fila y un índice por columna.
El comando display permite seleccionar y reagrupar los resultados del problema. También
permite realizar cálculos utilizando los resultados. Para ellos, podemos crear parámetros
de resultados después del comando solve, incluyendo las informaciones que nos interesen.
loop(set_control,expresion);
Si hay más de un índice de control, se introducen entre paréntesis y separados por comas.
53 / 59
Guía de Introducción a GAMS
Veamos un ejemplo del primer tipo de utilización. Queremos expresar el precio del agua
en distintos escenarios. Para ello, creamos un conjunto de escenarios:
y definimos un parámetro indicando el aumento del precio del agua a partir de un nivel
base:
loop(L,
TM3 = 30 + 2*ord(l);
solve MOD_LOOP using LP maximizing Z;
);
De esta forma, GAMS resolverá el modelo cinco veces, tomando cada vez un valor diferente
para el parámetro tm3.
Nota: está prohibido declarar parámetros dentro de un loop (si podemos, sin
embargo, cambiar la definición de un parámetro) y también está prohibido definir
ecuaciones dentro de un loop).
54 / 59
Guía de Introducción a GAMS
Esta versión de demostración incluye todos los solvers disponibles, pero el tamaño de los
modelos que pueden ejecutarse está limitado a:
55 / 59
Guía de Introducción a GAMS
Seleccionar el directorio del disco duro donde vamos a instalar el programa. Podemos
dejar la opción por defecto (Figura 25) o elegir otro directorio, pero es importante
instalar el programa en un directorio de nombre corto (por ejemplo, C:\GAMS):
56 / 59
Guía de Introducción a GAMS
Una vez copiados los archivos, el programa de instalación pregunta si queremos copiar
la licencia de GAMS (si estamos instalando la versión DEMO elegimos “No license, demo
only”) y finalizaremos la instalación (Figura 28).
57 / 59
Guía de Introducción a GAMS
Una vez completada la instalación, podemos comenzar a utilizar GAMS. Para ello, resulta
muy útil crear un icono de acceso directo a partir del archivo gamside.exe (que se
encuentra en la carpeta en la que hemos instalado el programa). Haciendo doble clic en el
icono, aparecerá la ventana principal de GAMS (Figura 29).
58 / 59
Guía de Introducción a GAMS
Una vez que hemos creado o abierto un modelo, podemos ejecutarlo haciendo clic en
el icono RUN GAMS. Durante el proceso de resolución, aparece una ventana process
window que indica las diferentes etapas seguidas por GAMS en la resolución del
problema.
Una vez finalizado el proceso de resolución, GAMS presenta los resultados en un archivo
de salida. Este archivo tiene el mismo nombre que el archivo de entrada pero con la
extensión .lst.
• COLORS: GAMS permite diferenciar las entidades del modelo por el color
• DOCS: documentos de ayuda en formato pdf (guía de utilización, ayuda para cada
solver, etc.). Podemos ampliar esta sección añadiendo nuevos documentos de ayuda
(.pdf o bien .html) a la carpeta c:\gams\docs.
59 / 59