Está en la página 1de 10

Presentaremos un ejemplo detallado del uso de GAMS para formular, resolver y analizar un

sencillo problema de optimizacin.


En un problema comn de transporte, nos dan la capacidad de produccin de varias plantas
y la demanda en varios mercados para un determinado producto, y nos dan los costos
unitarios de transporte desde las plantas hasta cada mercado. La pregunta es: Cuanto de
debe transportar desde cada planta hasta cada uno de los mercados para minimizar el costo
total de transporte?.
En la siguiente tabla se dan los datos del problema.
PLANTA

DISTANCIA A LOS MERCADOS (100 MILLAS)


NUEVA YORK
CHICAGO
TOPEKA

SEATTLE
SAN DIEGO
DEMANDAS

2.5
1.7
2.5
1.8
325
300
Tabla 1: Datos para el problema de transporte.

PRODUCCIN

1.8
1.4
275

350
600

El costo de transporte es de $90.00 por unidad y por cada 1000 millas.


La representacin algebraica de este problema es presentada usualmente en un formato
similar al siguiente:
Indices:
i = plantas
j = mercados
Datos:
ai = capacidad de suministro de productos de la planta i
bj = demanda de productos del mercado j
cij = costo de envo entre la planta i y el mercado j
Variables de decisin:
xij = cantidad de productos a enviar de la planta i al mercado j, donde xij > 0, para todos los
i,j
Restricciones:
Lmite de suministro de la planta i:

para toda i

Satisfaccin de la demanda del mercado j:

para toda j

Funcin objetivo:

Note que este simple ejemplo, revela algunas prcticas que referimos como buenos
hbitos en general y que son consistentes con el diseo en GAMS. Primero, todas las
entidades son identificados (y agrupadas) por su tipo. Segundo, el orden de las entidades es
elegido de tal forma que ningn smbolo est referido sin ser antes definido.Tercero, las
unidades de todas las entidades estn especificadas, y cuarto, las unidades son elegidas a
una escala tal que los valores numricos a ser encontrados en la optimizacin, tengan un
orden de magnitud relativamente pequeo.
Los nombres de los tipos de las entidades pueden diferir dependiendo de los programas. Por
ejemplo, la terminologa adaptada en GAMS es la siguiente: los indices son llamados sets,
los datos son llamados parameters, las variables de decisin son llamadas variables, y las
restricciones y la funcin objetivo son llamadas equations.
La presentacin en GAMS de este problema es la siguiente:
Sets
i plantas / seattle, san-diego /
j mercados / new-york, chicago, topeka / ;
Parameters
a(i) capacidad de cada planta
/ seattle 350
san-diego 600 /
b(j) demanda del mercado j / new-york 325, chicago 300, topeka 275 / ;
Table d(i,j) tabla de datos de distancias en miles de millas
new-york chicago topeka
seattle
2.5
1.7
1.8
san-diego 2.5
1.8
1.4 ;
*
Scalar f flete en dlares por unidad por cada mil millas /90/ ;
Parameter c(i,j) costo de transporte en miles de dlares por unidad;
c(i,j) = f * d(i,j) / 1000 ;
Variables
x(i,j) cantidades transportadas
z costo total de transporte en miles de dlares ;
Positive Variable x ;
Equations
cost define la funcin objetivo
supply(i) limite de produccin en la planta i
demand(j) demanda a satisfacer en el mercado j ;
cost .. z =e= sum((i,j), c(i,j)*x(i,j)) ;

supply(i) .. sum(j, x(i,j)) =l= a(i) ;


demand(j) .. sum(i, x(i,j)) =g= b(j) ;
Model transport /all/ ;
Solve transport using lp minimizing z ;
Display x.l, x.m ;
En las prximas entradas, describiremos brevemente los componentes bsicos de un
modelo GAMS en referencia al ejemplo anterior.

TUTORIAL DE GAMS - Estructura de un modelo en GAMS


TUTORIAL DE GAMS - SETS
TUTORIAL DE GAMS - Data (Datos)
TUTORIAL DE GAMS - Equations

SETS

Sets son bloques bsicos de construccin de un modelo en GAMS, correspondiendo


exactamente a los ndices en las representaciones algebraicas de los modelos. El ejemplo de
transporte contiene una declaracin Set:

