You are on page 1of 8

UNIVERSIDAD DE LOS ANDES

DEPARTAMENTO DE INGENIERIA INDUSTRIAL


IIND2103 Principios de Optimizacin 2015-10
INSTRUCTORES: Daniel Duque, Manuel Bolvar, Juliana Gmez.
ASISTENTES: Juliana Arango, Jorge Huertas, Santiago Ramrez, Felipe Solano, Sergio Crdenas, Manuel Duque, Claudia Bedoya

Implementacin del problema de las semillas

Formulacin del problema


Considere el problema de procesamiento y envo de semillas visto en clase. El problema se puede
formular de la siguiente manera:
Conjuntos:
: Conjunto de Plantas
: Conjunto de variedades de maz.
: Conjunto de Ciudades
Parmetros
: Costo de producir en la planta una bolsa de maz de la variedad
: Costo de enviar de la planta una bolsa de maz de la variedad a la ciudad
: Capacidad de procesamiento (en kg) de la planta
: Cantidad de kg de maz que debe ser procesada para producir una bolsa de la variedad
: Demanda de la variedad de maz en la ciudad
Variables de decisin
: Cantidad de bolsas a producir en la planta de la variedad de maz
: Cantidad de bolsas a enviar de la planta de la variedad de maz a la ciudad
Restricciones
Se respeta el lmite de produccin.

Se cumple la demanda.

Se envan todas las bolsas producidas.


=

UNIVERSIDAD DE LOS ANDES


DEPARTAMENTO DE INGENIERIA INDUSTRIAL
IIND2103 Principios de Optimizacin 2015-10
INSTRUCTORES: Daniel Duque, Manuel Bolvar, Juliana Gmez.
ASISTENTES: Juliana Arango, Jorge Huertas, Santiago Ramrez, Felipe Solano, Sergio Crdenas, Manuel Duque, Claudia Bedoya

No negatividad de las variables.


0
0

,
, ,

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.

Inicio del archivo


En la primera lnea de cdigo se debe declarar el modelo. La instruccin model seguida del
nombre que se le quiera dar al modelo abre el espacio para trabajar. La instruccin uses mmxprs
que aparece de forma predeterminada en la segunda lnea sirve para importar el Optimizador de
Xpress (sin esta lnea, las instrucciones minimize y maximize no compilan). Los archivos de datos
y de impresin se declaran en la seccin parameters. Todo esto se ve en la Figura 1.

Figura 1. Lneas iniciales.


En este ejemplo se est usando la extensin .dat para el archivo de datos y .txt para el archivo de
resultados. Esto no es imperativo, ambos podran ser .txt o .dat indistintamente, y ambas
extensiones pueden abrirse desde Xpress-MP y desde Bloc de notas. Los nombres inputFile y
outputFile pueden ser cambiados por el usuario ya que solamente se usan para hacer referencia a
la cadena de caracteres.

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.

UNIVERSIDAD DE LOS ANDES


DEPARTAMENTO DE INGENIERIA INDUSTRIAL
IIND2103 Principios de Optimizacin 2015-10
INSTRUCTORES: Daniel Duque, Manuel Bolvar, Juliana Gmez.
ASISTENTES: Juliana Arango, Jorge Huertas, Santiago Ramrez, Felipe Solano, Sergio Crdenas, Manuel Duque, Claudia Bedoya

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.

UNIVERSIDAD DE LOS ANDES


DEPARTAMENTO DE INGENIERIA INDUSTRIAL
IIND2103 Principios de Optimizacin 2015-10
INSTRUCTORES: Daniel Duque, Manuel Bolvar, Juliana Gmez.
ASISTENTES: Juliana Arango, Jorge Huertas, Santiago Ramrez, Felipe Solano, Sergio Crdenas, Manuel Duque, Claudia Bedoya

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.

Figura 3. Archivo de datos.

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

UNIVERSIDAD DE LOS ANDES


