Vous êtes sur la page 1sur 10

Anexo B

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:

- Se proporciona a los usuarios de Matlab la posibilidad de resolver problemas de


optimización no lineales de gran tamaño.

- 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.

Resumiendo, esta interface pretende combinar el conocidísimo formato del lenguaje


de programación de Matlab con la eficiencia en la resolución de problemas de optimización
de GAMS.
B2 Anexo B. Interface Matlab-GAMS

B.2 Descarga e instrucciones de instalación


Todos los archivos necesarios para llevar a cabo la conexión entre Matlab y GAMS
pueden descargarse de la dirección de Internet:

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.

A continuación, copiaremos el archivo matout.gms en el directorio librería de GAMS,


es decir:

C:\> copy matout.gms c:\gams\inclib\matout.gms

Además, es necesario copiar el archivo gams.dll en el directorio en el que se vayan a


almacenar los archivos de Matlab del programa de optimización. Por ejemplo:

C:\> copy gams.dll c:\matlab\toolbox\local\gams.dll

Nota: El directorio c:\matlab\toolbox\local es donde se graban los programas de Matlab por


defecto, si se van a almacenar los archivos en otro directorio es suficiente con copiar dicho
archivo al nuevo directorio.

El tercer paso es asegurarse de que el directorio del sistema de GAMS se encuentre en


el path de Windows.

- En un ordenador con Windows XP deberemos incluir este directorio desde el panel


de control. Para ello haremos:

Panel de Control>Sistema>Opciones avanzadas>variables de entorno

Seleccionaremos la variable path en variables del sistema y añadiremos en valor el


directorio donde se encuentre GAMS como muestra la figura de la página siguiente, por
ejemplo:

c:\Archivos de programa\gams21.7

- Si el ordenador tiene instalado Win95 o Win98, se deberá editar el archivo


autoexec.bat. Deberemos añadir en este archivo la línea:

set path = “%path%;c:\Archivos de programa\gams21.7”


B.2 Descarga e instrucciones de instalación B3

Una vez finalizado el proceso, se verificará la instalación siguiendo los pasos del
siguiente test:

1. Abrir el programa Matlab

2. En la ventana que indica el directorio activo, incluir el directorio en el que se


encuentren los archivos testinst.m y testinst.gms. Estos ficheros se adquieren en la descarga de
la interface de la página web que se comentó al principio del apéndice.

3. Ejecutaremos el fichero testinst.m desde Matlab escribiendo en la línea de comando:

>>testinst

La instalación de la interface será la correcta si el resultado obtenido es el siguiente:

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

Si no se obtienen fallos durante el proceso de ejecución de este ejemplo, la interface


Matlab-GAMS ha sido instalada correctamente.

B.3 Archivo en Matlab


La interface requiere que exista un archivo principal en Matlab desde el que se accede
a un archivo programado en GAMS que se encarga únicamente de resolver el problema de
optimización. En el archivo de Matlab se realizarán todas las operaciones necesarias para
conseguir los datos de entrada del problema de optimización. Una vez calculados todos los
datos de entrada al archivo de GAMS, se facilitarán a dicho programa como sigue:
B.3 Archivo en Matlab B5

Instrucción en Matlab para ejecutar el archivo de GAMS:

[variables de salida] = gams(‘nombre archivo gams’,’datos de entrada’)

Si bien todos los datos de entrada se introducen de la misma manera, diferenciaremos


entre dos tipos de variables. Por un lado tenemos matrices de datos y por otro lado los índices
que indicarán las dimensiones de dichas matrices.

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:

Índice cadena caracteres = int2str(índice entero)

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:

[v1,v2,v3,….] = gams(‘nombre archivo gams’,’índice1’ ,’índice2’,’matriz1’,’matriz2’)

Se va a plantear un problema de optimización lineal para aclarar la conexión entre dos


programas y las modificaciones que se han de hacer en cada uno de los archivos. Se va a
solucionar un ejemplo del conocido problema de transporte [CAS02]. La formulación
generalizada del problema es la siguiente:

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

xij > 0; ∀i = 1,..., m; ∀j = 1,..., n

En particular se va a resolver un caso con m=n=3 y:

 1 2 3 2 5
     
C =  2 1 2 u = 3 v =  2
 3 2 1 4  2
     
B6 Anexo B. Interface Matlab-GAMS

El archivo en Matlab para resolver dicho problema es:

% programacion lineal (título del archivo)

clear all (borra todas las variables anteriores al programa acutal)

%Pasamos los indices que van a definir las dimensiones de las matrices a
%cadena de caracteres
numorigenes = int2str(3);
numdestinos = int2str(3);

%Definimos las matrices del problema


U=[2 3 4];
V = [5 2 2];
C=[1 2 3;2 1 2;3 2 1];

%Hacemos la llamada al archivo de GAMS "pl_gams".


