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