Introducción a la programación lineal y lineal entera EMALCA 2007 Universidad Nacional Autónoma de Nicaragua- León León, Nicaragua, 19 de febrero al 2 de marzo de 2007 Irene Loiseau Departamento de Computación Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires irene@dc.uba.ar
De qué trata este curso? Estudiar métodos que sirven para resolver problemas que pueden modelarse como problemas de programación lineal o lineal entera.
Qué significa formular y usar un modelos matemáticos para resolver problemas reales?. Qué etapas incluye esta tarea?. Cuándo “sirve” un modelo matemático?
Qué problemas vamos a modelar y resolver en este curso?. Qué es Programación lineal?. Qué es optimización?. Porqué se llama programación lineal?. Dantzig, Kantorovich, el premio Nobel de economía de 1975….. Qué temas se estudian en Investigación Operativa (Operations Research)?. De todos los temas que abarca la Investigación Operativa en este curso estudiaremos SOLO problemas de programación lineal y lineal entera……… (con tenemos algunos métodos para resolver algunos problemas de Optimización Combinatoria)
Bibliografía: Bazaraa,M., Jarvis,J., Sherali,H.,Linear Programming and Networks Flows, John Willey & Sons, 1990. Chvatal, V., Linear Programming, Freeman, 1983. Cook, W., Cunningham, Pulleyblank, Schrijver, A., Combinatorial Optimization, John Willey &.Sons, 1998. Williams, H.P., Model Building in Mathematical Programming, John Willey &.Sons, 1999. Winston,W., Operations Research, Applications and Algorithms, Duxbury Press, 1994. Wolsey,L., Integer Programming, John Willey &.Sons, 1998.
El material distribuido en castellano corresponde al libro: Castillo, E., Conejo,A., pedregal, P., Gracía, R., Alguacil, N. “Formulación y resolución de modelos de programación matemática en ingeniería y ciencias”. disponible por internet. Algunos de los libros clásicos de Investigación Operativa están traducidos al castellano.
Problema de la dieta Ana quiere saber cuanto es el mínimo que puede gastar para alimentarse saludablemente, y obtener las 2000 kcal, 55 grs de proteínas y 800 mg de calcio que necesita cada día (no está tomando en cuenta la necesidad de hierro ni de vitaminas!!). Para eso ella quiere elegir entre las siguientes comidas, cuyos datos aparecen en la siguiente tabla:
cereal 28g 110 4 2 3 pollo 100g 205 32 12 24 huevos 160 13 54 leche Comida Porción kcal Proteinas (g) Calcio(mg) Precio cereal 28g 110 4 2 3 pollo 100g 205 32 12 24 huevos 160 13 54 leche 237cc 8 285 9 pastel 170g 420 22 20 cerdo con porotos 260g 260 14 80 19
Cómo podemos modelar matemáticamente este problema? Por otro lado Ana quiere tener una alimentación variada. No quiere comer todos los días lo mismo, cómo máximo quiere comer: 4 porciones de cereal 3 porciones de pollo 4 huevos 8 porciones de leche 2 porciones de pastel 2 porciones de cerdo con porotos Cómo podemos modelar matemáticamente este problema? Este problema tiene aplicaciones reales por ejemplo en la fabricación de alimentos balanceados para pollos o ganado
Planificación de la producción Formular un modelo para optimizar los costos de producción de una empresa que produce listones de madera en 4 medidas: chico, mediano, grande y extragrande. Estos listones pueden producirse en tres máquinas: A, B y C. Cada máquina puede ser usada 50 horas semanales y el costo operativo por hora de cada una es $30, $50 y $80 respectivamente. Se necesita producir 10000, 8000, 6000 y 4000 metros de cada tipo de listones por semana. La cantidad de metros que puede producir por hora cada máquina está dada en la siguiente tabla:
A B C Chico 300 600 800 Mediano 250 400 700 Grande 200 350 extragrande 100
Optimizando beneficios Una compañia petroquímica procesa petróleo para producir combustible para aviones y aceite de máquina. Cuesta $40 comprar 1000 barriles de petróleo, que luego destilados producen 500 barriles de combustible para aviones y 500 barriles de aceite. Lo que se obtiene de la destilación puede ser vendido directamente o ser procesado nuevamente con un fraccionador catalítico. Si se vende sin el segundo proceso, el combustible para aviones se vende a $60 por 1000 barriles y el aceite para calentar se vende a $40 por 1000 barriles. Lleva 1 hora procesar 1000 barriles de combustible para aviones en el fraccionador catalítico, y esos 1000 barriles se venden a $130.El mismo proceso demora 45 minutos para 1000 barriles de aceite para calentar, y esos 1000 barriles se venden a $90. Cada día, se pueden comprar a lo sumo 20000 barriles de petróleo, y se tienen disponibles 8 horas del fraccionador catalítico. Formular un modelo matemático que maximice los beneficios de la empresa.
Problema de programación lineal (PL) maximizar c1 x1+ c2 x2 +…… + cn xn sujeto a a11 x1 + a12 x2 + …………+ a1n xn ≤ b1 a21 x1 + a22 x2 + …………+ a2n xn ≤ b2 . am1 x1 + am2 x2 + …………+ amn xn ≤ bm xj ≥ 0 para j = 1,…..n (forma standard de un problema de PL)
Cuando hablamos de Programación Lineal (PL) suponemos que las variables xj son variables continuas, es decir xj R+ para todo j. Cuando se requiere que las variables sean enteras es decir xj Z+ tendremos problemas de programación lineal entera (PLE) y cuando sean binarias tendremos problemas de programación lineal binarios (ó 0-1). Empezaremos viendo como resolver problemas de Programación Lineal con variables continuas (PL)
El problema de PL se puede escribir también como: Max ∑j cj xj sujeto a ∑j aij xj ≤ bi i = 1,…..m xj ≥ 0 para j = 1,…..n :
O en forma matricial: Max c x sujeto a Ax ≤ b x ≥ 0 donde x es el vector columna de las n variables xj, b es el vector columna de m componentes bi y A es una matriz de m filas y n columnas con los coeficientes de las desigualdades.
Los problemas de programación lineal pueden ser de maximización o minimización, y pueden tener restricciones por desigualdad en cualquiera de los dos sentidos, o restricciones de igualdad. Las variables pueden o no ser nonegativas y/o acotadas. Llamaremos forma standard de un problema de programación lineal de maximización cuando el mismo está expresado usando desigualdades por ≤ y forma canónica cuando sólo se usan igualdades (está notación no es uniforme en los libros!!!).
Nomenclatura: Función objetivo Coeficientes de la función objetivo Variables o variables de decisión Restricciones Coeficientes tecnológicos: los coeficientes de la matriz A. Restricciones de nonegatividad. Termino de la derecha (right-hand-side) Solución factible Conjunto de soluciones factibles o región factible
Algunas aplicaciones de programación lineal y programación lineal entera Problemas de mezcla, fabrica de comestibles Planificación de la producción Manejo de stock Planificación de mantenimiento Planificación de recursos de mano de obra Optimización de refinerías Diseño de componentes de VLSI Determinar tarifas de electricidad Transporte de mercaderías Minimización de desperdicio en el corte de materiales Ruteo de vehículos Asignación de tareas Asignación de tripulaciones en empresas de transporte aéreo
Planificación en economía Flujo óptimo en redes Diseño de redes de comunicaciones Asignación de frecuencias en telefonía celular Planificación de campañas publicitarias en TV Planificación de semáforos Secuenciamiento de ADN Doblado de proteínas Otros problemas de biología computacional Etc., etc.
Cómo representamos la región factible del siguiente problema? Maximizar 2 x1 + 5 x2 sujeto a x1 + x2 ≥ 6 x1 + 2 x2 ≤ 18 x1 ,x2 ≥ 0
Solución Geométrica Cómo podemos aprovechar la representación de la región factible para resolver geométricamente un problema de PL de dos variables? . Cómo resolver el problema anterior?. Cómo podemos resolver el siguiente problema?: Maximizar x1 + 3 x2 sujeto a x1 + x2 ≤ 6 - x1 + 2 x2 ≤ 8 x1 ,x2 ≥ 0
Cuál es la solución del siguiente problema? Minimizar - 2x1 + 3 x2 sujeto a - x1 + 2 x2 ≤ 2 2 x1 - x2 ≤ 3 x2 ≥ 4 x1 ,x2 ≥ 0 Qué significa en un modelo de un problema real que tengamos una región factible cómo esta?.
Vemos que si el PL tiene una solución óptima finita la misma está en uno de los vértices del poliedro que describe la región factible. (demostraremos formalmente esto más adelante) Este método es apropiado sólo para problemas pequeños de dos o tres variables, pero es importante para entender los problemas de programación lineal en general
Cuántas soluciones óptimas tiene un problema de PL Cuántas soluciones óptimas tiene un problema de PL ?. Cómo se ve esto en la representación geométrica de la región factible?. Una única solución óptima Infinitas soluciónes óptimas (región factible acotada o no acotada) Ninguna solución óptima: la región factible es vacía. Ninguna solución óptima: la región factible y la solución óptima son no-acotadas. Qué significa en un modelo de un problema real que se produzcan cada una de estas situaciones ?
Método Simplex Presentado por Dantzig en 1947 (publicado en 1949) Uno de los (o él) método de matemática más usados para resolver problemas reales. Se usa también como importante herramienta para resolver otros problemas de optimización, en particular problemas de programación lineal entera. Tamaño de los problemas que resolvía entonces y ahora.
Presentaremos en primer lugar con un ejemplo las ideas básicas para un problema de PL en la forma standard Maximizar 5 x1 + 4 x2 + 3 x3 Sujeto a 2 x1 + 3 x2 + x3 ≤ 5 4 x1 + x2 + 2 x3 ≤ 11 (1) 3 x1 + 4 x2 + 2 x3 ≤ 8 x1 , x2 , x3 ≥ 0
El método consiste en mejorar iterativamente el valor de la función objetivo, revisando sistemas de inecuaciones equivalentes al sistema original (1) de desigualdades que describe la región factible.
En primer lugar definimos 3 variables nonegativas x4, x5, x6 llamadas variables de holgura (slacks) que nos transforman el sistema de desigualdades en un sistema de igualdades 2 x1 + 3 x2 + x3 + x4 = 5 4 x1 + x2 + 2 x3 + x5 = 11 3 x1 + 4 x2 + 2 x3 + x6 = 8 Y definimos una variable z que representa el valor de la función objetivo z = 5 x1 + 4 x2 + 3 x3
Despejamos las variables de holgura y reescribimos nuestro sistema: x4 = 5 - 2 x1 - 3 x2 - x3 x5 = 11 - 4 x1 - x2 - 2 x3 (2) x6 = 8 - 3 x1 - 4 x2 - 2 x3 -------------------------------------------------------------------------- z = 5 x1 + 4 x2 + 3 x3
Entonces nuestro problema se puede reformular como Maximizar z Sujeto a x1 , x2 , x3 , x4 , x5 , x6 ≥ 0 Cada solución de problema original determina una única solución de este nuevo problema (2). Cada solución de (2) se puede restringir a una solución de (1) si no consideramos las variables de holgura. Entonces esta correspondencia entre las soluciones básicas de ambos sistemas establece también una correspondencia entre soluciones óptimas.
Cómo obtenemos de este último sistema (2 )una solución factible del problema?. Por ejemplo si ponemos todas las variables de decisión en 0, tenemos: X1 = 0, X2 = 0, X3 = 0, X4 = 5, X5 = 6, X6 = 8 Cuál es el valor de la función objetivo en esta solución? z = 0 Cómo podemos obtener una solución mejor a partir de acá?.
--------------------------------------------------------------- Miremos de nuevo el sistema (2). Cómo podemos hacer crecer z?. x4 = 5 - 2 x1 - 3 x2 - x3 x5 = 11 - 4 x1 - x2 - 2 x3 x6 = 8 - 3 x1 - 4 x2 - 2 x3 --------------------------------------------------------------- z = 5 x1 + 4 x2 + 3 x3 Si dejamos x2 y x3 fijos en 0 cuánto puede crecer x1 sin que la solución deje de ser factible o sea sin que ninguna de las variables x4 ,, x5 y x6 dejen de ser positivas?. Cuál es la variable que más limita el crecimiento de x1?.
Si x1 crece lo más posible manteniendo la factibilidad, o sea hasta tomar el valor 5/2, la nueva solución queda: x1 = 5/2 , x2 = 0 x3 = 0 , x4 = 0 x1 = 1 , x6 = ½ Qué valores toma la función objetivo en este punto?. z = 25/2 Cómo seguimos a partir de acá para ver si podemos hacer crecer este valor? Vamos a tratar de obtener un sistema similar al sistema (2), es decir un sistema donde la variables que valen 0 sean las únicas que figuren en la ecuación de z.
Para eso vamos a “cambiar” la variable x1 por la variable x4 que es la que “limita” el crecimiento de x1. Si despejamos x1 de la primera ecuación de (2) queda: x1 = 5/2 – 3/2 x2 – ½ x 3 - ½ x4 Si reemplazamos esta ecuación en las otras dos ecuaciones del sistema (2) obtenemos un nuevo sistema…
--------------------------------------------------------------- x1 = 5/2 – 3/2 x2 – 1/2 x3 -1/2 x4 x5 = 1 + 5 x2 + 2 x4 (3) x6 = 1/2 + 1/2 x2 – 1/2 x3 + 3/2 x4 --------------------------------------------------------------- z = 25/2 – 7/2 x2 + 1/2 x3 - 5/2 x4 Es posible que el valor de z siga creciendo?. O sea, cómo podemos hacer para ver si hay alguna otra solución factible que tenga un valor mayor que 25/2? . Hay alguna de las variables de las que aparecen en la expresión de z, (o sea que tienen valor 0) que pueda aumentar de valor (sin que las otras variables que aparecen en la expresión de z cambien)? Mirando la última fila vemos que la única variable que puede aumentar de valor para que aumente el valor de z es x3. Hasta cuanto podemos aumentar el valor de x3 ?.
Para que el sistema siga siendo factible o sea para que las todas la variables sigan siendo nongativas lo máximo que puede crecer x3 es 1. Si reemplazamos este valor en (3) obtenemos una nueva solución factible: x1 = 2 , x2 = 0 x3 = 1 , x4 = 0 x5 = 1 , x6 = 0 y vemos que el valor de la función objetivo en esta solución es Z = 13 Podemos aumentar el valor de la función objetivo aún más?.
Para ver esto repetimos el procedimiento anterior Para ver esto repetimos el procedimiento anterior. Es decir vamos a escribir las ecuaciones de modo de tener un sistema donde la variables que figuren en la ecuación de z valgan todas 0. Para esto, como hicimos antes, despejamos x3 de la ecuación de la variable que limitó su crecimiento, en este caso x6. Obtenemos: x3 = 1 + x2 + 3 x 4 - 2 x6
--------------------------------------------------------------- Si reemplazamos x3 por esta expresión en el sistema (3) obtenemos un nuevo sistema: x3 = 1 + x2 + 3 x 4 - 2 x6 x1 = 2 - 2 x2 - 2 x4 + x6 (4) x5 = 1 + 5 x2 + 2 x4 --------------------------------------------------------------- z = 13 – 3 x2 - x4 - x6 Podemos hacer crecer más el valor de z o sea de la función objetivo?. Qué nos garantiza que esta solución es la óptima?.
Que hemos pasado de un sistema de ecuaciones a otro equivalente sucesivamente, y que entonces TODAS las soluciones factibles de nuestro problema original tienen que satisfacer (4).
En el caso general si tenemos el problema Max ∑j cj xj sujeto a ∑j aij xj ≤ bi i = 1,…..m xj ≥ 0 para j = 1,…..n (con los bi todos positivos) introducimos las variables slacks xn+1, xn+2, xn+3 ……xn+m , llamamos z a la funión objetivo y escribimos el sistema equivalente: xn+i = bi - ∑j aij xj z = ∑j cj xj
Asociamos a este sistema una solución factible que se obtiene asignando valor 0 a las variables originales del problema. xj = 0 para j = 1,…..n x n+ i = bi para i= 1, ….m Iterativamente pasaremos de un sistema como este a otro hasta obtener una solución óptima. Las variables que aparecen en el miembro de la izquierda de las ecuaciones de cada sistema se llaman básicas, las que aparecen a la derecha se llaman variables no-básicas. Las variables básicas no aparecen en la expresión de la función objetivo. Para cada uno de estos sistemas obtenemos una solución factible básica del problema asignando valor 0 a las variables no básicas.
No todas las soluciones factibles son soluciones básicas! Resumen del método: A partir del primer sistema, iterativamente, mientras el valor de la función objetivo pueda mejorar: Elegir alguna variable no-básica cuyo valor pueda crecer ( o sea que figura con signo más en la función objetivo). (variable de entrada) Determinar la ( o una de las) variable básica que limita más el crecimiento de la variable elegida en el paso anterior. (variable de salida). Despejar la variable no básica elegida de la ecuación correspondiente a la variable básica. Reemplazar en el sistema anterior y obtener un nuevo sistema. Asignar valor 0 a la nueva variable no-básica, obtenemos una nueva solución factible del problema original (estas soluciones se llaman soluciones básicas). No todas las soluciones factibles son soluciones básicas!
En los programas computacionales el método se implementa usando matrices (lo veremos más adelante). Formato Tableau: muchas veces este método se presenta usando un formato tableau, o sea realizando las operaciones sobre una tabla que incluye sólo los coeficientes del sistema.
Qué son geométricamente las soluciones básicas?. Ejemplo: Representar gráficamente el conjunto de soluciones factibles del siguiente problema. Resolver, eligiendo en cada paso la variable no-básica de mayor coeficiente y representar cada solución básica factible obtenida. Maximizar 3 x1 + 2 x2 + 5 x3 Sujeto a 2 x1 + x2 ≤ 4 x3 ≤ 5 x1 , x2 , x3 ≥ 0
Ejercicios 1- Maximizar x1 + 4 x2 + 3 x3 Resolver los siguientes problemas por el método simplex: 1- Maximizar x1 + 4 x2 + 3 x3 Sujeto a x1 + 3 x2 + x3 ≤ 3 - x1 3 x3 ≤ 2 2 x1 - x2 + 2 x3 ≤ 4 2 x1 + 3 x2 - x3 ≤ 2 x1 , x2 , x3 ≥ 0
2 - Maximizar 3 x1 + 2 x2 + 4 x3 Sujeto a x1 + x2 + 2 x3 ≤ 4 2 x1 3 x3 ≤ 5 2 x1 + x2 + 3 x3 ≤ 7 x1 , x2 , x3 ≥ 0 3 - Maximizar 5x1 + 6 x2 + 9 x3 + 8 x4 x1 + 2 x2 + 3 x3 + x4 ≤ 5 x1 + x2 + 2 x3 + 3 x4 ≤ 3 x1 , x2 , x3 ,x4 ≥ 0
Qué problemas pueden aparecer al aplicar el método simplex y cómo resolverlos: Siempre podemos encontrar una variable de entrada en la base y una de salida?. El método termina siempre, no podría ser que realice un número infinito de pasos?. Siempre podemos obtener una solución inicial?. Qué pasa si los bi no son positivos?. Cuánto tarda el método simplex en resolver un problema
Siempre podemos encontrar una variable de entrada en la base y una de salida?. La variable de entrada es una variable no-básica con coeficiente positivo en la función objetivo z. Puede haber varias para elegir, en cuyo caso da lo mismo elegir cualquiera o ninguna, en cuyo caso estamos en el óptimo. La variable de salida es la variable básica cuya restricción de ser no-negativa es la que más limita el crecimiento de la variable de entrada. Puede haber varias candidatas o ninguna. Veamos ambas posibilidades.
---------------------------------------------------- Qué significa que no haya ninguna variable básica que pueda salir?. Veamos el siguiente ejemplo.. x2 = 5 + x3 - x 4 - 3 x1 x5 = 7 - 3 x4 - 4 x1 ---------------------------------------------------- z = 5 + x3 - x4 - x1 Si no hay ninguna variable que limita el crecimiento de la variable de entrada el problema es no acotado.
--------------------------------------------------------------- Qué puede ocurrir si hay más de una variable básica que pueda salir?. Podemos elegir cualquiera de ellas para salir. Pero puede ocurrir lo siguiente, veamos un ejemplo: x4 = 1 - 2 x3 x5 = 3 - 2 x1 - 4 x2 - 6 x3 x6 = 2 + x1 - 3 x2 - 4 x3 --------------------------------------------------------------- z = 2 x1 - x2 + 8 x3 Elegimos x3 como variable de entrada. Las tres variables básicas pueden ser variables de salida. Supongamos que elegimos x4
---------------------------------------------------- ----------- x3 = 0.5 - 0.5 x4 x5 = - 2 x1 - 4 x2 + 3 x4 x6 = x1 - 3 x2 - 4 x4 ---------------------------------------------------- ----------- z = 4 + 2 x1 - x2 - 4 x4 Qué pasa si elegimos x1 como variable de entrada?. Cuánto puede crecer?. La variable de salida tiene que ser x5. x1 = - 2 x2 + 1.5 x4 -0.5 x5 x3 = 0.5 - 0.5 x4 x6 = - x2 + 3.5 x4 - 0.5x5 --------------------------------------------------------------- z = 4 + 3 x2 - x4 - x5 Se puede ver que la función objetivo no creció en este caso. Porqué ?.
Las soluciones básicas que tienen una o más variables básicas con valor 0 se llaman degeneradas. Esta situación se presenta con frecuencia en problemas de PL derivados de aplicaciones reales, y en general no trae ningún problema…..como podemos ver si seguimos resolviendo el ejemplo anterior ….. después de dos iteraciones más se llega al óptimo. (ejercicio) Pero también puede ocurrir que el método simplex, cómo lo estamos presentando hasta ahora siga realizando una cantidad infinita de iteraciones (ciclado)
Ejemplo: Resolvemos el siguiente ejemplo con las siguientes reglas (arbitrarias) de entrada y salida de variables: Elegimos la variable de entrada como la que tiene el coeficiente más grande entre las posibles candidatas. En caso de empate elegimos la variable de salida que tiene menor índice.
---------------------------------------------------- ----------- Maximizar 10 x1 - 57 x2 - 9 x3 - 24 x4 sujeto a - 0.5 x1 + 5.5 x2+ 2.5 x3 - 9 x4 ≤ 0 - 0.5 x1 + 1.5 x2+ 0.5 x3 - x4 ≤ 0 x1 ≤ 1 x1 , x2 , x3 , x4 ≥ 0 Después de agregar las variables de holgura tenemos el primer sistema: x5 = - 0.5 x1 + 5.5 x2+ 2.5 x3 - 9 x4 x6 = - 0.5 x1 + 1.5 x2+ 0.5 x3 - x4 x7 = 1 - x1 ---------------------------------------------------- ----------- z = 10 x1 - 57 x2 - 9 x3 - 24 x4
Obtenemos los siguientes sistemas. x1 = 11 x2 + 5 x3 -18 x4 - 2 x5 x6 = - 4 x2 - 2 x3 + 8 x4 + x5 x7 = 1 - 11 x2 - 5 x3 + 18 x4 + 2 x5 --------------------------------------------- -------------------------------------------------- z = 53 x2 + 41 x3 - 204 x4 - 20 x5 x2 = - 0.5 x3 + 2 x4+ 0.25 x5 – 0.25 x6 x1 = - 0.5 x3 + 4 x4+ 0.75 x5 - 2.75x6 x7 = 1 + 0.5 x3 - 4 x4 -0.75 x5 + 2.75 x6 ---------------------------------------------------- ------------------------------------------- z = 14.5 x3 - 98 x4 - 6.75 x5 - 13.25 x6
x3 = 8 x4 + 1.5 x5 – 5.5 x6 – 2 x1 x2 = - 2 x4 - 0.5 x5+ 2.5 x6 + x1 x7 = 1 x1 ---------------------------------------------------- ------------------------------------------- z = 18 x4 + 15 x5 - 93 x6 - 29 x1 x4 = - 0.25 x5 + 1.25 x6+ 0.5 x1 – 0.5 x2 x6 = - 0.5 x5 + 4.5 x6 + 2 x1 - 4 x2 x7 = 1 - x1 z = 10.5 x5 - 70.5 x6 - 20x1 - 9 x2
x5 = - 9 x6 + 4 x1 - 8 x2 – 2 x3 x4 = - x6 - 0.5 x1 + 1.5 x2 + 0.5 x3 x7 = 1 - x1 ---------------------------------------------------- ------------------------------------------- z = 24 x6 + 22 x1 - 93 x2 - 21 x3 X5 = - 0.5 x1 + 1.5 x2+ 0.5 x3 - x4 x6 = - 0.5 x1 + 5.5 x2+ 2.5 x3 - 9 x4 x7 = 1 - x1 ---------------------------------------------------- -------------------------------------------- z = 10 x1 - 57 x2 - 9 x3 - 24 x4
Este último sistema es igual al primero (y por lo tanto la última solución es igual a la primera), o sea si seguimos iterando vamos a ciclar permanentemente entre estas soluciones y el método no va a parar nunca…..
Puede ser que el método cicle a partir de una solucion que no sea degenerada?. NO porque cuando cicla el valor de la función objetivo no aumenta (no podría volver a una solución anterior si aumentara). Es muy poco frecuente que haya problemas donde el método simplex cicle. Es difícil construir ejemplos donde esto pase. Teorema: Si el método simplex no termina es porque cicla. Demostración resumida: Hay un número finito de soluciones básicas (se obtienen eligiendo m variables entre n+m posibles), por lo tanto si hay infinitas iteraciones, se tienen que repetir las soluciones básicas, y los correspondientes sistemas de ecuaciones.
Hay varias formas de evitar que el método simplex cicle Hay varias formas de evitar que el método simplex cicle. Una de ellas está dada por es la siguiente: Teorema: Si en caso de empate se eligen como variable de entrada o salida la que tiene el menor subíndice entonces el método termina. (o sea no cicla). Dem: ver por ejemplo libro de Chvatal o de Bazaraa et all.
Qué pasa si los bi son negativos?. Podemos aplicar el método al siguiente problema?: Maximizar x1 - x2 + x3 sujeto a 2 x1 - x2 + 2 x3 ≤ 4 2 x1 - 3 x2+ x3 ≤ - 5 x1 + x2 - 2 x3 ≤ -1 x1 , x2 , x3 ≥ 0 Cómo obtenemos una solución básica factible inicial?
Cómo conseguimos una solución y un sistema de donde empezar?. Hay varias formas de plantear un problema auxiliar para hacer esto. Una de ellas es: Si tenemos nuestro problema original: Max ∑j cj xj sujeto a ∑j aij xj ≤ bi i = 1,…..m xj ≥ 0 para j = 1,…..n planteamos un nuevo problema de programación lineal, llamado problema auxiliar o fase 1…. …
x n+i = bi - ∑j aij xj + x0 i = 1,…..m Min x0 sujeto a ∑j aij xj - x0 ≤ bi i = 1,…..m xj ≥ 0 para j = 0, 1,…..n Para qué nos sirve resolver este nuevo problema?. Es más fácil resolver este problema que el original? El primer sistema para este problema quedaría agregando las variables de holgura: x n+i = bi - ∑j aij xj + x0 i = 1,…..m ------------------------------ w = - x0
Ejemplo: Maximizar x1 - x2 + x3 sujeto a 2 x1 - x2 + 2 x3 ≤ 4 2 x1 - 3 x2+ x3 ≤ - 5 x1 + x2 - 2 x3 ≤ -1 x1 , x2 , x3 ≥ 0 El problema auxiliar es: Minimizar x0 2 x1 - x2 + 2 x3 - x0 ≤ 4 2 x1 - 3 x2+ x3 - x0 ≤ - 5 x1 + x2 - 2 x3 - x0 ≤ -1 x0 , x1 , x2 , x3 ≥ 0
----------------------------------------------------------- Si agregamos las variables de holgura tenemos el primer sistema: x4 = 4 - 2 x1 + x2 - 2 x3 + x0 x5 = - 5 - 2 x1 + 3 x2 - x3 + x0 x6 = -1 + x1 - x2 + 2 x3 + x0 ----------------------------------------------------------- w = - x0 Podemos obtener una solución factible de este sistema? No, pero si hacemos entrar x0 y hacemos salir la variable más “infactible”, o sea la variable negativa con menor valor, obtenemos un sistema factible para el problema auxiliar. En este caso hacemos salir a x5.
----------------------------------------------------------- x0 = 5 + 2 x1 -3 x2 + x3 + x5 x4 = 9 - 2 x2 - x3 + x5 x6 = 4 + 3 x1 - 4 x2 + 3 x3 + x5 ----------------------------------------------------------- w = - 5 - 2 x1 + 3 x2 - x3 - x5 Si aplicamos el método simplex a partir de acá, haciendo entrar a la variable x2 y salir a x6 obtenemos: x2 = 1 + 0.75 x1 + 0.75 x3 + 0.25 x5 -0.25 x6 x0 = 2 - 0.25 x1 - 1.25 x3 + 0.25 x5 - 0.75 x6 x4 = 7 - 1.5 x1 - 2.5 x3 + 0.5 x5 + 0.5 x6 ------------------------------------------------------------------------------------- w = 2 + 0.25 x1 + 1. 25 x3 - 0.25 x5 - 0.75 x6
x3 = 1.6 – 0.2 x1 + 0.2 x5 + 0.6 x6 -0.8 x0 x2 = 2.2 + 0.6 x1 + 0.4 x5 – 0.2 x6 - 0.6 x0 x4 = 3 - x1 - x6 + 2 x0 ---------------------------------------------------------------------------------------- w = - x0 Esta es la solución óptima del problema auxiliar?. Qué nos indica?. Cómo pasamos de este sistema a un sistema para resolver el problema original? . Para obtener un sistema del problema original “borramos” x0 y calculamos el valor de la función objetivo z en función de las variables no-básicas x1, x5 y x6 .
Obtenemos un sistema y una solución factible del problema original a partir del cual aplicamos el método simplex. x3 = 1.6 – 0.2 x1 + 0.2 x5 + 0.6 x6 x2 = 2.2 + 0.6 x1 + 0.4 x5 – 0.2 x6 x4 = 3 - x1 - x6 ---------------------------------------------------------------------------------------- z = -0.6 + 0.2 x1 - 0.2 x5 + 0.8 x6 Ejercicio: terminar de resolver a partir de acá el problema original. Volviendo al caso general: Qué posibles soluciones puede tener el problema auxiliar?. Qué significa cada una de ellas?
Cuánto tarda el método simplex en resolver un problema?. En el peor caso (ejemplo de Klee y Minty, 1972) puede realizar una cantidad exponencial de pasos, o sea revisar una cantidad exponencial de soluciones básicas ( o vértices del poliedro) En la práctica sin embargo consigue resolver problemas muy grandes de miles de variable en un tiempo razonable: típicamente el número de iteraciones crece proporcionalmente a m (2m o 3m) y muy lentamente con n.
Dualidad Supongamos que queremos obtener cotas inferiores y superiores a la solución óptima del siguiente problema: Maximizar 4 x1 + x2 + 5 x3 + 3 x4 sujeto a x1 - x2 - x3 + 3 x4 ≤ 1 5 x1 + x2+ 3 x3 + 8 x4 ≤ 55 (5) x1 + 2 x2 + 3 x3 - 5x4 ≤ 3 x1 , x2 , x3 ,x4 ≥ 0
Para encontrar cotas inferiores del óptimo z Para encontrar cotas inferiores del óptimo z*, es suficiente con tomar cualquier solución factible, básica o no, y calcular el correspondiente valor de la función z. Por ejemplo si en el problema anterior tomamos la solución factible z = (2,1,1,1/3) sabemos que el óptimo tiene que ser mayor que el valor de la función objetivo en este punto que es z= 15. O sea z* ≥ 15.
Cómo hacemos si queremos encontrar cotas superiores de este problema?. Recordemos que todos los xi son positivos, entonces: Por ejemplo podríamos si multiplicamos la segunda ecuación por 5/3 tenemos 25/3 x1 + 5/3 x2 + 5 x3 + 40/3 x4 ≤ 275/3 y podemos ver que: 4 x1 + x2 + 5 x3 + 3 x4 ≤ 25/3 x1 + x2 + 5 x3 + 3 x4 ≤ 275/3 y entonces resulta z* ≤ 275/3 Si sumamos la segunda y la tercera ecuación obtenemos 4 x1 + 3 x2 + 6 x3 + 3 x4 ≤ 58 y entonces vemos que 4 x1 + x2 + 5 x3 + 3 x4 ≤ 4 x1 + 3 x2 + 6 x3 + 3 x4 ≤ 58 y por lo tanto z* ≤ 58
Hagamos esto de manera más sistemática: Construyamos una combinación lineal de las restricciones, multiplicando la primera por una variable y1, la segunda por y2 y la tercera por y3 (todas positivas) , obtenemos: y1( x1 - x2 - x3 + 3 x4) + y2 ( 5 x1 + x2+ 3 x3 + 8 x4 y1) + y3 ( - x1 + 2 x2 + 3 x3 - 5x4) ≤ y1 + 55 y2 + 3 y3 Reescribimos esto como:
(y1 + 5y2 - y3 ) x1 + (- y1 + y2 + 2 y3 ) x2 + (- y1 + 3y2 +3 y3 ) x3 + (3 y1 + 8y2 - 5 y3 ) x4 ≤ y1 + 55y2 + 3 y3 Para obtener una cota superior de la función objetivo z tenemos que tener entonces que: y1 + 5y2 - y3 ≥ 4 - y1 + y2 + 2 y3 ≥ 1 - y1 + 3y2 +3 y3 ≥ 5 3 y1 + 8y2 - 5 y3 ≥ 3
Si y1 , y2 ,y3 verifican estas ecuaciones entonces para cualquier solución factible x1 , x2 , x3 , x4 del primal se verifica que: 4 x1 + x2 + 5 x3 + 3 x4 ≤ y1 + 55y2 + 3 y3 Entonces para obtener la cota lo más próxima posible a z* tenemos que resolver el siguiente problema: Minimizar y1 + 55y2 + 3 y3 Sujeto a y1 + 5y2 - y3 ≥ 4 - y1 + y2 + 2 y3 ≥ 1 - y1 + 3y2 +3 y3 ≥ 5 3 y1 + 8y2 - 5 y3 ≥ 3 Este problema se llama el problema dual del problema original de maximización (5)
En general si tenemos el problema (que llamaremos primal) Maximizar ∑j cj xj sujeto a ∑j aij xj ≤ bi i = 1,…..m (6) xj ≥ 0 para j = 1,…..n Definimos el problema dual como: Minimizar ∑i bi yi ∑i aij yi ≥ cj j = 1,…..n (7) yi ≥ 0 para i = 1,…..n
Proposición: Si (x1 , x2 ,…… xn ) es solución factible del problema primal (6) y (y1 , y2 ……ym) es una solución factible del problema dual (7) entonces ∑j cj xj ≤ ∑i bi yi Dem: resumen, usar las definiciones de ambos problemas. Qué significa esto desde el punto de vista práctico?
Corolario (certificado de optimalidad): Si (x*1 , x*2 ,…… x*n ) es una solución factible del problema primal (6) y (y*1 , y*2 ……y*m) es solución factible del problema dual (7) y se verifica que ∑j cj x*j = ∑i bi y*i entonces (x*1 , x*2 ,…… x*n ) es solución óptima del primal y (y*1 , y*2 ……y*m) es solución óptima del problema dual. Para que sirve este resultado? Por ejemplo en el problema (5) si x1 = 0, x2 = 14, , x3 = 0, x4 = 5, y y1 = 11, y2 = 0, y3 = 6 calculando los valores de las funciones objetivo del primal y del dual podemos certificar que ambas soluciones son óptimas.
Teorema de dualidad Si el problema primal (6) tiene una solución óptima x* = (x*1 , x*2 ,…… x*n ) entonces el problema dual (7) tiene una solución óptima y* = (y*1 , y*2 ……y*m) y se verifica que ∑j cj x*j = ∑i bi y*i Dem: ver libros de Chvatal o Bazaraa o cualquier otro libro de programación lineal.
Resumen de la dem.: hay que “fabricar” una solución óptima del dual (y*1 , y*2 ……y*m). Si el sistema óptimo del dual tenía en la última fila z = z* + ∑k=1n+m ck xk entonces se define yi* = - cn+i y se demuestra que esta es una solución factible del problema dual, y que el valor objetivo de esta solución es igual a la del primal. (o sea tomamos el coeficiente de la variable n+i de holgura en el último sistema como valor de la variable dual yi)
Ejemplo: en el caso del problema (5) si lo resolvemos por el método simplex vemos que el último sistema es: x2 = 14 – 2 x1 - 4 x3 - 5 x5 - 3 x7 x4 = 5 - x1 - x3 – 2 x5 - x7 x6 = 1 + 5 x1 + 9 x3 + 21 x5 + 11 x7 ---------------------------------------------------------------------------------------- z = 29 - x1 - 2 x3 - 11 x5 - 6x7 Vemos entonces que ahí tenemos la solución óptima del problema primal: x1 = 0, x2 = 14, , x3 = 0, x4 = 5 y del dual y1 = 11, y2 = 0, y3 = 6 (correspondientes a los coeficientes de las variables de holgura x5, x6 , y x7 en la fila de la función objetivo)
Cómo formulamos el problema dual de un problema de minimización?. El dual del problema dual es el primal. Por lo tanto del teorema de dualidad se deducen los siguientes resultados: el problema primal tiene una solución óptima si y sólo si el problema dual tiene una solución óptima.
Si el problema primal es no acotado entonces el dual es nofactible. (se demuestra usando la proposición que ya vimos que dice que si (x1 , x2 ,…… xn ) es solución factible del problema primal y (y1 , y2 ……ym) es una solución factible del problema dual entonces ∑j cj xj ≤ ∑i bi yi). Si el problema primal es no factible entonces el problema dual es no acotado. (se demuestra en forma similar a ii) Veamos cuales son todas las posibilidades en el siguiente cuadro:
Posibles situaciones del primal y el dual Problema Dual Optimo No factible No acotado Posible Imposible Problema primal
Teorema de holgura complementaria Si x* es una solución factible del primal y y* es una solución factible del dual, entonces x* e y* son soluciones óptimas del primal y del dual respectivamente, si y sólo si se verifica ∑i bi y*i = cj ó x*j = 0 para j=1,…n ∑j cj x*j = ó y*i = 0 para b i =1,…m Dem, resumen: Usar que las soluciones x* e y* son factibles en ambos problemas y el teorema de dualidad. Porqué este teorema tiene este nombre?.
Otra forma de presentar este mismo resultado: Corolario: una solución factible del problema primal x* es óptima si y sólo si existen valores y*1 , y*2 ……y*m que verifican que: ∑i aij y*i = cj cuando x*j > 0 y*i = 0 cuando ∑j aij x*j < bi ∑i aij y*i ≥ cj para j = 1,…n y*i ≥ 0 para i= 1,…..m Dem: ejercicio, usar teorema de dualidad y holgura complementaria.
Cuál es la importancia práctica de la teoría de dualidad? Puede ser más fácil resolver el dual que el primal. Cuándo? Provee un certificado de optimalidad. Veremos que es una herramienta fundamental para resolver problemas de programación lineal entera, (cuando las variables del problema tienen que tomar valores enteros).
Significado económico de las variables duales Las variables duales se llaman también precios sombra o valores marginales. Supongamos que tenemos un problema de maximizar el beneficio en una fabrica de muebles (por ejemplo el problema (5 ) podría serlo): cada xj mide cuanto vamos a producir de cada producto (sillas, camas, escritorios). cada bi especifica la cantidad disponible de recursos (madera, metal, mano de obra). los coeficientes aij miden cuanto se requiere del recurso i para producir el producto j (coeficientes tecnológicos)
Cada cj es el beneficio de producir una unidad del producto j, supongamos que se mide en dólares. Para que el análisis de unidades sea correcto vemos que las variables yi miden entonces dólares por unidad de recurso i, entonces asumimos que cada yi mide el valor unitario de cada recurso. Se puede demostrar el siguiente teorema (no daremos la demostración en este curso puede verse en un libro de programación lineal):
Teorema: Si el problema de PL tiene al menos una solución básica no degenerada entonces existe un valor positivo de > 0 con la siguiente propiedad: si | ti | ≤ para todo i=1,…m entonces el problema Maximizar ∑j cj xj sujeto a ∑j aij xj ≤ bi + ti i = 1,…..m xj ≥ 0 para j = 1,…..n tiene una solución óptima z* = z* + ∑i y*i ti donde z* es el valor óptimo del PL y (y*1 , y*2 ……y*m) es una solución óptima del dual. . Qué dice este teorema?. Qué nos dice del significado de las variables duales?
Ejemplo: Un empresario maderero tiene un terreno de 100 acres plantado con álamos. Cortar los árboles y dejar que regeneren tiene un costo de 10$ por acre y produce un beneficio de 50$ por acre. El empresario puede también cortar los álamos y plantar pinos. En este caso tiene un costo de 50$ y un beneficio de 120$ por acre. El empresario dispone de 4000 $ y quiere saber cuál es la estrategia que más le conviene. Cómo podemos formular este problema como un problema de programación lineal?
Maximizar 40 x1 + 70 x2 sujeto a x1 + x2 ≤ 100 10 x1 + 50 x2 ≤ 4000 x1 , x2 ≥ 0 Si resolvemos e problema por el método simplex vemos que la solución óptima es x*1 = 25 y x*2 = 75 y la solución óptima del dual es y*1 = 32.5 y y*2 = 0.75
El empresario podría plantearse las siguientes preguntas: Le conviene pedir un prestamos de 100$ más por el cual tendrá que devolver 180 $?. Cuál es el interés máximo que le conviene pagar?. Le conviene derivar fondos hacia otros emprendimientos?. Qué beneficio tendrían que brindar? Cómo puede hacer para analizar rápidamente si le conviene considerar una nueva posibilidad de plantar otras especies?
Notación Matricial El problema de PL , si ya agregamos las variables de holgura, puede escribirse como: Max c x sujeto a Ax = b x ≥ 0 Si tenemos una solución básica x# de este sistema con variables básicas x#B, podemos separar al vector x en dos partes, las variables básicas xB y las no básicas xn . Reordenando las variables podemos poner: x = (xB, xN) Reordenando de la misma forma las columnas de A, podemos poner A = [ AB AN ]
= cB AB-1 b + (cN - cB AB-1 AN) xN Entonces podemos escribir nuestro sistema de ecuaciones cómo: AB xB + AN xN = b Se puede demostrar que la matriz AB es inversible viendo que AB xB = b tiene una solución única correspondiente a la variables básicas x#B. Entonces podemos escribir: xB = AB-1 b - AB-1 AN xN Si escribimos también c = (cB, cN) la función objetivo queda: Z = c x = cB xB + cN xN Reemplazando acá la expresión de xB queda: z = cB (AB-1 b - AB-1 AN xN )+ cN xN = = cB AB-1 b + (cN - cB AB-1 AN) xN
---------------------------------------------------------------------- Y por lo tanto el sistema de ecuaciones que usamos para resolver el simplex se puede escribir como: xB = AB-1 b - AB-1 AN xN ---------------------------------------------------------------------- z = cB AB-1 b + (cN - cB AB-1 AN) xN Se acostumbra llamar B = AB , entonces ponemos: xB = B-1 b - B-1 AN xN z = cB B-1 b + (cN - cB B-1 AN) xN Notar que x#B = B-1b y que z = cB B-1 b es el valor de la función objetivo en esta solución básica .
Por ejemplo cuando resolvíamos el sistema (1), Maximizar 5 x1 + 4 x2 + 3 x3 Sujeto a 2 x1 + 3 x2 + x3 ≤ 5 4 x1 + x2 + 2 x3 ≤ 11 3 x1 + 4 x2 + 2 x3 ≤ 8 x1 , x2 , x3 ≥ 0 Cuál es la matriz A del problema, una vez agregadas las slacks?. Cuáles son el vector b y el el vector c?.
--------------------------------------------------------------- En una de las iteraciones de simplex para este problema teníamos la siguiente solución básica: x1 = 5/2 – 3/2 x2 – 1/2 x3 -1/2 x4 x5 = 1 + 5 x2 + 2 x4 x6 = 1/2 + 1/2 x2 – 1/2 x3 + 3/2 x4 --------------------------------------------------------------- z = 25/2 – 7/2 x2 + 1/2 x3 - 5/2 x4 Cuál es la matriz B que corresponde a esta solución básica?. Cuáles son los vectores cB y cN?. Calcular B-1 b,, B-1 AN,, cB B-1 b y (cN - cB B-1 AN) para esta solución básica y comparar con el sistema de arriba.
La matriz B se llama matriz básica o base. A cada submatriz inversible de A le corresponde una solución básica. El método simplex se puede reescribir en función de esta notación realizando las operaciones de forma un poco diferente a la que las veníamos haciendo.
Una iteración del método Simplex Revisado Dada una solución básica x#, sea B la matriz básica: Resolver el sistema yB = cB Elegir la columna de entrada, como una columna aj de AN tal que yaj < cj . Si no existe la solución actual es óptima. Resolver el sistema B d = aj Encontrar el mayor valor de t para el cual x#B - t d ≥ 0. Si no existe tal t, entonces el problema es no-acotado. En otro caso hay al menos una variable x#k básica tal que x#k - t dk = 0. Elegir xk para salir de la base. Asignar a xj (la variable de entrada) el valor t y al resto de las variables básicas de x#B los valores x#B = x#B - t d. Reemplazar en B la columna de salida aj por la de entrada ak, y actualizar el indicador de columnas básicas.
Ejercicio: resolver el problema (1) usando el método simplex revisado. Qué diferencia hay entre la matriz básica de una iteración y la de la siguiente? Cómo sólo cambia una columna, hay métodos de factorización de matrices que permiten resolver los sistemas de los pasos 1 y 3 con un número relativamente pequeño de operaciones. No hay que resolver los sistemas completos cada vez. En el cuidado con que se hagan estas operaciones (y en la velocidad cada vez mayor de las computadoras, claro) reside el factor que hace que se puedan resolver cada vez problemas más grandes.
En la mayoría de los problemas que se encuentran en la práctica las matrices son bastante esparsas, y entonces el método simplex revisado implementado de esta forma requiere menos operaciones que el método simplex estandar. La mayoría de los programas de programación lineal implementan el método simplex revisado. Hay mucho trabajo computacional envuelto para poder tener programas cada vez más eficientes.
Analisis de sensibilidad En la mayoría de los problemas reales podría ser que los datos no se conozcan exactamente o puede haber cambios imprevistos en la información, por ejemplo en los costos o precios. También a veces se quieren analizar los efectos de aumentar los recursos, de cambiar los coeficientes tecnológicos, etc. Cómo podemos ver cuán sensible a los cambios en los datos es la solución óptima que obtuvimos? Cómo podemos analizar como cambiaría la solución sin resolver de nuevo el problema?. Cómo seguimos optimizando si la solución actual no es óptima para los nuevos datos?
y tenemos el sistema y la solución óptima: x*B = B-1 b - B-1 AN x*N Supongamos que tenemos el PL , (ya agregamos las variables de holgura): Max c x sujeto a Ax = b x ≥ 0 y tenemos el sistema y la solución óptima: x*B = B-1 b - B-1 AN x*N ---------------------------------------------------------------------- z = cB B-1 b + (cN - cB B-1 AN) x*N
Qué podemos decir si: Cambia el valor de un ck de una variable xk no básica?. Cómo podemos calcular cuánto puede cambiar sin que cambie la solución óptima?. Cambia el valor de un ck de una variable xk básica?. Cómo podemos calcular cuánto puede cambiar sin que cambie la solución óptima?. Cambia uno de los términos de la derecha, o sea un bi.?. Agregamos una restricción?. Agregamos una nueva columna?.
Ejemplo: supongamos que tenemos el sistema óptimo del problema (5): x2 = 14 – 2 x1 - 4 x3 - 5 x5 - 3 x7 x4 = 5 - x1 - x3 – 2 x5 - x7 x6 = 1 + 5 x1 + 9 x3 + 21 x5 + 11 x7 ---------------------------------------------------------------------------------------- z = 29 - x1 - 2 x3 - 11 x5 - 6x7 Cómo contestamos las preguntas anteriores?
Ejemplo Una compañía que fabrica muebles quiere tener un plan de producción que maximice sus beneficios, con las siguientes condiciones: Una biblioteca requiere 3 horas de trabajo, 1 unidad de metal y 4 de madera y da un beneficio neto de 19$. Un escritorio requiere 2 horas de trabajo, 1 unidad de metal, 3 de madera y da un beneficio de 13$. Una silla requiere 1 hora de trabajo, 1 unidades de metal, 3 unidades de madera y da un beneficio de 12$ Una cama requiere 2 horas de trabajo, 1 unidad de metal, y 4 unidades de madera, y da un beneficio de 17$. Se dispone de 225 horas de mano de obra, 117 unidades de metal y 420 unidades de madera por día. Se supone que podemos vender todo lo que se produce. Cómo formulamos esto como un problema de programación lineal?. Cuál es el plan de producción óptimo?
Maximizar 19 B + 13 E + 12 S + 17 C Sujeto a 3B + 2 E + S + 2 C ≤ 225 B + E + S + C ≤ 117 4 B + 3 E + 3 S + 4 C ≤ 420 B, E, S, C ≥ 0 Ver la solución de este problema en LINDO u otro programa de PL, y ver que información adicional proveen.
Una vez que tenemos el resultado del problema podríamos plantearnos las siguientes preguntas: Qué pasaría si el beneficio de fabricar escritorios crece de 13$ a 15$. Qué pasaría si la disponibilidad de metal aumenta de 117 a 125 unidades por día? Como analizaríamos la conveniencia de la compañía de producir mesas de café que requieren 3 horas de trabajo, una unidad de metal, 2 unidades de madera y dan un beneficio de 14$? Cómo obtenemos la nueva solución si se requiere que el número de sillas sea 5 veces el número de mesas.? La demanda de madera por silla crece de 3 a 4 unidades?
Forma general de CUALQUIER problema de programación lineal Maximizar ∑j cj xj sujeto a ∑j aij xj ≤ bi i I ∑j aij xj = bi i E xj ≥ 0 para j R El problema dual se define como: Minimizar ∑i bi yi ∑i aij yi ≥ cj j R ∑i aij yi = cj j R yi ≥ 0 i I
Algunos programas de programación lineal y lineal entera: LINDO: tiene versión para estudiantes que se puede bajar libremente de http://www.lindo.com. Recomiendo hacer los ejercicios del práctico de modelos con este programa. Es muy fácil de usar y si quieren pueden bajarlo también de la página de nuestra materia Investigación Operativa http://www-2.dc.uba.ar/materias/io/lnd61.exe. CPLEX : es el mejor programa comercial y académico de programación lineal y lineal entera. Es el standard en la literatura académica y para las empresas. Su primera versión fue puesta en público en 1988 y desde entonces siguen mejorándolo. Se puede bajar una demo de http://www.ilog.com. Es también muy fácil de usar.
GAMS: es un programa que usan mucho los economistas, trae muchos ejemplos de aplicaciones. Se puede bajar una versión limitada que sirve para estudiantes de http://www.gams.de XPRESS: es otro programa del tipo del CPLEX, pero que tiene un poco menos de difusión, y aparentemente no tan eficiente en problemas difíciles. http://www.dashoptimization.com LP- Solve programa de acceso libre.
Programación lineal entera (PLE) Qué es un problema de programación lineal entera?: Max c x sujeto a Ax ≤ b x Z+ Qué es un problema de programación lineal entera mixta (PLEM)? Algunas variables son continuas y otras tienen que tomar valores enteros. Qué es un problema de programación lineal binario (PLB)? Las variables toman valor 0 o 1, o sea x {0,1} n . .
Qué es un problema de optimización combinatoria? Dado un conjunto finito N = {1,….n} con pesos cj asignados a cada j N y F una familia de conjuntos factibles de N, entonces queremos encontrar el elemento de F de peso mínimo: MinS { ∑jS cj / S F } (también podría ser un problema de maximización). Muchos problemas de optimización combinatoria se pueden formular como problemas de programación lineal entera.
Cómo resolvemos un problema de programación lineal entera?. Se parecen a los problemas de programación lineal?. Sirve redondear?. Ejemplo: Max 1.00 x1 + 0.64 x2 Sujeto a 50 x1 + 31 x2 ≤ 250 3 x1 - 2x2 ≥ -4 x1 , x2 ≥ 0, x1 , x2 entera Se puede ver que la solución entera es (5,0), si no pedimos que las variables sean enteras la solución del problema de programación lineal es (376/193, 950/193). Graficar.
En el caso de programación binaria la situación puede ser peor, por ejemplo una solución del problema continuo PL que sea (0.5,0.5,….0.5) no nos da información sobre cual puede ser la solución del problema binario.
Ejemplos: escribir modelos de PLE para los siguientes casos: Problema de asignación: Tenemos n personas para realizar n trabajos. Cada persona puede hacer un solo trabajo. Se asigna un costo cij a la asignación de la persona i para hacer el trabajo j de acuerdo a la capacidad de cada uno para realizar cada trabajo. Se quiere encontrar la asignación que minimice los costos. Problema de la mochila (Knapsack problem) Se tiene un presupuesto de b pesos disponible para invertir en algunos de n posibles proyectos para el próximo año. Sea aj la inversión que requiere el proyecto j y cj el retorno que produce dicho proyecto. Se quiere maximizar las ganancias (sólo se puede invertir en el proyecto completo).
Problema de cubrimiento (Set Covering): se quieren cubrir un cierto número de regiones con centros de emergencia (por ejemplo estaciones de bomberos o de ambulancias) con un costo mínimo. Se conocen los costos de instalar un centro en cada región y que regiones pueden ser servidas desde el mismo. Problema del viajante de comercio (Traveling Salesman Problem, TSP): (es el problema más famoso de Optimización Combinatoria y el más estudiado.) Un viajante de comercio quiere visitar n ciudades y volver al lugar de partida en el menor tiempo posible (o al menor costo).
Los problemas que acabamos de ver son problemas de optimización combinatoria, donde hay que buscar el subconjunto óptimo entre una familia de subconjuntos. Uno podría pensar en enumerar todos estos conjuntos y elegir el mejor (algoritmo de fuerza bruta). Sirve este procedimiento?. Por ejemplo en el caso del viajante de comercio, si suponemos que podemos ir de cualquier ciudad a cualquier otra, tendríamos que revisar (n-1)! recorridos posibles. Por ejemplo para un problema con n= 101 ciudades hay 9.33 x 10 157 circuitos (recorridos) posibles que habría que revisar.
Vamos a presentar algoritmos mejores que estos que permiten resolver problemas bastante grandes. Sin embargo muchos problemas de optimización combinatoria como por ejemplo el TSP se consideran problemas abiertos o no resueltos desde el punto de vista de la investigación. A pesar de que se resuelven cada vez problemas mayores, no conocemos métodos buenos que resuelvan estos problemas en un tiempo razonable, o sea sólo conocemos algoritmos que requieren un número de operaciones que crece en forma exponencial cuando aumenta el tamaño del problema. No se conocen tampoco métodos que resuelvan cualquier problema de programación lineal entera en un tiempo que crezca en forma polinomial respecto del tamaño del problema.
Otros ejemplos: Problema de localización: dadas n posibles ubicaciones para poner depósitos y un conjunto de m clientes, supongamos que hay un costo fijo fj de instalar un depósito en el lugar j, y un costo de llevar la mercadería que requiere el cliente i desde el depósito j Se quiere instalar los depósitos de forma a minimizar los costos. Este problema se puede modelar como un problema de programación entera mixta si consideramos que las variables que definen que fracción de la demanda del cliente i es llevada al depósito j, no necesitan ser enteras.
Problema de planificación de la producción: Se quiere hacer un plan de producción de un sólo producto, para un horizonte de n periodos, con el objetivo de satisfacer la demanda en cada período minimizando costos. Tenemos los siguientes datos: ft costo fijo de producir en el período t pt costo por unidad producida en el período t ht costo de almacenamiento por unidad en el periodo t dt demanda del periodo t. Este problema se puede modelar como un problema de programación entera mixta si consideramos que las variables que definen cuanto producir no necesitan ser enteras.
Puede haber varias formulaciones para un mismo problema. Cuál sería la formulación ideal para un problema de programación lineal entera? Si la formulación es una descripción de la cápsula convexa del conjunto de soluciones enteras entonces podemos resolver el problema como un problema de programación lineal (continua, por ejemplo con el método simplex). Todos los vértices del poliedro serán enteros y por lo tanto el óptimo de PL será entero. En la mayoría de los casos es muy difícil encontrar la cápsula convexa del conjunto de soluciones enteras, y además muchas veces la descripción de la cápsula convexa requiere de un número exponencial de desigualdades.
Ejemplo: Dibujar dos descripciones diferentes de la cápsula convexa de los siguientes puntos: Ejemplo: Sea X = {(0,0,0,0},(1,0,0,0),(0,1,0,0),(0,0,1,0), (0,0,0,1),(0,1,0,1),(0,0,1,1)} Las siguientes son 3 formulaciones diferentes para X P1 = { x R4, 0 ≤ x ≤ 1, 83 x1 + 61 x2 + 49 x3 + 20 x4 ≤ 100} P2 = { x R4, 0 ≤ x ≤ 1, 4 x1 + 3 x2 + 2 x3 + x4 ≤ 4} P3 = { x R4, 0 ≤ x ≤ 1, 4 x1 + 3 x2 + 2 x3 + x4 ≤ 4 x1 + x2 + x3 ≤ 1 x1 + x4 ≤ 1} Se puede probar fácilmente a partir de estas ecuaciones que P1 P2 P3 y P3 = conv(X)
Cotas y relajaciones Sea el problema de PLE z = max { cx / x X Zn} Dada una solución factible x, cómo podemos probar que es óptima?. Querríamos por ejemplo encontrar una cota inferior z_ de z y una cota superior z-- tal que z_ =z--¯. O sea nos serviría por ejemplo tener un algoritmo que vaya generando una sucesión creciente de valores de z_ y una sucesión decreciente de valores z-- y esto es lo que tratan de hacer los métodos que se usan para resolver problemas de IP.
Cómo hacer para obtener cotas inferiores (cotas primales) de z*?. Cualquier solución factible, x X , nos provee de una cota inferior cx ≤ z*. A veces obtener una solución factible es tan difícil como resolver el problema de optimización. Para obtener soluciones factibles en la práctica se usan lo que se llama algoritmos heurísticos. Estos algoritmos tratan de obtener las mejores soluciones posibles pero no garantizan obtener el óptimo.
Cómo hacer para obtener cotas superiores (cotas duales) de z*? Relajación: reemplazar el problema IP por uno más simple que sabemos resolver, por ejemplo: “agrandar” el conjunto de soluciones factibles, o reemplazar la función objetivo por una cuyo valor sea mayor o igual a cx en todas las soluciones factibles.
z* = max { cx / Ax ≥ b, x Z+n} Relajación lineal: Si PLE es z* = max { cx / Ax ≥ b, x Z+n} la relajación lineal RLP de PLE se define como: zLP = max { cx / Ax ≥ b, x R+n} Queremos tener la mejor formulación del PLE posible. Prop: i) si RLP es no factible, entonces PLE es nofactible ii) Si x* es óptimo para RLP y x* X entonces x* es la solución óptima de PLE. Estas ideas se pueden aplicar también a otras relajaciones diferentes de PLE.
Relajaciones combinatorias: Problemas que podemos resolver más fácilmente que PLE, se obtienen por ejemplo eliminando algunas de las restricciones de PLE. Por ejemplo si tenemos el problema del viajante de comercio TSP asimétrico, el problema de asignación es una relajación del TSP. Si tenemos el problema de la mochila, tenemos X = {x X Z+n / ∑j aj xj ≤ b} Obtenemos una relajación reemplazando X por X´ = {x X Z+n / ∑j aj xj ≤ b}
Dualidad: En el caso de programación lineal entera NO se verifica el mismo resultado de dualidad que vimos en PL. O sea no es cierto que si formulamos el problema dual en forma similar , el óptimo del primal y el dual sean iguales. Se dice en este caso que se cumple una condición de dualidad débil cuando el óptimo del “primal” es menor o igual al del dual, y de dualidad fuerte cuando como en el caso de PL los óptimos del primal y el dual son iguales.
wLP = min { yb / yA ≥ c, y R+n} Por ejemplo si tenemos el PLE z = max { cx / Ax ≤ b, x Z+n} podemos decir que el problema siguiente wLP = min { yb / yA ≥ c, y R+n} es un dual débil porque cx ≤ wy para todo par de soluciones x,y, y por lo tanto también z ≤ wLP
Problemas “fáciles” o “bien resueltos” Sea z = max { cx / Ax ≤ b, x Z+n} Decimos que una matriz A es totalmente unimodular si el determinante de A y de todas sus submatrices cuadradas es 1, -1, ó 0. Prop: Si A es totalmente unimodular entonces las soluciones básicas del la relajación lineal RLP del PLE son enteras, y por lo tanto el óptimo de RLP es igual a el óptimo z* del PLE. Dem: usar la regla de Cramer para resolver sistemas lineales y ver el simplex revisado.
Cuál es la importancia de este resultado?. Si la matriz del PLE es totalmente unimodular entonces podemos obtener las solución resolviendo su relajación lineal, por ejemplo usando el método Simplex. Ejemplos de problemas “fáciles”: Problema de transporte (el conocido método para resolver este problema es una adaptación del método simplex). Problema de asignación Problema de encontrar el flujo máximo en una red
Métodos exactos para resolver problemas de PLE Branch and bound (“ramificación y poda”) Métodos de cortes o de planos de corte Métodos “Branch and Cut”: (combinan las ideas de los dos anteriores y son los que han permitido resolver los problemas de programación lineal entera u optimización combinatoria más grandes). Métodos de generación de columnas (se usan cuando tenemos un número muy grande de variables, que nos impide tener guardadas en la memoria de la computadora todas las columnas de A).
Para obtener el óptimo estos métodos pueden requerir un número muy grande de iteraciones, (el número de operaciones crece exponencialmente con el tamaño del problema a resolver).
Branch and bound Tenemos el PLE z = max { cx / x X Zn} Queremos dividir el problema en problemas más pequeños que sean más fáciles de resolver. O sea poner X = X1 ……. Xh, entonces si zk = max { cx / x Xk} tendremos que z = maxk {zk } Para construir un método de branch and bound usamos estas ideas en forma iterativa. Usamos un árbol de enumeración para representar el algoritmo branch and bound. En cada nodo resolvemos un problema menor de optimización.
Ejemplo: Acá X = X1 X2 , X1 = X11 X12, etc. X X1 X2 X11 X22 X12
Cómo hacemos para no tener que recorrer el árbol completo?. Prop.: Si tenemos una descomposición del conjunto de soluciones factibles X = = X1 ……. Xh, y zk = max { cx / x Xk}, y si zk¯ es una cota superior de zk y zk_ es una cota inferior de zk, entonces z¯ = maxk zk¯ es una cota superior de z* y z_ = maxk zk_ es una cota inferior de z*. En la mayoría de los casos se resuelve en cada nodo del árbol la relajación lineal del problema zk, usando el método simplex.
Criterios de poda: por optimalidad por valor de las cotas Por infactibilidad.
Ejemplo: Max 4 x1 – x2 Sujeto a 7 x1 – 2 x2 ≤ 14 x2 ≤ 3 2 x1 – 2 x2 ≤ 3 x Z2+
Resolviendo la relajación lineal del problema original tenemos la solución x= (20/7,3) con un valor de z¯ = 59/7. En este caso tenemos una sóla variable, x1 que es fracionaria., Dividimos el problema entonces agregando para un lado la restricción x1 ≤ 2 y para el otro x1 ≥ 3. O sea S1= S {x / x1 ≤ 2} y S2= S {x / x1 ≥ 3 } Elegimos ahora resolver S1. Agregamos la nueva restricción que es sólo una cota de una variable, x1 ≤ 2 y resolvemos usando el método simplex a partir de la última solución básica. Obtenemos la solución óptima de S1 x = (2,1/2) con valor z1¯ = 15/2.
Tenemos de nuevo una sola variable que no es entera Tenemos de nuevo una sola variable que no es entera. Partimos S1 usando las restricciones x2 ≤ 0 y x2 ≥ 1 y tenemos dos nuevos nodos S11 = S {x / x1 ≤ 2 y x2 = 0 } y S12 = S {x / x1 ≤ 2 y x2 ≥ 1} Tenemos ahora tres nodos “abiertos” para continuar: S2 S11 y S12 . Elegimos.arbitrariamente resolver el problema lineal correspondiente a S2 y vemos que es un problema no factible.
Elegimos ahora S12 = S {x / x1 ≤ 2 y x2 ≥ 1} y obtenemos una solución x= ( 2,1) con valor z12 = 7. Esta es la mejor solución entera hasta el momento y tenemos entonces una cota inferior z_ = 7 . Por esta rama no tenemos que abrir más nodos. Elegimos el único nodo que nos queda, S11 = S {x / x1 ≤ 2 y x2 = 0 }. Al resolverlo obtenemos x = (3/2, 0) con valor z ¯ = 6. Como ya teníamos una cota z_ = 7, podemos podar esta rama también y la solución óptima es (2,1) con valor 7.
Qué trabajo requiere desarrollar un programa de un método tipo Branch and Bound?. Obtener las mejores cotas posibles Reglas de branching Reglas para decidir que nodo procesar. Cómo resolver el problema de PL en cada nodo?. Si la cantidad de nodos abiertos en el algoritmo de branch and bound es muy grande podemos tener problemas de falta de memoria en la computadora. Los programas comerciales también incluyen una etapa inicial de preprocesamiento donde se intenta detectar rápidamente si se pueden eliminar restricciones o variables que sean redundantes.
Métodos de planos de corte Tenemos el problema de PLE z = max { cx / Ax ≤ b x Z+n } Sea X = { x / Ax ≤ b x Z+n } La cápsula convexa del conjunto de soluciones X, conv(X) = { x / A” x ≤ b”, x ≥ 0 }, es un poliedro. Una desigualdad πx ≤ π0 es una desigualdad válida para X si para todo x X se verifica que πx ≤ π0 . Los métodos de corte buscan “buenas” desigualdades válidas para agregar a la relajación lineal max { cx / Ax ≤ b , x≥ 0} que corten las soluciones fraccionarias del problema sin cortar ninguna solución entera.
La situación ideal sería si pudiéramos encontrar las desigualdades que describen la cápsula convexa de X, conv(X) = { x / A” x ≤ b”, x ≥ 0 }. Hay métodos generales de construir desigualdades válidas, cómo por ejemplo el clásico método de Gomory o las de Chvatal- Gomory. Estas desigualdades y otras de tipo general como estas, están incorporadas en la mayoría de los programas computacionales para resolver problemas de PLE. Sin embargo la incorporación de las mismas no resulta suficiente para resolver muchos problemas de optimización combinatoria.
Para obtener algoritmos mas eficientes, que permitan dar soluciones para problemas cada vez más grandes es necesario estudiar cada problema en particular y derivar desigualdades válidas particulares para cada problema específico. Para obtenerlas hay que estudiar el poliedro conv(X) en cada caso particular. Es un trabajo en general complicado, que requiere estudiar propiedades de poliedros, a veces de grafos, y de algebra lineal. En general en los problemas difíciles no se consigue determinar todas las desigualdades que son necesarias para describir conv(X).
En la práctica se deriva una o varias familias de desigualdades válidas para X, y en cada paso, dada una solución x* fraccionaria de una relajación lineal, se busca una desigualdad de esa familia que “corte” a x*. Para detectar cada una de estas desigualdades válidas muchas veces hay que desarrollar algoritmos de separación, y en algunos casos esto es también una tarea complicada.
Métodos branch and cut En la práctica se combinan todas estas ideas para obtener algoritmos que pueden resolver problemas cada vez más grandes. En particular los métodos “branch and cut” combinan el método “branch and bound”, con la generación de cortes (desigualdades válidas generales y específicas del problema a resolver) en cada nodo del árbol.
Qué cosas hace un paquete de programación lineal entera?. Qué tenemos que tomar en cuenta para usarlo?. Qué podemos hacer si el programa no nos da el óptimo entero en un tiempo razonable?. Nos sirve la solución obtenida hasta el momento?. Que información nos provee el programa sobre la calidad de esa solución?. Qué son los métodos heurísticos?.
Hay mucho para hacer en investigación en estos temas tanto estudiando resultados generales como problemas particulares.
Gracias a los organizadores por invitarme a Nicaragua!! Cuál duda sobre los temas del curso, las soluciones de los ejercicios, o lo que les pueda ayudar no duden en consultarme escribiendo a irene@dc.uba.ar
FIN