Sets
i plantas / seattle, san-diego /
j mercados / new-york, chicago, topeka / ;
El objeto de esta declaracin es evidente. Declaramos dos sets y les damos los nombres i y j.
Tambin en esa declaracin, asignamos miembros o elementos a los sets como se presenta a
continuacin:
i = {Seattle, San Diego}
j = {New York, Chicago, Topeka}
Note la diferencia entre el formato GAMS y el formato utilizado en matemticas. GAMS usa
slashes (/) en lugar de llaves de conjunto ({}), simplemente porque no todos los teclados tienen
las teclas de llaves. Observe tambin que los nombres con ms de una palabra como New
York, no son permitidos, por lo cual se debe insertar un guin como en el ejemplo.
Las palabras en minsculas en las declaraciones set anteriores, son llamadas textos (text).
Los textos son opcionales. Estn all solo para documentacin interna, sirviendo para un

propsito no formal en el modelo. El compilador de GAMS no hace el intento de interpretar en


texto, pero si lo guarda y lo repite varias veces para su conveniencia.
No es necesario combinar la creacin de los sets i y j en una sola declaracin. Puedes
colocarlos en declaraciones separadas como se muestra:
Set i plantas /seattle, san-diego/;
Set j mercados /new-york, chicago, topeka/ ;
Tambin se puede utilizar un asterisco (*) en los casos de elementos que siguen una
secuencia. Por ejemplo, las siguientes declaraciones son sets vlidas en GAMS.

Set t perodos de tiempo /1991*2000/;


Set m mquinas /maq1*maq24/ ;

El efecto es el siguiente:
t = {1991, 1992, 1993, ... , 2000}
m = {maq1, maq2, maq3, ..., maq24}
Note que los elementos del set son almacenados como cadenas de caracteres, as los
elementos de t no son nmero. Otra forma conveniente es la declaracin de "alias", la cual es
usada para dar otro nombre a un set declarado previamente. En el ejemplo siguiente:
Alias(t,tp);
El nombre tp es como t en notacin matemtica. Es til en modelos que son concernientes
con iteraciones de elementos de un mismo set.
Los set i, j, t y m son ejemplos de sets estticos, es decir, son asignados sus miembros
directamente por el usuario y no cambian. En GAMS se pueden crear sets dinmicos, los
cuales adquieren sus nombres como por ejemplo por medio de operaciones lgicas. Este tipo
de set se tratarn ms adelante.

TUTORIAL DE GAMS - Estructura de un modelo en GAMS


TUTORIAL DE GAMS - SETS
TUTORIAL DE GAMS - Data (Datos)
TUTORIAL DE GAMS - Equations

El problema de transporte que estamos analizando, muestra los tres formatos que estn
disponibles para introducir datos. Los tres formatos son:

List (lista)
Tables (Tablas)
Direct assignments (Asignacin directa)
Introduciendo datos por lista (List).
El primer formato se presenta en la primera declaracin del ejemplo, el cual repetimos a
continuacin:
Parameters
a(i) capacidad de cada planta
/ seattle 350
san-diego 600 /
b(j) demanda del mercado j / new-york 325, chicago 300, topeka 275 / ;

Esta declaracin tiene varios efectos. Son evidentes pero vale la pena analizarlos en detalle.
Se declara la existencia de dos parmetros, dandole los nombres de a y b, y se declaran sus
dominios i y j respectivamente. (Un dominio es el set, o grupos de sets, sobre el cual un
parmetro, variable o ecuacin es definida). La declaracin tambin tiene un texto de notas
para cada parmetro y asigna los valores a(i) y b(j) a cada elemento de i y de j. Es
perfectamente aceptable separar esta declaracin en dos si lo prefiere:
Parameter
a(i) capacidad de cada planta
/ seattle 350
san-diego 600 /;
Parameter
b(j) demanda del mercado j / new-york 325, chicago 300, topeka 275 / ;

Debe recordar lo siguiente cuando utilice el formato List:


