Aprendiendo LINGO

Anuncio
Aprendiendo LINGO
INTRODUCCIÓN A LINGO - 1
Introducción a LINGO
LINGO (LINear Generalize Optimizer) es una versátil herramienta para la formulación,
resolución y análisis de problemas de programación lineal y no lineal. Esto significa que
usando LINGO es posible resolver sistemas de ecuaciones con una o varias variables
independientes (modelos directos) o bien una o varias variables interdependientes
(optimización multiobjetivo) solamente ingresando como máximo unas decenas de líneas.
LINGO está disponible para DOS, Windows y Linux. Al margen de que las interfaces
pueden diferir, las versiones para cada una de estas plataformas tienen exactamente las
mismas funcionalidades.
Uno de los rasgos más destacables de LINGO es su lenguaje de modelado. Este lenguaje
permite expresar un problema de una manera muy similar a la notación matemática
normal. Además es posible expresar sumatorias 1 mediante expresiones iterativas, lo cual
lleva a modelos que son más compactos y fáciles de mantener. Otro aspecto a destacar
del lenguaje de modelado es la sección de datos, que permite aislar los datos de la
formulación del modelo. Por esto LINGO puede leer datos incluso de una hoja de cálculo
separada, base de datos, o archivo de texto. Con datos independientes del modelo, es más
simple hacer cambios, y se reduces las posibilidades de equivocarse al plantear el modelo.
La ventaja de la proximidad del lenguaje de modelado con el lenguaje del modelo
matemático estándar es que el alumno no debe conocer demasiado el lenguaje de
modelado, sólo debe saber plantear los modelos matemáticos de los problemas a resolver.
Hoy día los Solvers comerciales más avanzados, tales como CPLEX (el solver por default
de LINGO), pueden ser vistos como una caja negra donde el usuario puede enviar modelos
en gran escala, con cientos de miles de variables, y estar razonablemente seguro que el
paquete producirá una solución, sin interacción especial alguna por parte del usuario. El
tamaño de los problemas que las corporaciones están tratando han crecido
dramáticamente. Esto significa que los usuarios necesitan herramientas más avanzadas
para recopilar y administrar los datos, formular modelos y enviarlos al solver. Aquí es
donde un lenguaje de modelado es muy valioso.
1
Sumas generalizadas.
Ing. Gabriel Arellano
APRENDIENDO LINGO
2 - INTRODUCCIÓN A LINGO
Comenzando a utilizar LINGO
La manera más directa de aprender a montar es subirse al caballo, siguiendo esa premisa,
comenzaremos nuestro aprendizaje mediante el planteo y resolución de uno de los
problemas clásicos de la programación lineal, me refiero por supuesto, al problema de
mezcla de productos.
Utilizaremos como punto de partida el problema de la Wyndor Glass Co. Planteado como
ejemplo prototipo a lo largo de la mayoría de los capítulos de la quinta edición del libro
“Introducción a la Investigación de Operaciones” de Hillier-Lieberman.
El planteo de este problema se puede leer en la sección 3.1 del mencionado libro y se
resume a continuación:
La W YNDOR GLASS CO. produce artículos de vidrio de alta calidad, incluyendo ventanas y
puertas de vidrio. La empresa tiene tres plantas de producción. Los marcos y molduras se
hacen en la planta 1, los marcos de madera se fabrican en la planta 2 y en la 3 se produce
el vidrio y se ensamblan los productos.
Debido a que las ganancias se han reducido, la gerencia general ha decidido reorganizar
la línea de producción. Se descontinuarán varios productos no rentables y se dejará libre
una parte de la capacidad de producción para emprender la fabricación de uno o dos
productos nuevos que han tendido demanda. Uno de los productos propuestos (Producto
1) es una puerta de vidrio de 2,6 m con marco de aluminio. El otro (Producto 2) es una
ventana grande (1,3 m x 2 m) para vidrio doble con marco de madera. El departamento de
mercadotecnia ha obtenido como conclusión que la compañía puede vender todo lo que
pueda producir de cualquiera de los productos. Sin embargo, como ambos productos
compiten por la misma capacidad de producción de la planta 3, no es obvio qué mezcla de
los dos productos sería más redituable. Por todo esto, la gerencia pidió al departamento de
investigación de operaciones que estudiara el asunto.
Después de hacer algunas investigaciones, el departamento mencionado determinó:
1. El porcentaje de capacidad de producción de cada planta para cada producto.
2. El porcentaje de esta capacidad que requiere cada unidad producida por minuto.
3. La ganancia unitaria de cada producto.
Esta información se resume en la siguiente tabla:
Planta
Producto
1
1
0
3
2
0
2
2
Capacidad
Disponible
4
12
18
1
2
3
Ganancia
3
5
unitaria
Datos del problema de Wyndor Glass Co.
Ing. Gabriel Arellano
Aprendiendo LINGO
INTRODUCCIÓN A LINGO - 3
Para formular el problema lineal primero debemos determinar los elementos del mismo:
Variables de decisión:
Función Objetivo:
x1: unidades producidas del producto 1 por minuto.
x2: unidades producidas del producto 2 por minuto.
Z = 3x1 + 5x2
La función objetivo representa la contribución a la ganancia por minuto por lo cual
deseamos maximizarla.
4
 12
 18