%A continuación de éste, escribimos las variables de los datos de entrada. El resultado del
problema de optimización será la matriz x.

gams_output='std';
x = gams('pl_gams','numorigenes','numdestinos','U','V','C')

La instrucción gams_output='std'; se explicará más adelante.

B.4 Archivo en GAMS


El archivo de GAMS también ha de ser modificado para que la interface funcione
correctamente. Las partes que se deberán modificar son la declaración de datos de entrada y la
exportación de los datos de salida al matlab.

La declaración de conjuntos de índices es básicamente igual al caso de un archivo de


GAMS. La única diferencia es que en vez de escribir números conocidos se escriben los
nombres de las variables declaradas en el archivo de Matlab para tal fin. La instrucción
generalizada de GAMS sería:

SET nombre del conjunto / %índice inicial% * %índice final% /

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:

SET nombre del conjunto / 1 * %índice final% /

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:

$if exist matglobs.gms $include matglobs.gms


B.3 Archivo en GAMS B7

Esta instrucción sirve para lo siguiente: cuando se ejecuta la instrucción [variables de


salida] = gams(‘nombre archivo gams’,’datos de entrada’) en Matlab, se crean dos archivos:
matglobs.gma y matdata.gms. En el primero de ellos se almacenan las variables tipo cadena
de caracteres y en el segundo las matrices de entrada. Las variables que se declaran en cada
uno de los archivos están en formato GAMS, de manera que al incluir la instrucción anterior
se añade el contenido del archivo matglobs.gms al modelo del programa en GAMS.

Las matrices de datos necesarias se declararán en GAMS como parámetros de la


siguiente manera:

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:

$if exist matdata.gms $include matdata.gms

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:

$libinclude matout variable.campo índice1 índice2

En el lugar de variable incluiremos el nombre de la variable que ha sido declarada en


GAMS. El campo sirve para elegir si queremos obtener el valor la variable (.l), su valor
máximo (.up), mínimo (.lo) o el marginal asociado a dicha variable (.m). Los índices 1 y 2 se
tienen que especificar en el caso de que la variable sea una matriz, o sólo el índice 1 si se trata
de un vector. En el caso de que la variable sea un escalar no se han de incluir ninguno de los
índices. Es importante escribir las instrucciones de exportación de resultados en el mismo
orden en el que son escritas las variables en matlab:

Si las instrucciones se escriben en este orden:

$libinclude matout matriz1.l índice1 índice2


$libinclude matout vector1.l índice3
$libinclude matout escalar1.l

En Matlab se ha de poner:

[matriz1, vector1, escalar1] = gams(‘nombre archivo’, ‘datos de entrada’)


B8 Anexo B. Interface Matlab-GAMS

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’;

Recopilando todas las instrucciones necesarias, el archivo en GAMS para el problema


del ejemplo queda de la siguiente manera:

** programa de optimización lineal


$if exist matglobs.gms $include matglobs.gms

set i /1*%numorigenes%/
j /1*%numdestinos%/;

parameter

U(i) cantidad a trasportar desde el origen I

V(j) cantidad recibida en el destino J

C(i,j) coste de transporte entre el origen I y el destino J;

variables

z valor de la función objetivo

x(i,j) la cantidad de producto a transportar desde i a j;

positive variable x(i,j);

equations

coste función objetivo

envia (i) ecuación de envios

recibe (j) ecuación de recepción;

coste.. z =e= sum((i,j),c(i,j)*x(i,j));


envia(i).. sum(j,x(i,j)) =e= u(i);
recibe(j).. sum(i,x(i,j)) =e= v(j);

model transporte /all/;


$if exist matdata.gms $include matdata.gms

solve transporte using lp minimizing z;


$libinclude matout x.l I J
B.3 Archivo en GAMS B9

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:

$setglobal numorigenes '3'


$setglobal numdestinos '3'

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

El resultado de ejecutar el archivo pl.m en Matlab proporciona el siguiente resultado:

>> pl

x=

2 0 0
1 2 0
2 0 2
B10 Anexo B. Interface Matlab-GAMS

B.5 Ventajas de la interface Matlab-GAMS


La principal ventaja de la interface es que se puede programar un único archivo en
GAMS para un tipo de problema de optimización (por ejemplo, el problema de transporte) e
introducir diferentes datos desde Matlab. Esto, aparte de facilitar la introducción de datos para
usuarios que no estén muy familiarizados con el lenguaje de GAMS, permite emplear los
optimizadotes de GAMS comos si fueran de Matlab haciendo posible que estos aparezcan
dentro de un bucle for o while y almacenando los resultados en matrices de Matlab, por
ejemplo. Además, se pueden usar todas las posibilidades gráficas de Matlab para representar
resultados de diferentes problemas de optimización.

Vous aimerez peut-être aussi