DEPARTAMENTO DE INGENIERIA INDUSTRIAL
IIND2103 Principios de Optimizacin 2015-10
INSTRUCTORES: Daniel Duque, Manuel Bolvar, Juliana Gmez.
ASISTENTES: Juliana Arango, Jorge Huertas, Santiago Ramrez, Felipe Solano, Sergio Crdenas, Manuel Duque, Claudia Bedoya

Figura 4. Inicializaciones y creacin de variables.

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.

UNIVERSIDAD DE LOS ANDES


DEPARTAMENTO DE INGENIERIA INDUSTRIAL
IIND2103 Principios de Optimizacin 2015-10
INSTRUCTORES: Daniel Duque, Manuel Bolvar, Juliana Gmez.
ASISTENTES: Juliana Arango, Jorge Huertas, Santiago Ramrez, Felipe Solano, Sergio Crdenas, Manuel Duque, Claudia Bedoya

Figura 5. Implementacin de las restricciones.


Como se puede ver, no es necesario agregar las restricciones de no negatividad. Si el usuario no
especifica nada diferente, Xpress-MP supone que las variables son no negativas.

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.

Figura 6. Funcin objetivo.

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

UNIVERSIDAD DE LOS ANDES


DEPARTAMENTO DE INGENIERIA INDUSTRIAL
IIND2103 Principios de Optimizacin 2015-10
INSTRUCTORES: Daniel Duque, Manuel Bolvar, Juliana Gmez.
ASISTENTES: Juliana Arango, Jorge Huertas, Santiago Ramrez, Felipe Solano, Sergio Crdenas, Manuel Duque, Claudia Bedoya

por comas. Es posible imprimir saltos de lnea o tabulaciones incluyendo \n o \t


respectivamente. El uso de writeln() puede verse en la Figura 7.

Figura 7. Instrucciones de impresin.


La funcin objetivo en la solucin encontrada se puede imprimir con la instruccin getobjval que
devuelve el valor numrico de esta. Los valores de las variables se obtienen con la instruccin
getsol() que recibe como parmetro la variable. Segn lo que se quiera imprimir, las instrucciones
de impresin pueden ir dentro de uno o varios forall(). El recorrido de los forall() puede tambin
condicionarse en el valor de las variables. Por ejemplo, la ltima lnea solamente se imprime
cuando en efecto se enva desde la planta p hasta la ciudad r alguna cantidad positiva de maz i, es
decir, cuando la variable toma un valor positivo.
Si no se especifica nada, todas las impresiones se harn en consola. Para imprimir en un archivo de
resultados es necesario haberlo declarado en la seccin parameters e incluir la instruccin
fopen() que recibe como parmetros el nombre que se le dio a la referencia del archivo (en este
caso outputFile) y un nmero entero. Se recomienda simplemente escribir F_OUTPUT que es
una constante entera. Finalmente, es necesario cerrar el archivo de salida con la instruccin
fclose() que recibe como parmetro el mismo nmero (nuevamente, se recomienda
F_OUTPUT). Todas las instrucciones de impresin que se implementen entre la apertura y el
cierre del archivo de salida resultarn en impresiones en dicho archivo, que se sobre escribir o se
crear automticamente segn el caso. La impresin de los resultados para esta implementacin
se puede ver en la Figura 8.

UNIVERSIDAD DE LOS ANDES


DEPARTAMENTO DE INGENIERIA INDUSTRIAL
IIND2103 Principios de Optimizacin 2015-10
INSTRUCTORES: Daniel Duque, Manuel Bolvar, Juliana Gmez.
ASISTENTES: Juliana Arango, Jorge Huertas, Santiago Ramrez, Felipe Solano, Sergio Crdenas, Manuel Duque, Claudia Bedoya

Figura 8. Resultados en archivo de texto.


En la Figura 8 se puede observar que no se imprimieron todas las combinaciones de planta, ciudad
y tipo de maz, sino solamente aquellas que corresponden a envos que s se realizaron.

Fin del archivo


Finalmente, para cerrar el modelo debe incluirse la instruccin end-model.

Figura 9. Final del modelo

You might also like