1.
La lista de los elementos del dominio y sus respectivos valores de parmetros
pueden ser colocados en la forma que desee. La nica regla es que la lista debe ser
encerrada entre "/" (slashes) y que los pares de elemento-valore pueden ser separados por
comas (,) o colocados en lneas separadas.
2.
No hay punto y coma (;) separando la lista de los pares elemento-valor del nombre,
dominios y texto que lo precede. Esto es porque la misma declaracin est siendo usada
para declarar y asignar cuando se usa el formato List. (Una lista de pares elemento-valor
por si misma no es aceptada por GAMS y el resultado ser un mensaje de error).
3.
El compilador de GAMS tiene una inusual funcin llamada domain checking
(revisin del dominio), la cual verifica que cada elemento del dominio de la lista sea de
hecho un miembro del set apropiado. Por ejemplo, si escribi "seattle" correctamente en la
declaracin de set, pero escribi "seatle" en la siguiente lista de pares elemento-valor, el
compilador de GAMS le dar un mensaje de error de que el elemento "seatle" no pertenece
al set i.

4.

Cero (0) es el valor por defecto de todos los parmetros. Por lo tanto, solamente
necesita incluir entrada de datos que no sean ceros en la lista de pares elemento-valor, y
pueden ser introducidos en cualquier orden.
5.
Un escalar es considerado un parmetro que no tiene dominio. Puede ser declarado
y asignado en una declaracin Scalar contenida en una lista degenerada (degenerate) de un
solo valor, como en la siguiente declaracin de nuestro ejemplo:
Scalar f flete en dlares por unidad por cada mil millas /90/ ;
Si un dominio de un parmetro tiene dos o ms dimensiones, puede sin embargo
tener sus valores introducidos por el formato List. Este es muy til para introducir
conjunto que son muy densos (teniendo pocos valores no ceros) y super-poco denso
(teniendo pocos valores distintos a no ceros).

Introduciendo datos por tablas (Tables).


Los practicantes de Optimizacin han notado que la mayora de los datos de entrada para
un modelo grande provienen de tablas de nmeros relativamente pequeas. As es muy til
tener el formato de tablas (Tables) para introducir datos. Un ejemplo de tablas de dos
dimensiones o matriz es mostrado en nuestro ejemplo:
Table d(i,j) tabla de datos de distancias en miles de millas
new-york chicago
seattle
2.5
1.7
san-diego 2.5
1.8

topeka
1.8
1.4 ;

El efecto de esta declaracin es para declarar el parmetro d y para especificar su


dominio como un conjunto de pares ordenados en el producto Cartesiano de i y j. Los
valores de d tambin son dados en esta declaracin bajo el apropiado
encabezamiento. Si hay entradas en blanco en la tabla, son interpretadas como ceros.
Como en el formato List, GAMS ejecutar la funcin domain checking para estar
seguro que los nombres de las filas y las columnas son miembros de los sets
apropiados.

Introduciendo datos por Asignacin Directa (Direct Assignment).


El mtodo de asignacin directa de entrada de datos difiere de los mtodos de listas y
tablas en que divide la labor de declaracin de parmetro y asignacin de parmetro
en declaraciones separadas. El modelo de transporte contiene el ejemplo de este
mtodo.
Parameter c(i,j) costo de transporte en miles de dlares por unidad;
c(i,j) = f * d(i,j) / 1000 ;
Es importante hacer nfasis en la presencia del punto y coma (;) al final de la primera
lnea. Sin ste, el compilador interpretar ambas lneas como parte de la misma
declaracin. (GAMS fallara al distinguir una interpretacin vlida, as le enviara un
breve pero til mensaje de error).

Los efectos de la primera declaracin eson declarar el parmetro c, especificar el


dominio (i,j), y proveer alguna nota explicativa. La segunda declaracin asigna a c(i,j)
el producto de los valores de los parmetros f y d(i,j). Naturalmente, sto es legal en
GAMS solamente si has asignado ya valores a f y d(i,j) en las declaraciones previas.
La asignacin directa de arriba aplica a todos los pares (i,j) en el dominio de c. Si
desea hacer asignaciones para elementos especficos en el dominio, encierre los
nombres de los elementos entre apostrofes. Por ejemplo:
c(`seattle, `new-york) = 0.40;
es una declaracin de asignacin en GAMS.
Al mismo parmetro puede ser asignado un valor ms de una vez. Cada declaracin
de asignacin toma efecto inmediatamente y anula el valor previo. (En contraste, el
mismo parmetro no puede ser declarado ms de una vez. Este error comn, revise
para evitar el uso de un mismo n0ombre para dos cosas diferente).

