Desarrollar un modelo Lingo Para desarrollar un modelo de optimización en Lingo hay que especificar: • Función Objetivo M ax(M in) = COST O1 ∗ V ARIABLE1 + COST O2 ∗ V ARIABLE2; Variables: Los nombres de las variables en Lingo deben empezar con un carácter alfabético, seguido de alfabéticos, numéricos o , hasta un máximo de 32 caracteres. • Restricciones COEF 11 ∗ V AR1 <= DISP ON IBILIDAD1; COEF 21 ∗ V AR1 + COEF 22 ∗ V AR2 <= DISP 2; o bien COEF 11 ∗ V AR1 >= RECU RSO1; COEF 21 ∗ V AR1 + COEF 22 ∗ V AR2 >= REC2; • Comentarios: Comenzarán con el signo admiración “!” y terminarán con el signo de puntuación “;” Lingo no distingue entre letras en mayuscula o en minuscula. Resolución del modelo Para resolver el modelo, seleccionar SOLVE del comando Lingo. Lingo comenzará a compilar el modelo. Si el modelo no pasa la compilación, aparecerá un mensaje error. Ejemplo Max = 2 ∗ x + y; x <= 3; 3x + 2 ∗ y <= 5; Aparecerá: Ventana: LINGO Error Message Error Code: 11 Help OK Error Tex: Invalid input. A syntax has occurred. 3] 3x + 2 ∗ y <= 5; Si no ha habido ningún error aparecerá en pantalla LINGO Solver Status. Max 2x + y s. a. ≤3 x 3x + 2y ≤ 5 x, y ≥ 0 que introduciendo variables de holgura, queda x + s1 3x + 2y =3 + s2 = 5 x, y, s1, s2 ≥ 0 s1 1 s2 0 s2 3 2 zj 0 0 zj − cj −2 −1 s1 0 −2/3 0 0 0 1 1 0 0 −1/3 x zj zj − cj 0 0 0 1/3 2/3 2/3 s1 x 1 1 2 0 y 0 2/3 4/3 1/3 3 5 0 4/3 5/3 10/3 LINGO solver Status SOLVER STATUS Model Class Muestra el tipo de modelo (LP: Programación Lineal; ILP: Programación Lineal Entera,...) State Muestra la situación actual de la solución (Global Opt: Óptimo global; Infeasible: No factible; Unbounded: No acotada;...) Objective Valor de la función objetivo. Infeasibility Cantidad por la que no se verifican las restricciones. Iterations Número de iteraciones necesarias para su resolución. VARIABLES Muestra el número total de variables del modelo. Enteras y no Lineales. CONSTRAINTS Muestra el número total de restricciones del modelo y cúales de ellas son no lineales. NONZEROS Muestra el número de coeficientes no nulos en el modelo y cúales de ellos aparecen en variables no lineales. GENERATOR MEMORY USED(K) Lista la cantidad de memoria. ELAPSED RUNTIME (hh:mm:ss) Muestra el tiempo total usado para generar y resolver el modelo. Solution Report Esta pantalla contiene los detalles de la solución del problema. Global optimal solution found Objective value: 3.333333 Total solver iterations: 2 Variable X Y Value 1,666667 0,0000000 Reduced Cost 0,0000000 0,3333334 Row 1 2 3 Slack or Surplus 3,333333 1,333333 0,0000000 Dual Price 1,000000 0,0000000 0,6666667 Interpretar la Solución Costo reducido: Indican cuánto tendrı́a que mejorar cada uno de los coeficientes de la función objetivo antes de que la correspondiente variable de decisión pueda tomar valor positivo en la solución óptima. Holgura o excedente: Nos dice lo próximo que estamos de satisfacer una restricción. Si una restricción es violada, como en una solución infactible, el valor de estas variables será negativo. Precios duales: Mejora en el valor de la función objetivo por cada incremento unitario en el lado derecho de una restricción. En un problema de maximizar el precio dual es el mismo que el precio sombra. En un problema de minimizar el precio dual es el negativo del precio sombra. Ejemplos Max Z = 3X1 + 2X2 s.a. 2X1 + X2 ≤ 2 3X1 + 4X2 ≥ 12 Xi ≥ 0 Max Z = 36X1 + 30X2 − 3X3 − 4X4 s.a. X1 + X2 − X3 ≤ 5 6X1 + 5X2 − X4 ≤ 10 Xi ≥ 0 Ejemplo 1 Max 3x1 + 2x2 s. a. 2x1 + x2 ≤ 2 3x1 + 4x2 ≥ 12 x, y ≥ 0 que introduciendo variables de holgura y artificiales, queda 2x1 + x2 + s1 =2 3x1 + 4x2 − s2 + A1 = 12 x1 , x 2 , s 1 , s 2 , A1 ≥ 0 Fase I: Max - A1 x2 1 s1 1 s2 0 A1 3 4 zj −3 −4 zj − cj −3 −4 x2 2 1 0 0 0 1 −1 1 12 1 −1 −12 1 0 0 0 2 s1 x1 2 A1 −5 zj 5 z j − cj 5 0 0 0 A1 0 −4 −1 1 4 1 −1 4 1 0 2 4 −4 Ejemplo 2 Max 36x1 + 30x2 − 3x3 − 4x4 s. a. x1 + x2 − x3 ≤ 5 6x1 + 5x2 − x4 ≤ 10 x1 , x 2 , x 3 , x 4 ≥ 0 que introduciendo variables de holgura, queda x 1 + x2 − x 3 6x1 + 5x2 + s1 − x4 =5 + s2 = 10 x1 , x 2 , x 3 , x 4 , s 1 , s 2 ≥ 0 s1 s2 zj zj − cj s1 x1 1 x2 1 6 5 0 0 −36 −30 0 −5/6 x3 −1 x4 0 s1 1 s2 0 0 0 3 −1 −1 0 4 1 /6 0 0 0 1 1 0 0 −1/6 5 10 0 20/6 x1 zj zj − cj x4 1 36 0 0 5/6 30 0 −5 0 0 3 −6 −1/6 −6 −2 1 0 0 0 6 1/6 6 6 −1 10/6 360/8 x1 zj zj − cj 1 36 0 0 20 −10 −1 −12 −9 0 −4 0 1 12 12 0 4 4 5 100 20 !PROBLEMA1; !Variables de decisión: X1 = Bizcochos consumidos diariamente, X2 = Bolas de helado de chocolate consumidas por dı́a, X3 = Número de botellas de refresco tomadas diariamente, X4 = Porciones de Pastel de queso con piña por dı́a; !Función objetivo; M IN = 0.50∗X1+0.20∗X2+0.30∗X3+0.80∗ X4; !Restricción de calorı́as; 400∗X1+200∗X2+150∗X3+500∗X4 >= 500; !Restricción de chocolate; 3 ∗ X1 + 2 ∗ X2 >= 6; !Restricción de azúcar; 2 ∗ X1 + 2 ∗ X2 + 4 ∗ X3 + 4 ∗ X4 >= 10; !Restricción de grasa; 2 ∗ X1 + 4 ∗ X2 + X3 + 5 ∗ X4 >= 8; ! Problema 2; ! Variables de decisión: X1 = Kilos de arroz, X2 = Kilos de pescado, X3 = Kilos de verdura; ! Función Objetivo; M in = 0.70 ∗ X1 + 1.20 ∗ X2 + 0.50 ∗ X3; ! Restricción de calorı́as; 200 ∗ X1 + 300 ∗ X2 + 100 ∗ X3 <= 4000; ! Restricción de proteı́nas; X1 + 3 ∗ X2 + 2 ∗ X3 >= 3; !Problema 3; ! Variables de decisión: X1 = No de sesiones de destilación con Tn, X2 = No de sesiones de destilación con Ta; ! Función Objetivo; M ax = 103 ∗ X1 + 110 ∗ X2; ! Restricción referida a la cantidad de Crudo, C1; 7 ∗ X1 + 10 ∗ X2 <= 1400; ! Restricción referida a la cantidad de Crudo, C2; 12 ∗ X1 + 8 ∗ X2 <= 2000; ! Restricción referida a la demanda de gasóleo; 8 ∗ X1 + 10 ∗ X2 >= 900; ! Restricción referida a la demanda de gasolina normal; 6 ∗ X1 + 7 ∗ X2 >= 300; ! Restricciones referidas a la demanda de gasolina super; 5 ∗ X1 + 4 ∗ X2 <= 1700; 5 ∗ X1 + 4 ∗ X2 >= 800; !Problema 4; ! Variables de decisión: Xi = Número de empleados que empiezan a trabajar el dı́a i; !Función Objetivo; M in = X1 + X2 + X3 + X4 + X5 + X6 + X7; ! Número de empleados requeridos para el Lunes; X1 + X4 + X5 + X6 + X7 >= 17; ! Número de empleados requeridos para el Martes; X1 + X2 + X5 + X6 + X7 >= 13; ! Número de empleados requeridos para el Miércoles; X1 + X2 + X3 + X6 + X7 >= 15; ! Número de empleados requeridos para el Jueves; X1 + X2 + X3 + X4 + X7 >= 19; ! Número de empleados requeridos para el Viernes; X1 + X2 + X3 + X4 + X5 >= 14; ! Número de empleados requeridos para el Sábado; X2 + X3 + X4 + X5 + X6 >= 16; ! Número de empleados requeridos para el Domingo; X3 + X4 + X5 + X6 + X7 >= 11; !Problema 5; ! Variables de decisión: X1 = Onzas de Brutte Regular vendidas anualmente, (no las producidas inicialmente) X2 = Onzas de Brutte Luxery vendidas anualmente,(producidas) X3 = Onzas de Chanelle Regular vendidas anualmente, (no las producidas inicialmente) X4 = Onzas de Chanelle Luxery vendidas anualmente, (producidas) X5 = Libras de materia prima compradas; ! Función Objetivo; M ax = 7 ∗ X1 + (18 − 4) ∗ X2 + 6 ∗ X3 + (14 − 4) ∗ X4 − 3 ∗ X5; ! Horas de laboratorio disponibles; 3 ∗ X2 + 2 ∗ X4 + X5 <= 6000; ! Restricciones referentes a la cantidad de productos disponibles para la venta; X1 + X2 − 3 ∗ X5 = 0; !(X1 + X2 = 3X5); X3 + X4 − 4 ∗ X5 = 0; !(X3 + X4 = 4X5); ! Limitación de materia prima; X5 <= 4000; !Problema 6; ! Variables de decisión: X1 = Euros invertidos en Atlantic Oil, X2 = Euros invertidos en Pacific Oil, X3 = Euros invertidos en Midwest Steel, X4 = Euros invertidos en Huber Steel, X5 = Euros invertidos en Bonos gubernamentales; ! Función Objetivo; M ax = 0,073 ∗ X1 + 0,103 ∗ X2 + 0,064 ∗ X3 + 0,075 ∗ X4 + 0,045 ∗ X5; !Especificamos la inversión de los 100.000 euros; X1 + X2 + X3 + X4 + X5 <= 100000; !No recibir mas del 50 %; X1 + X2 <= 50000; X3 + X4 <= 50000; !Los Bonos deben ser al menos 25 %; −0,25 ∗ X3 − 0,25 ∗ X4 + X5 >= 0; !(X5 ≥ 0,25(X3 + X4)); !Inversión en Pacific Oil no puede ser mas del 60 %; −0,6 ∗ X1 + 0,4 ∗ X2 <= 0; !(X2 ≤ 0,6(X1 + X2)); !Problema 7; ! Variables de decisión: X1 =Millones de euros invertidos en Préstamos personales , X2 = Millones de euros invertidos en Préstamos para automóvil, X3 =Millones de euros invertidos en Préstamos para vivienda, X4 =Millones de euros invertidos en Préstamos agrı́colas, X5 =Millones de euros invertidos en Préstamos comerciales; ! Función Objetivo; M ax = 0,026 ∗ X1 + 0,0509 ∗ X2 + 0,0864 ∗ X3 + 0,06875 ∗ X4 + 0,078 ∗ X5; !(0,14(0,9X1)+0,13(0,93X2)+0,12(0,97X3)+ 0,125(0,95X4)+0,1(0,98X5)−0,1X1−0,07X2− 0,03X3 − 0,05X4 − 0,02X5); ! Fondos totales; X1 + X2 + X3 + X4 + X5 <= 12; ! Préstamos agrı́colas y comerciales; X4 + X5 >= 4,8; !(40 % de12) ); ! Préstamos para viviendas; −0,5 ∗ X1 − 0,5 ∗ X2 + 0,5 ∗ X3 >= 0; !(X3 ≥ 0,5(X1 + X2 + X3)); ! Razón total de los créditos malos; 0,06 ∗ X1 + 0,03 ∗ X2 − 0,01 ∗ X3 + 0,01 ∗ X4 − 0,02 ∗ X5 <= 0; 0,1X1+007X2+0,03X3+0,05X4+0,02X5 ≤ 0,04 ; ! X1+X2+X3+X4+X5 !Problema 8; ! Variables de decisión: X1 = Número de unidades para una sola familia, X2 = Número de unidades para dos familias, X3 = Número de unidades para tres familias, X4 = Número de áreas recreativas; ! Función Objetivo; M ax = 10000 ∗ X1 + 12000 ∗ X2 + 15000 ∗ X3; ! Viviendas de una sola familia (Ap. 1); 0,5 ∗ X1 − 0,5 ∗ X2 − 0,5 ∗ X3 >= 0; !(X1 ≥ 0,5(X1 + X2 + X3)); ! Uso del suelo (Ap 2, parte de 3 y texto después de 4); 2 ∗ X1 + 3 ∗ X2 + 4 ∗ X3 + X4 <= 680; !(680 es 800 menos el 15 %); ! Áreas recreativas (parte de Ap. 3); −X1 − 2 ∗ X2 − 3 ∗ X3 + 200 ∗ X4 >= 0; ); !(X4 ≥ X1+2X2+3X3 200 ! Capital; 1000∗X1+1200∗X2+1400∗X3+800∗X4 >= 100000; ! Consumo de agua; 400 ∗ X1 + 600 ∗ X2 + 840 ∗ X3 + 450 ∗ X4 <= 200000; Análisis de sensibilidad Despues de resolver el problema, usamos el comando Range del menú LINGO para generar un informe de rangos para el modelo activo. Tal informe muestra en qué rango se puede: • Cambiar un coeficiente en la función objetivo sin que cambien los valores óptimos de las variables de decisión. • Cambiar el valor de un recurso o disponibilidad (coeficiente del lado derecho de una restricción) sin causar cambios en los valores óptimos de los precios duales o de los costos reducidos (sin que cambien las variables básicas, es decir la solución siga siendo factible, aunque si pueden cambiar sus valores). Si aparece el mensaje de error: Error Code 122: Range reports not possible when range analysis is disabled hay que ejecutar previamente el comando Options del menú LINGO, y en General Solver seleccionar la opción Prices and Ranges en la lista asociada a Dual Computations. Ejemplo En los ejemplos en los que vayamos a solicitar un Range Report conviene nombrar las restricciones, incluyendo delante de ellas un nombre entre corchetes, para luego poder identificarlas facilmente. [FuncionObjetivo] Max = 20 ∗ A + 30 ∗ C; [Restriccion1] A <= 60; [Restriccion2] C <= 50; [Restriccion3] A + 2 ∗ C <= 120; El informe que proporciona es La primera parte titulada Objective Coefficient Ranges incluye en su primera columna titulada Variable la lista de variables del problema, en la segunda Current Coefficient el coeficiente actual de cada variable en la función objetivo, en la tercera Allowable Increase, la cantidad en que se puede incrementar el coeficiente de cada variable en la función objetivo sin que cambien los valores de la solución óptima y la última Allowable Decrease, la cantidad en que se puede disminuir el coeficiente de cada variable en la función objetivo sin que cambien los valores óptimos de las variables. En nuestro ejemplo, podemos decir que mientras el coeficiente de la variable A en la función objetivo sea mayor o igual a 15, los valores óptimos de las variables no cambian. El coeficiente de la variable C puede variar entre 0 y 40. La segunda parte titulada Right-hand Side Ranges incluye en su primera columna titulada Row la lista de los nombres de las restricciones del modelo, en la segunda Current RHS los valores actuales de los recursos o disponibilidades (coeficiente del lado derecho de las restricciones), y las siguientes Allowable Increase y Allowable Decrease, en cuanto los podemos incrementar o disminuir, respectivamente, sin causar un cambio en los valores óptimos de los precios duales o costos reducidos. En nuestro ejemplo, los precios duales y los costos reducidos permanecen constantes si el coeficiente del lado derecho de la primera restricción está entre 20 y 120, el de la segunda es mayor o igual que 30 y el de la tercera está entre 60 y 160.