Professional Documents
Culture Documents
Se cumple la demanda.
,
, ,
Implementacin en Xpress-MP
Para implementar este problema en Xpress-MP es necesario crear un archivo .mos (la extensin
que automticamente crea el programa). A continuacin se muestra y se comenta el cdigo
asociado.
Declaraciones
Lo siguiente es declarar conjuntos, parmetros y variables. Esto se hace en la seccin declarations
de Xpress-MP como se ve en la Figura 2.
Figura 2. Declaraciones.
Los conjuntos se declaran como set, y pueden contener, por ejemplo, elementos enteros
(integer), decimales (real) o cadenas de caracteres (string). Es indispensable que los tipos
coincidan con el archivo de datos. Los parmetros se pueden declarar en un arreglo o uno por uno.
En el caso de los arreglos se debe especificar el conjunto sobre el cual estn indexados. Los tipos
ms comunes para parmetros son tambin integer, real y string (los parmetros binarios son
enteros). Las variables tambin se pueden declarar solas o en un arreglo, haciendo las mismas
especificaciones. En Mosel (lenguaje de Xpress-MP) las variables se declaran como mpvar. La
seccin de declaraciones debe cerrarse con la instruccin end-initializations.
Nota: Los arreglos dinmicos se comportan como un arreglo normal, con la diferencia que no
todos los elementos tienen que estar definidos o existir. Por ejemplo, si una matriz bidimensional
se declara como un arreglo normal, todos sus elementos debern tomar valor (numrico, cadena
de caracteres, segn el caso). En cambio, si se declara como un arreglo dinmico, es permitido que
varios elementos queden vacos. Si en un archivo de datos no se especifican todas las posiciones
de la matriz, las posiciones faltantes quedarn vacas si la matriz se declar como un arreglo
dinmico y tomarn valores por defecto (0 para los nmeros, cadena vaca para las cadenas de
caracteres) si se declar como un arreglo convencional. Los arreglos dinmicos son especialmente
tiles para declarar variables que no estn definidas en todos sus posibles subndices. Sea para
declarar una variable o un parmetro, los arreglos dinmicos se declaran anteponiendo la palabra
dynamic a la palabra array.
Archivos de datos
Los archivos de datos, sean .txt o .dat, tienen la misma estructura. Para cada parmetro se debe
poner su nombre seguido de dos puntos y abrir corchetes cuadrados. Los valores se listan uno a
uno, poniendo primero entre parntesis los subndices relacionados. Luego de poner todos los
datos de un arreglo se deben cerrar los corchetes cuadrados. El archivo de datos para esta
implementacin del problema se muestra en la Figura 3.
Inicializaciones
Para leer el o los archivos de datos y darle valores a los parmetros se utiliza la instruccin
initializations from, seguida del nombre que se le dio en parmetros a la cadena de caracteres
que hace referencia al archivo de datos (en este caso inputFile). Es indispensable indicar todos los
datos que deben ser ledos, separndolos por espacios, tabulaciones o saltos de lnea. La seccin
de inicializaciones debe cerrarse con la instruccin end-initializations (ver Figura 4).
Creacin de variables
En la Figura 4 tambin se puede ver la creacin de variables. Esta debe hacerse siempre que se
declaren las variables en un arreglo, y especialmente crtico hacerlo para los arreglos dinmicos.
En este ltimo caso, puede suceder que el usuario no quiera crear todas las variables, lo cual se
manejara agregando condiciones lgicas en la estructura del forall(). Para crear las variables se
utiliza la instruccin create() que recibe como parmetro la variable que se desea crear.
Nota: La instruccin forall() sirve para recorrer todas las posiciones de un arreglo y ejecutar una o
varias lneas de cdigo sobre ellas. Es posible condicionar el recorrido para que no ejecute estas
lneas sobre todas las posiciones. La estructura do- end-do es necesaria si dentro del forall() se
quieren ejecutar varias lneas.
Restricciones
La implementacin de las restricciones se hace utilizando las instrucciones forall() y sum(). La
instruccin sum() recibe como primer argumento los ndices y conjuntos a recorrer y como
segundo argumento aquello que se quiere sumar. La implementacin de las restricciones del
problema se muestra en la Figura 5. Ah se pueden ver una por una todas las restricciones de la
formulacin.
Funcin objetivo
La funcin objetivo puede o no definirse por separado. En la Figura 6 se puede ver el uso de los
dos puntos y el signo igual (:=) para definir una expresin (que no es una restriccin). La
instruccin para optimizar es maximize() o minimize() (segn el caso) y recibe como argumento
la funcin objetivo. Es indispensable haber importado el optimizador al principio del modelo para
que funcione correctamente.
Impresin de resultados
La impresin de los resultados se hace con la instruccin writeln() que recibe como parmetros
una cadena de caracteres y la imprime ya sea en consola o en un archivo de salida. La instruccin
writeln() introduce tambin un salto a la lnea siguiente al final de la impresin. Alternativamente,
se puede imprimir con la instruccin write() que no introduce el salto de lnea. Si se quiere incluir
varias cadenas de caracteres (o valores numricos) en una impresin, estos deben ser separados