Restricciones: x1
2x2
3x1 + 2x2
Capacidad Planta1.
Capacidad Planta2.
Capacidad Planta3.
Entonces el modelo matemático del problema sería:
Z = 3x1 + 5x2
Sujeto a:
x1
2x2
3x1 + 2x2
y
 Max
4
 12
 18
x1  0 ; x2  0
Modelo matemático del problema.
El modelo matemático expresado en el lenguaje de modelado de LINGO sería:
! Problema 3.1 Hillier-Lieberman Pag. 30 - Wyndor Glass Co.
Xj = Cantidad a producir del producto j ;
Max = 3*X1 + 5*X2;
!Sujeto a: ;
X1
<=4;
2*X2 <=12;
3*X1 + 2*X2 <=18;
Problema equivalente en lenguaje LINGO.
A menos que especifique lo contrario, el valor de las variables por defecto en un modelo de
LINGO son no-negativas y continuas. Por ello para nuestro modelo no es necesario incluir
las condiciones de no negatividad.
Las líneas que comienzan con ! son comentarios y serán ignoradas por Lingo.
De forma más general un comentario es un bloque de texto (puede estar
compuesto de una o más líneas) que comienza con un signo de exclamación (!) y
termina con punto y coma (;).
Ing. Gabriel Arellano
APRENDIENDO LINGO
4 - INTRODUCCIÓN A LINGO
Como siguiente paso debemos ingresar este modelo en la aplicación para lo cual debemos
iniciar la aplicación:
•
Seleccionando el menú: Inicio  Programas  Lingo XX  Lingo XX
•
O haciendo doble click en el icono LINGO del escritorio
Luego de iniciar la aplicación aparece la pantalla principal de LINGO y un modelo en
blanco:
Como puede observarse se trata de dos ventanas: en primer plano la ventana del modelo
actual (con fondo blanco) y detrás se encuentra el entorno de programación de LINGO del
cual se pueden destacar tres áreas: en la parte superior el menú de opciones, debajo la
barra de botones y en la parte inferior la barra de estado (donde se puede observar: el
estado del solver, la posición en el modelo, etc).
Proceda a escribir el modelo en la ventana del modelo (note que la sintaxis de cada uno de
los componentes del mismo se destaca en un color diferente) y cuando este listo proceda
a guardarlo mediante la opción Save del menú File o mediante el botón guardar de la barra
de menú. Dele el nombre que considere conveniente, en nuestro caso lo nombramos
“[Hill97] - Cap. 3 - Pag. 30 - Ej. 3.1” como se podrá observar en la barra de título de la
ventana del modelo. Los archivos de LINGO por default tienen la extensión .lg4.
Ing. Gabriel Arellano
Aprendiendo LINGO
INTRODUCCIÓN A LINGO - 5
Luego de guardar nuestro modelo estamos en condiciones de ordenar a LINGO que intente
resolverlo. Para esto último recurrimos a la opción SOLVE del menú LINGO o bien al botón
Solve (indicado en la imagen).
Al finalizar la resolución del modelo nos mostrará la ventana de resultados:
Global optimal solution found at iteration:
Objective value:
Variable
X1
X2
Row
1
2
3
4
Value
2.000000
6.000000
Slack or Surplus
36.00000
2.000000
0.000000
0.000000
3
36.00000
Reduced Cost
0.000000
0.000000
Dual Price
1.000000
0.000000
1.500000
1.000000
En primer lugar podemos observar el número de iteraciones, en realidad el número de
iteraciones más uno (ya que Lingo llama a la primera SBF como iteración uno).
A continuación nos informa el valor de la función objetivo en el punto óptimo (en nuestro
ejemplo 36), el valor de las variables básicas y su costo reducido, y por último el sobrante
(o slack) y el precio sombra (dual price) de cada restricción. Se debe tener en cuenta que
la fila (row) 1 es el funcional.
Ing. Gabriel Arellano
APRENDIENDO LINGO
6 - INTRODUCCIÓN A LINGO
El lenguaje de modelado de LINGO
Sintaxis de LINGO
La sintaxis que se utiliza en este programa es muy sencilla. Para el nombre de las
variables y otros identificadores se establece que pueden tener 32 caracteres como
máximo, Deben comenzar con una letra seguido de letras, dígitos o _. LINGO no distingue
entre mayúsculas y minúsculas.
Con respecto a las sentencias:
• Todas las sentencias deben terminar en un punto y coma.
• Para darle un nombre a la función objetivo o a las restricciones, estos se deben
colocar entre corchetes.
• Para declarar la función objetivo debemos colocar las palabras reservadas MAX
o MIN, (aparecerán resaltadas en azul), seguidas del signo =.
• Los comentarios deben comenzar con un signo !, los cuales aparecen
resaltados en verde.
Nombre de las restricciones
Como se pudimos observar en los resultados de la resolución del problema resulta un
poco confuso distinguir las distintas restricciones del modelo.
LINGO tiene la habilidad de nombrar las restricciones en su modelo. Ésta es una buena
práctica por dos razones:
• Primero, los nombres de restricciones se usan en el reporte de las soluciones
que los hacen más fácil interpretar.
• Segundo, en muchos de los mensajes de error de LINGO se indica la restricción
mediante su nombre.
Dar nombre a una restricción es bastante simple. Se inserta el nombre entre corchetes,
adelante de una línea de código. El nombre debe obedecer los requisitos normales para un
identificador de LINGO.
! Problema 3.1 Hillier-Lieberman Pag. 30 - Wyndor Glass Co.
Xj = Cantidad a producir del producto j ;
[Beneficio] Max = 3*X1 + 5*X2;
!Sujeto a:
Restricciones de tiempo de produccion;
[Planta_1]
X1
<=4;
[Planta_2]
2*X2 <=12;
[Planta_3]
3*X1 + 2*X2 <=18;
Modelo con nombres en las restricciones.
Resuelva nuevamente el modelo y notará los cambios:
....
Ing. Gabriel Arellano
Variable
X1
X2
Value
2.000000
6.000000
Row
BENEFICIO
PLANTA_1
PLANTA_2
PLANTA_3
Slack or Surplus
36.00000
2.000000
0.000000
0.000000
Reduced Cost
0.000000
0.000000
Dual Price
1.000000
0.000000
1.500000
1.000000
Aprendiendo LINGO
INTRODUCCIÓN A LINGO - 7
Uso de funciones de dominio de variables
Como se dijo anteriormente, a menos que especifique lo contrario, el valor de las variables
por defecto en un modelo de LINGO son no-negativas y continuas. Más específicamente,
las variables pueden asumir algún valor real desde cero a infinito positivo. En muchos
casos, este dominio de valor por defecto puede ser impropio. Por ejemplo, se puede querer
una variable que asuma valores negativos, o se podría querer una variable restringida
puramente a valores enteros. LINGO proporciona cuatro funciones de dominio de variables
que permite sustituir el dominio predefinido de una variable. Los nombres de estas
funciones y una descripción breve de su uso son:
@GIN restringe el dominio de la variable a valores enteros.
@BIN hace que la variable tome valores binarios (es decir, 0 o 1).
@FREE permite que la variable pueda asumir cualquier valor real.
@BND limita los valores de la variable a un rango finito.
Variables enteras y binarias
LINGO le da la posibilidad de definir dos tipos de variables enteras, una general y otra
binaria. Una variable entera general requiere ser un número entero. Una variable entero
binaria requiere ser cero o uno. Cualquier modelo que contiene uno o más variables
enteras, es requerido para un modelo programación entera (IP)
En muchos proyectos de modelos, usted se enfrentará con tipos de decisiones (si/no).
Algunos ejemplos incluirían Produce/No Produce, Abre un Plan/Cierra un Plan, etc. Las
variables binarias son el método normal usado por modelar estas decisiones de si/no.
Variables libres
Por default, las variables en LINGO tiene un límite inferior de cero y un límite superior de
infinito. @FREE quita el límite inferior cero y permite que la variable tome valores
negativos. La sintaxis es:
@FREE (nombre_de_variable);
donde la variable_name es el nombre de la variable libre.
La función @FREE puede usarse en cualquier parte del modelo donde normalmente iría
una restricción. Un ejemplo de @FREE sería:
@FREE (X1);
haría libre a la variable X1.
Variables limitadas
Considerando que @FREE pone el límite superior e inferior de la variable especificada a
más-menos infinito (quitando cualquier límite en la variable), la función de @BND le
permite poner límite superior e inferior específicos en una variable. En otras palabras,
@BND limita el rango de una variable dentro de algún intervalo.
La sintaxis para @BND es:
@BND (lower_bound, nombre_de_variable, upper_bound);
donde el nombre_de_variable es la variable a ser limitada debajo por el limite_inferior y
limitada superiormente por el limite_superior. Limite_inferior y limite_superior deben ser
valores numéricos o variables cuyos valores han sido fijados en la sección de datos.
@BND puede usarse en cualquier lugar que normalmente se usaría una restricción en el
modelo.
Ing. Gabriel Arellano
APRENDIENDO LINGO
8 - INTRODUCCIÓN A LINGO
En términos matemáticos, LINGO interpreta @BND como:
limite_inferior <= nombre_de_variable <= limite_superior
Además, @BND no cuenta contra el límite del número total de restricciones que
Lingo impone en algunas versiones. En general, se usa @BND en lugar de una
restricción siempre que sea posible.
Un ejemplo de @BND sería:
@BND (-1, X1, 1);
haría que la variable X1 sólo pueda tomar valores entre -1 y 1.
Operadores y Funciones
LINGO proporciona varias funciones y operadores para agergar al modelo matemático. Se
muestran las categorías siguientes:
•
•
•
•
•
•
•
•
•
Los Operadores Normales: Aritmética, lógicos, y correlativos como +, -, =, <=.
Mathematical: las funciones matemáticas, trigonométricas y generales.
Financial : las funciones financieras.
Probabilidad: las Funciones utilizadas para determinar una gama amplia de
probabilidad y las respuestas estadísticas.
Dominio de variables : son funciones que definen el rango de valores (dominio)
que una variable puede asumir.
Manejadores de conjuntos: las funciones útiles para manipular conjuntos.
Set Looping: Funciones loop que se utilizan para realizar operaciones en un
conjuntos de datos.
Import/Export: son funciones que crean conexiones con las fuentes de los datos
externas.
Miscellaneous: funciones de distintos tipos.
Ing. Gabriel Arellano
Descargar