TUTORIAL DE GAMS - Estructura de un modelo en GAMS


TUTORIAL DE GAMS - SETS
TUTORIAL DE GAMS - Data (Datos)
TUTORIAL DE GAMS - Equations

El problema de transporte que estamos analizando, muestra los tres formatos que estn
disponibles para introducir datos. Los tres formatos son:

List (lista)
Tables (Tablas)
Direct assignments (Asignacin directa)
Introduciendo datos por lista (List).
El primer formato se presenta en la primera declaracin del ejemplo, el cual repetimos a
continuacin:

Parameters
a(i) capacidad de cada planta
/ seattle 350
san-diego 600 /
b(j) demanda del mercado j / new-york 325, chicago 300, topeka 275 / ;
Esta declaracin tiene varios efectos. Son evidentes pero vale la pena analizarlos en detalle.
Se declara la existencia de dos parmetros, dandole los nombres de a y b, y se declaran sus
dominios i y j respectivamente. (Un dominio es el set, o grupos de sets, sobre el cual un
parmetro, variable o ecuacin es definida). La declaracin tambin tiene un texto de notas

para cada parmetro y asigna los valores a(i) y b(j) a cada elemento de i y de j. Es
perfectamente aceptable separar esta declaracin en dos si lo prefiere:

Parameter
a(i) capacidad de cada planta
/ seattle 350
san-diego 600 /;

Parameter
b(j) demanda del mercado j / new-york 325, chicago 300, topeka 275 / ;

1.

2.

3.

4.

5.

Debe recordar lo siguiente cuando utilice el formato List:


La lista de los elementos del dominio y sus respectivos valores de parmetros pueden
ser colocados en la forma que desee. La nica regla es que la lista debe ser encerrada entre
"/" (slashes) y que los pares de elemento-valore pueden ser separados por comas (,) o
colocados en lneas separadas.
No hay punto y coma (;) separando la lista de los pares elemento-valor del nombre,
dominios y texto que lo precede. Esto es porque la misma declaracin est siendo usada para
declarar y asignar cuando se usa el formato List. (Una lista de pares elemento-valor por si
misma no es aceptada por GAMS y el resultado ser un mensaje de error).
El compilador de GAMS tiene una inusual funcin llamada domain checking (revisin
del dominio), la cual verifica que cada elemento del dominio de la lista sea de hecho un
miembro del set apropiado. Por ejemplo, si escribi "seattle" correctamente en la declaracin
de set, pero escribi "seatle" en la siguiente lista de pares elemento-valor, el compilador de
GAMS le dar un mensaje de error de que el elemento "seatle" no pertenece al set i.
Cero (0) es el valor por defecto de todos los parmetros. Por lo tanto, solamente
necesita incluir entrada de datos que no sean ceros en la lista de pares elemento-valor, y
pueden ser introducidos en cualquier orden.
Un escalar es considerado un parmetro que no tiene dominio. Puede ser declarado y
asignado en una declaracin Scalar contenida en una lista degenerada (degenerate) de un
solo valor, como en la siguiente declaracin de nuestro ejemplo:

Scalar f flete en dlares por unidad por cada mil millas /90/ ;
Si un dominio de un parmetro tiene dos o ms dimensiones, puede sin embargo
tener sus valores introducidos por el formato List. Este es muy til para introducir
conjunto que son muy densos (teniendo pocos valores no ceros) y super-poco denso
(teniendo pocos valores distintos a no ceros).
Introduciendo datos por tablas (Tables).
Los practicantes de Optimizacin han notado que la mayora de los datos de entrada para un
modelo grande provienen de tablas de nmeros relativamente pequeas. As es muy til tener
el formato de tablas (Tables) para introducir datos. Un ejemplo de tablas de dos dimensiones o
matriz es mostrado en nuestro ejemplo:

Table d(i,j) tabla de datos de distancias en miles de millas


new-york chicago
seattle
2.5
1.7
san-diego 2.5
1.8

topeka
1.8
1.4 ;

