Académique Documents
Professionnel Documents
Culture Documents
Interface Matlab-GAMS
B.1 Introducción
En muchas áreas de la ciencia, aparecen problemas en los que se busca que una
determinada variable o función alcance su valor máximo o mínimo. Las variables que
intervienen en dicho problema no podrán tomar cualquier valor, sino que deberán cumplir
una serie de restricciones. Estos problemas se conocen como problemas de optimización.
Para resolver dichos problemas se pueden emplear paquetes informáticos como Excel o
Matlab. Por un lado, estos programas presentan como ventaja una fácil manipulación y
visualización de los datos. Sin embargo, los algoritmos de resolución no son eficaces para
problemas no lineales con un gran número de variables. Los lenguajes de programación como
GAMS y AMPL tienen optimizadores que permiten la resolución de problemas no lineales de
gran escala. En este apéndice, se describe la conexión entre los programas Matlab y GAMS
con las siguientes ventajas:
- Permite que pueda emplearse el lenguaje Matlab para introducir los datos de entrada
en un problema de optimización programado en GAMS, además de poder mostrar los
resultados de dicho problema utilizando la gran variedad de gráficos e imágenes de Matlab.
http://www.cs.wisc.edu/math-prog/matlab.html.
Una vez descargados los archivos, los pasos para una correcta instalación son los
siguientes:
En primer lugar, es necesario que tanto el programa Matlab como el programa GAMS
estén instalados en el ordenador. Se asumirá que los archivos de instalación de dichos
programas se encuentran respectivamente en los directorios c:\matlab y c:\gams.
c:\Archivos de programa\gams21.7
Una vez finalizado el proceso, se verificará la instalación siguiendo los pasos del
siguiente test:
>>testinst
Q=
name: 'Q'
val: [3x3 double]
ans =
1 0 0
0 1 0
0 0 1
Q=
2 0 0
0 2 0
0 0 2
B4 Anexo B. Interface Matlab-GAMS
J=
'1'
'2'
'3'
Q=
name: 'Q'
val: [3x3 double]
J=
name: 'J'
val: {3x1 cell}
A=
name: 'A'
val: [2x3 double]
ans =
3 0 0
0 3 0
0 0 3
ans =
'1'
'2'
'3'
ans =
0 2 -5
2 0 2
En GAMS hay que definir unos conjuntos de índices empleados para referirse a los
componentes de un vector o matriz. Para definir dichos conjuntos es necesario que los índices
sean de tipo cadena de caracteres. Por lo tanto, habrá que hacer una conversión en Matlab de
los índices “tipo entero” a índices “tipo cadena de caracteres” mediante la instrucción:
Una vez que los índices han sido transformados en cadena de caracteres y se han
calculado las matrices dato del problema de optimización, escribiremos entre comillas y
separados por comas los nombres de las variables de cada uno de ellos justo detrás del
nombre del programa de GAMS. En el lado izquierdo de la instrucción, aparecerán las
variables de salida resultantes del problema de optimización:
m n
Minimizar Z = ∑∑ cij xij
i =1 j =1
sujeto a
n
∑x
j =1
ij = u j ; ∀i = 1,..., m
∑x
i =1
ij = v j ; ∀j = 1,..., n
1 2 3 2 5
C = 2 1 2 u = 3 v = 2
3 2 1 4 2
B6 Anexo B. Interface Matlab-GAMS
%Pasamos los indices que van a definir las dimensiones de las matrices a
%cadena de caracteres
numorigenes = int2str(3);
numdestinos = int2str(3);
gams_output='std';
x = gams('pl_gams','numorigenes','numdestinos','U','V','C')
Los nombres de las variables deben escribirse entre signos de tanto por cierto para que
sean reconocidas como tales. Normalmente, el índice inicial será uno, por lo que la
instrucción podrá simplificarse haciendo:
Para que se incluyan los valores de los índices declarados en Matlab se debe añadir la
siguiente instrucción antes de la declaración de los conjuntos:
PARAMETERS
Matriz 1 comentario 1
Matriz 2 comentario 2
Los nombres de las matrices deberán coincidir con los nombres de las variables dato
declaradas en el archivo Matlab. Después de la instrucción de GAMS en la que se declara el
conjunto de ecuaciones que forma el modelo se incluirá la siguiente instrucción:
Al igual que ocurría con el archivo que contenía los índices, al incluir la instrucción
anterior se añaden las matrices datos del problema en formato GAMS al modelo del
problema.
Lo único que resta por añadir al archivo de GAMS son las instrucciones que permiten
exportar los resultados del problema de optimización a Matlab. Estas instrucciones son de la
forma:
En Matlab se ha de poner:
Para que las variables exportadas sean reconocidas en Matlab se ha de añadir antes de
la llamada al archivo de GAMS la instrucción:
gams_output = ‘std’;
set i /1*%numorigenes%/
j /1*%numdestinos%/;
parameter
variables
equations
Para ayudar al lector a comprender la interface entre ambos programas se van a incluir
los archivos matglobs.gms y matdata.gms de este ejemplo concreto:
matglobs.gms:
matdata.gms:
$title matdata: This file contains the matlab data generation code
$onempty
parameter U(*) /
1 2
2 3
3 4
/;
$offempty
$onempty
parameter V(*) /
1 5
2 2
3 2
/;
$offempty
$onempty
parameter C(*,*) /
1.1 1
1.2 2
1.3 3
2.1 2
2.2 1
2.3 2
3.1 3
3.2 2
3.3 1
/;
$offempty
>> pl
x=
2 0 0
1 2 0
2 0 2
B10 Anexo B. Interface Matlab-GAMS