Está en la página 1de 4

Guillermo Garca Rodrguez

Introduccio n a GAMS: Notacio n matricial


En este documento quiero explicar la notacin matricial que se utiliza clsicamente en GAMS.
Os recomiendo que primero leis el otro documento, que describe las caractersticas generales
del sistema GAMS con un ejemplo.
Para introducir la notacin matricial, que puede resultar til en ejercicios con un gran nmero
de variables, voy a emplear el mismo ejercicio propuesto en Moodle por el profesor de la
asignatura, particularizado con mis coeficientes a-h:
( )


()

()

()

()


Como ya expliqu en el otro documento, las restricciones (I) y (II) pueden incluirse definiendo
las variables x1 y x2 como positivas. Ahora bien, si quisisemos emplear una notacin
compacta para, por ejemplo, la misma variable x, esto sera:
() (

) (

)
Para definir x de esta forma, en GAMS es necesario definir el vector i=(1,2), empleando el
comando SETS y despus el vector x(i). Adems, los valores del vector i no tienen que ser
necesariamente numricos, si no cadenas de caracteres (como en el problema del transporte).
Basta con estas recomendaciones para reescribir el programa que empleamos para este
ejercicio, siguiendo los mismos bloques que en el caso ya explicado:
1. DECLARACIN DE VARIABLES
Este bloque de declaracin no incluye ahora nicamente las VARIABLES, si no que habr que
describir primero los vectores de indexacin (en el ejemplo anterior, el vector i), y despus los
vectores de datos y variables:

Guillermo Garca Rodrguez

Primero hemos declarado con SETS los vectores de indexacin, que para nuestro problema
sern i (indexa el vector x, corresponde con el nmero de variables) y el vector j (que indexa
las ecuaciones de restriccin y el trmino independiente de dichas ecuaciones). Como se
puede ver, los valores se han denominado i=(i1,i2), j=(R1,R2); para mostrar que no es
necesario que sean numricos.
Despus, se ha empleado el comando TABLE para describir la variable A(i,j), que merece una
aclaracin. Las dos restricciones del ejercicio son lineales, de forma que pueden escribirse de
forma matricial como:


Donde A es la matriz de los coeficientes que multiplican a x1 y x2 en cada una de las
restricciones, y b un vector con los trminos independientes de las mismas, en nuestro caso:
(


) (

) (


Ahora bien, para evitar la trasposicin de vectores, esto puede escribirse como:

) (


) ( )
Y es a esa matriz A
T
a la que hemos denominado A. Como veis, solo supone organizar la tabla al
revs, cambiando filas por columnas. Hay que tener cierto cuidado al describir variables TABLE
en GAMS; porque es el nico comando que no es de formato libre. Deben escribirse como:
TABLE
(nombre(index1,index2)) {descripcin de variable} {SALTO DE CARRO}
Index2(1) Index2(2) Index2(M)
Index1(1) {valor} {valor} {valor}
Index1(2) {valor} {valor} {valor}

Index1(N) {valor} {valor} {valor} ;

No olvidis el punto y coma final! En nuestro caso, el primer vector de indexacin es i
(indexacin por filas) y el segundo es j (indexacin por columnas). De esta forma, se describe
una tabla de N filas (nmero de componentes del vector index1) y M columnas (nmero de
componentes del vector index2). S que as explicado puede resultar un poco engorroso, pero
confo en que si intentis implementar el ejemplo os quedar bastante claro.
Como veis en el ejemplo, tambin hemos utilizado el comando PARAMETERS para definir las
variables B y T. Primero os explico qu es T, y luego vamos con el comando.
Guillermo Garca Rodrguez

Al igual que hemos hecho para describir las restricciones, la funcin objetivo puede describirse
como el producto de dos vectores porque es una funcin lineal:
( )

()


Es decir, el vector T contiene los coeficientes que multiplican a cada uno de los valores del
vector x(i). Es decir, es otro vector indexado en i: T(i).
Una vez hemos dejado esto claro, vamos como se definen vectores con el comando
PARAMETERS. La forma de emplear este comando es:
PARAMETERS
Nombre (index) {descripcin del vector T} {salto de carro (opcional)}
/index(1) {valor}
Index(2) {valor}

Index(n) {valor}/ ;
Es decir, se describen los valores del vector asignados a cada valor del vector de indexacin en
la misma fila que ste, envolviendo todos entre dos /barras/. Si veis el ejemplo, lo he repetido
para el vector T(i) y B(j).
La declaracin de variables termina definiendo con el parmetro VARIABLES la funcin
objetivo f, y con POSITIVE VARIABLES las variables x1 y x2 contenidas en un nico vector x(i).
No es necesario ningn comando adicional para declarar las variables incgnita del ejercicio.
2. EQUATIONS
El bloque de ecuaciones tambin va a variar con la descripcin matricial del problema, ya que
ahora describiremos todas las restricciones como una sola restriccin matricial:

Primero declaramos las ecuaciones funobj y rest(j), que ahora contiene a las dos restricciones
del problema. Despus, se definen estas ecuaciones. Para ello, nos hace falta entender la
sintaxis del sumatorio en GAMS:
( () ()) () () ()

()


Guillermo Garca Rodrguez

Es decir, el primer atributo del sumatorio es el vector a travs del cual se realiza la suma, y el
segundo contiene las operaciones matemticas internas a dicho sumatorio. Si hemos
entendido el ejemplo de la funobj, las restricciones solo consisten en extender el concepto a la
dimensin del vector j. Para cada restriccin rest(1),rest(2), rest(M), la definicin de la
ecuacin toma un valor de j distinto. Por ejemplo, para j=1:
() () ( () ( )) () ( )

) ()


Si os fijis, el resultado es la primera restriccin: -x1 + x2 2. El indexar las restricciones con j
hace que cada restriccin rest(j) complete el sumatorio con una columna distinta de la matriz
A(i,j). Al principio cuesta hacerse un poco a la idea, pero si intentis hacer el ejercicio por
vuestra cuenta llegis a las mismas conclusiones que yo.
3. MODEL y SOLVER
Al emplear el comando MODEL ahora hay una pequea salvedad. En vez de incluir en el
comando el nombre de todas las restricciones, vale con incluir rest(j). El comando quedara
como:
MODEL ejercicio1 /funobj,rest(j)/;
O, lo que es lo mismo:
MODEL ejercicio1 /all/;
En cuanto al comando SOLVER no hay que cambiar nada respecto del ejemplo del otro
documento.
4. DISPLAY
Aunque el comando DISPLAY no cambia sustancialmente su funcionamiento, el haber descrito
las variables x1,x2 como componentes del vector x nos permite escribir el comando como:
DISPLAY x.l, f.l;
La nica salvedad a tener en cuenta es que ahora, en el reporte, los valores de x1 y x2 en el
valor de f mnimo se os van a entregar en forma de vector, con una estructura similar a la
sintaxis del comando PARAMETER. En mi caso particular:
75 VARIABLE x.L
( ALL 0.000 )
Que significa que todos los valores del vector x toman el valor 0 cuando la funcin f alcanza un
mnimo.

También podría gustarte