El efecto de esta declaracin es para declarar el parmetro d y para especificar su


dominio como un conjunto de pares ordenados en el producto Cartesiano de i y j. Los
valores de d tambin son dados en esta declaracin bajo el apropiado
encabezamiento. Si hay entradas en blanco en la tabla, son interpretadas como ceros.
Como en el formato List, GAMS ejecutar la funcin domain checking para estar
seguro que los nombres de las filas y las columnas son miembros de los sets
apropiados.
Introduciendo datos por Asignacin Directa (Direct Assignment).

El mtodo de asignacin directa de entrada de datos difiere de los mtodos de listas y


tablas en que divide la labor de declaracin de parmetro y asignacin de parmetro
en declaraciones separadas. El modelo de transporte contiene el ejemplo de este
mtodo.
Parameter c(i,j) costo de transporte en miles de dlares por unidad;
c(i,j) = f * d(i,j) / 1000 ;
Es importante hacer nfasis en la presencia del punto y coma (;) al final de la primera
lnea. Sin ste, el compilador interpretar ambas lneas como parte de la misma
declaracin. (GAMS fallara al distinguir una interpretacin vlida, as le enviara un
breve pero til mensaje de error).
Los efectos de la primera declaracin eson declarar el parmetro c, especificar el
dominio (i,j), y proveer alguna nota explicativa. La segunda declaracin asigna a c(i,j)
el producto de los valores de los parmetros f y d(i,j). Naturalmente, sto es legal en
GAMS solamente si has asignado ya valores a f y d(i,j) en las declaraciones previas.
La asignacin directa de arriba aplica a todos los pares (i,j) en el dominio de c. Si
desea hacer asignaciones para elementos especficos en el dominio, encierre los
nombres de los elementos entre apostrofes. Por ejemplo:
c(`seattle, `new-york) = 0.40;
es una declaracin de asignacin en GAMS.
Al mismo parmetro puede ser asignado un valor ms de una vez. Cada declaracin
de asignacin toma efecto inmediatamente y anula el valor previo. (En contraste, el
mismo parmetro no puede ser declarado ms de una vez. Este error comn, revise
para evitar el uso de un mismo n0ombre para dos cosas diferente).

TUTORIAL DE GAMS - Estructura de un modelo en GAMS


TUTORIAL DE GAMS - SETS

TUTORIAL DE GAMS - Data (Datos)


TUTORIAL DE GAMS - Equations

La fuerza de un lenguaje de modelacin algebraico como GAMS es ms evidente en la


creacin de ecuaciones e inecuaciones que incluye el modelo que estamos estudiando. Esto
es porque cuando un grupo de ecuaciones e inecuaciones tiene la misma estructura
algebraica, todos los miembros del grupo son creados simultaneamente, no en forma
individual.
Declaracin de Equations.
Equations pueden ser declaradas y definidas en declaraciones separadas. El formato de la
declaracin es el mismo que el de las otras entidades de GAMS. Primero va la palabra
clave (palabra reservada), Equations en este caso, seguda por el nombre, dominio y texto de
uno o ms grupos de ecuaciones o inecuaciones a ser declaradas. Nuestro ejemplo contiene
las siguientes declaraciones:
Equations
cost define la funcin objetivo
supply(i) limite de produccin en la planta i
demand(j) demanda a satisfacer en el mercado j ;
cost .. z =e= sum((i,j), c(i,j)*x(i,j)) ;
supply(i) .. sum(j, x(i,j)) =l= a(i) ;
demand(j) .. sum(i, x(i,j)) =g= b(j) ;
Mantenga en mente que la palabra Equation tiene un amplio significado en GAMS.
Abarca ambas relaciones de igualdad y desigualdad, y una equation GAMS con un
solo nombre puede referirse a una o varias de estas relaciones. Por ejemplo, cost no
tiene dominio porque es una ecuacin, pero supply se refiere a un conjunto de
desigualdades definidas en el dominio de i.

TUTORIAL DE GAMS - INTRODUCCIN


TUTORIAL DE GAMS - Estructura de un modelo en GAMS
TUTORIAL DE GAMS - SETS
TUTORIAL DE GAMS - Data (Datos)
TUTORIAL DE GAMS - Equations

También podría gustarte