Source: http://docplayer.es/3541344-Programacion-lineal-entera.html
Timestamp: 2018-10-19 23:27:41+00:00

Document:
Programación Lineal Entera - PDF
Download "Programación Lineal Entera"
Juan Manuel Barbero Agüero
1 Programación Lineal Entera P.M. Mateo y David Lahoz 2 de julio de 2009 En este tema se presenta un tipo de problemas formalmente similares a los problemas de programación lineal, ya que en su descripción sólo se establecen expresiones lineales. Sin embargo no responden a problemas lineales ya que algunas (o todas) las variables del problema toman valores que no están en un conjunto continuo. Por ejemplo, pueden ser variables que toman valores 0 o 1 (binarias), o variables que toman valores enteros no negativos (0,1,2,...), etc. Tras introducir el tipo de problemas se dedica un importante apartado para presentar las posibilidades de modelado que esta herramienta proporciona: problemas binarios, problemas de carga fija, problemas con restricciones condicionales o con dicotomías, etc. Tras dedicar una parte importante del tema a presentar estas herramientas de modelado y a plantear numerosos problemas con ellas se procede a mostrar dos métodos de resolución. Uno de ellos dedicado a problemas en los que todas las variables son binarias y otro para problemas generales. Ambos métodos tienen en común que desarrollan un proceso de enumeración que permite comprobar explicita o implicitamente todas las soluciones del problema hasta encontrar la óptima, y entran dentro del tipo de métodos de ramificación y acotación. 1
2 Índice 1. Introducción 3 2. Aplicaciones de la programación lineal entera (PLE) 3 3. Resolución de problemas de PLE Método enumerativo sencillo para PLE s binarios puros Método de ramificación y acotación
3 1. Introducción Con el término Programación lineal entera, (PLE), nos referiremos al siguiente tipo de problemas: problemas que formalmente son problemas de programación lineal, máx / mín Z = Ax = b, x 0 pero en los que algunas variables están restringidas a tomar valores enteros. Por ejemplo, x 1 0, x 2 0 y entera, X 3 {0, 1}, x 1 una variable como las que hemos manejado hasta ahora, x 2 una variable entera no negativa y x 3 una variable binaria, que toma únicamente dos valores, 0 ó 1. Como veremos en los apartado siguientes los problemas de programación lineal entera nos van a permitir modelar muchas más situaciones que la programación lineal, pero a cambio la resolución de los problemas será mucho más costosa, presenteran, en general, un costo computacional mucho más elevado que el de la programación lineal. La causa de este incremento de costo computacional se debe a que se pierde la deseable propiedad existente en los problemas de programación lineal de que al menos una solución óptima del problema se encuentra en un punto extremo. En estos problemas los conjuntos ya no tienen que ser conexos (pueden estar definidos a trozos) y mucho menos convexos con lo que la idea de punto extremo tal y como la hemos definido desaparece. De todos modos, para su resolución aún podremos utilizar técnicas basadas en el simplex. En el apartado 2 presentaremos diversas situaciones generales que pueden ser modeladas mediante PLE y después en el apartado 3 mostraremos dos técnicas de resolución, una para el caso en que todas las variables del problema son binarias (Problemas de programación lineal binaria) y otro para problemas con solo variables enteras (PLE puros) o con variables continuas y enteras (PLE mixto). 2. Aplicaciones de la programación lineal entera (PLE) Variables 0-1. Problema de inversiones Las variables binarias x j {0, 1} pueden utilizarse para modelar situaciones en las que se decide si una acción se realiza, x j = 1, o si no se realiza, x j = 0. Un ejemplo típico de utilización de este tipo de variables es el problema de inversiones, a continuación se muestra una de sus versiones más simplificadas. 3
4 Un inversor dispone de una cantidad b para invertir en n posibles proyectos/acciones. Cada posible acción tiene un costo de a j unidades monetarias y un beneficio posterior de c j unidades monetarias. El inversor debe decidir que inversiones realizar con objeto de máximizar el beneficio total. Para este problema se definen variables x j que toman valor 1 cuando se invierte en el proyecto j y valor 0 cuando no se invierte, con estas variables el problema queda en la forma siguiente: máx Z = c 1 x 1 + c 2 x c n x n s. a: a 1 x 1 + a 2 x a n x n b x j {0, 1}, j = 1,..., n Este problema básico puede modificarse incorporando el hecho de que las inversiones no sean de un solo periodo de tiempo sino que deban realizarse durante varios periodos de tiempo, en cada uno de los cuales se dispone de una cantidad b i de unidades monetarias. También puede modificarse mediante la incorporación de condiciones y restricciones en las inversiones, por ejemplo: Si invierto en el proyecto i entonces debo invertir en el proyecto j. Dicha condición responde a la ecuación x i x j puede observarse que si x i = 1 entonces queda 1 x j con lo que x j debe tomar valor 1 y si x i = 0 entonces queda 0 x j con lo que x j no esta restringida y puede tomar cualquiera de los dos posibles valores 0 ó 1. Si invierto en el proyecto i y en el proyecto j entonces debo invertir en el proyecto k. Dicha condición responde a la ecuación x i + x j 1 + x k En este casi si x i = x j = 1 la ecuación queda 2 1+x k con lo que x k está obligada a tomar valor 1 y en cualquier otro caso obtenemos x k o x k que no restringen a x k. Si invierto en el proyecto i o en el proyecto j entonces debo invertir en el proyecto k. Dicha condición responde a la ecuación x i + x j 2x k En este casi si x i = 1 o x j = 1 la ecuación queda 1 2x k que obliga a que x k tome valor (x k 0,5 x k = 1), si ambas toman valor 1 entonces queda x k 1 y si ambas toman valor 0 x k queda libre pudiendo tomar valor 0 o 1. 4
5 A partir de estas tres situaciones se pueden generar muchas otras, por ejemplo: si invierto en el proyecto i entonces no puedo invertir en el proyecto j. En términos de las variables estamos diciendo que si x i = 1 entonces x j = 0 que podríamos escribir que si x i = 1 entonces y j = 1 x j = 1, es decir si invierto en el proyecto i entonces inverto en un nuevo proyecto j. Esto ya lo sabemos escribir x i y j que sustituyendo queda x i 1 x j. Por tanto si en lugar de aparecer invertir aparece no invertir basta con buscar la restricción que tiene la misma forma y cambiar en donde aparece la variable por su valor complementario, 1 x. Veamos otro ejemplo, si invierto en i y no invierto en j entonces tengo que invertir en k. En este caso tomariamos como referencia la condición si invierto en i y en j entonces inverto en k y en donde aparece la variable x j ponemos su complementaria 1 x j, quedando la ecuación x i + (1 x j ) 1 + x k o x i x j x k Otras posibles modificaciones son que en lugar de ser una o varias las que obligan a que ocurra algo sobre otra, es una sola la que obliga a que se haga algo con otras, por ejemplo. Si invierto en x i entonces tengo que invertir en x j y en x k. Esta situación puede reducirse a una de las anteriores sin más que tener en cuenta que la proposición A = B es equivalente a la proposición No B = No A. Es decir la proposición anterior es equivalente a Si no invierto en j o no invierto en k entonces no inverto en i. Para modelar esta última proposición tomamos la proposición si invierto en j o en k entonces invierto en i (vista anteriormente) y realizamos la operación realizada en el ejemplo anterior. En todas las expresiones que aparece no invertir complementamos a 1 la variable, obteniendo: (1 x j ) + (1 x k ) 2(1 x i ) o x j + x k x i Problema de carga fija Bajo este epígrafe se modelan situaciones en las que hay un costo asociado a una acción y que no depende del número de veces que esta se realice, hay que contabilizar el costo una vez en el momento en el que algo ocurra. Por ejemplo, suponer que estamos planificando la producción de un producto y necesitamos comprar una máquina especial para ello. En este problema tendremos unos 5
6 costos asociados a elaborar los productos y que tomará la forma habitual c j x j y luego aparece otro costo que es el de comprar la máquina y el cual sólo hay que contabilizarlo si se decide elaborar dichos productos y además sólo se cuenta una vez, se elaboren 1 unidad de producto o 1000 unidades. Veamos uns sencillo ejemplo. Una empresa se dedica a la elaboración de tres tipos de camisetas, C 1, C 2 y C 3. Para dicha elaboración se utilizan horas de trabajo, metros de tela y tres máquinas específicas (cada una para un tipo de camiseta). Dichas máquinas no son de su propiedad por lo que deben alquilarlas, en la tabla siguiente se muestran la disponibilidad diaria de horas de trabajo, metros de tela, costo de elaboración por tipo de camiseta, precio de venta de cada camiseta y el costo diario de alquiler de las máquinas (una máquina se alquilará si se deciden elaborar unidades del tipo de camisetas que la requieren). Con dicha información hay que plantear un modelo de programación lineal entera cuya resolución proporcione el plan de producción de máximo beneficio. Camiseta 1 Camiseta 2 Camiseta 3 Disponibilidad Horas Metros Costo de producción Precio de venta Costo de alquiler de máquina Para plantear dicho problema en primer lugar se definen variables x j, j = 1, 2, 3 que representan el número de camisetas de cada tipo elaboradas, una primera versión del problema es: max Z = (12 6)x 1 + (8 4)x 2 + (15 8)x 3 s. a: 3x 1 + 2x 2 + 6x x 1 + 3x 2 + 4x x 1, x 2, x 3 0 y enteras Pero en este planteamiento no se tiene en cuenta el costo del alquiler, para ello se definen tres variables binarias y j, j = 1, 2, 3, de tal forma que y j toma valor 1 si se eleboran camisetas de tipo j, es decir si x j > 0 y por tanto hay que alquilar la máquina correspondiente. La variable y j toma valor cero en caso contrario. De esta forma la función objetivo se puede escribir en la forma max Z = (12 6)x 1 + (8 4)x 2 + (15 8)x 3 200y 1 150y 2 100y 3 6
7 Ahora hay que garantizar que las variables y j se comporten adecuadamente, para ello se introducen las siguientes restricciones: x 1 M 1 y 1 x 2 M 2 y 2 x 3 M 3 y 3 y 1, y 2, y 3 {0, 1} donde M j representa una cantidad grande que no pueda ser superada por ningún valor de x j. Se puede observar que si x j > 0 entonces para que se cumpla la restricción correspondiente debe tenerse que y j = 1. Por otro lado si x j = 0 entonces y j podría tomar cualquier valor 0 ó 1, pero como estamos máximizando e y j tiene costo negativo entonces el propio algoritmo en el proceso de resolución le asignará valor 0. En general una restricción de carga fija aparece cuando existe una cierta variable y con costo c y > 0 (para problemas de mínimo) que debe tomar valor 1 ó 0 dependiendo de si alguna de las variables x 1, x 2,..., x s (de un cierto conjunto) toma valores estrictamente positivos. Por ejemplo, si alguna de las variables x 1,..., x s toma valor entonces una cierta varible y de costo c y > 0 debe tomar valor 1. x 1 + x x s My donde M es una cota superior del máximo valor posible de x 1 + x x s. Si alguna de las variables x s toma valor positivo obliga a que y sea 1. Dicotomías y restricciones condicionales Las dicotomías son parejas de restricciones de las cuales al menos una de ellas debe verificarse, es decir son restricciones del tipo: se cumple que x 1 + x 2 25 o se cumple que x 1 + x 3 7 o se cumplen ambas La forma de escribir una dicotomía siempre va a ser igual. Supongamos que tenemos la dicotomía f(x 1, x 2,... x n ) 0 ó g(x 1, x 2,... x n ) 0 Definiremos una variable binaria auxiliar y {0, 1} y sustituiremos la expresión anterior por las siguientes dos restricciones: f(x 1, x 2,..., x n ) fy g(x 1, x 2,..., x n ) g(1 y) donde f y g son cotas superior de f(x) y g(x) respectivamente. Se puede ver que si y = 0 entonces tenemos f(x 1, x 2,..., x n ) 0 g(x 1, x 2,..., x n ) g 7
8 que obliga a cumplir la primera restricción y si y = 1 entonces tenemos f(x 1, x 2,..., x n ) f g(x 1, x 2,..., x n ) 0 que obliga a cumplir la segunda restricción. En ambos casos la restricción que no está obligada podrá cumplirse o no dependiendo de los datos y el problema planteado. Un ejemplo típico de utilización de dicotomías son los modelados de sistemas de producción en los que el sistema de producción sólo se pone en funcionamiento si se realizan al menos una cantidad mínima de productos. Por ejemplo, suponer que x j representa el número de vehículos elaborados en una cadena de montaje y la política de la empresa es que no se pone la cadena en marcha si no es para elaborar al menos 100 vehículos. Esta situación corresponde a la siguiente dicotomía: x j = 0 ó x j 100 que puede reescribirse como x j 0 ó 100 x j 0 Con lo que se formula de forma lineal como: x j My 100 x j 100(1 y) donde y {0, 1} y M > 0 y todo lo grande que haga falta (ya que no conozco en principio ninguna cota superior del máximo valor de x j ), en general si es un problema de producción siempre existirá una cota máxima de producción que podría ponerse en lugar de M. Una restricción condicional es una restricción en la que el cumplimiento de una restricción obliga a que se cumpla otra, por ejemplo: Si x 1 + x 2 > 10 entonces x 2 + 3x 3 67 por cuestiones técnicas la condicíon debe ser siempre una desigualdad estricta. Para modelar una condición se escribe la dicotomía equivalente, para ello basta con tener en cuenta que la proposición A = B es equivalente a la proposición No B = No A. Con lo que la restricción condicional Si f(x 1, x 2,..., x n ) > 0 = g(x 1, x 2,..., x n ) 0 8
9 puede expresarse como que es una dicotomía y se modelaría con y {0, 1}. f(x 1, x 2,..., x n ) 0 ó g(x 1, x 2,..., x n ) 0 f(x 1, x 2,..., x n ) fy g(x 1, x 2,..., x n ) g(1 y) Manipulación de problemas de programación entera binaria no lineal Consideramos en este ejemplo problemas de programación entera binaria en los que la no linealidad se debe a productos y potencias de variables, es decir, a problemas como el siguiente: máx Z = x x 2 x 3 + x 5 4 s. a: x 1 + x 2 + x 3 x 4 20 x j {0, 1}, j = 1, 2, 3, 4 Como las variables son binarias cualquier potencia de la variable es ella misma por lo que las expresiones x 3 1 y x 5 4 pueden sustituirse directamente por x 1 y x 4. máx Z = x 1 + x 2 x 3 + x 4 s. a: x 1 + x 2 + x 3 x 4 20 x j {0, 1}, j = 1, 2, 3, 4 después para cada producto se introduce una variable que lo represente. En nuestro ejemplo se introduce y 23 {0, 1} y y 34 {0, 1} que van a contener respectivamente el producto de x 2 por x 3 y el de x 3 por x 4. Para que dichas variables se comporten como el producto debe garantizarse que cuando x 2 = 1 y x 3 = 1 entonces y 23 tome valor 1 y que en cualquier otro caso tome valor 0. Teniendo en cuenta la primera de las aplicaciones estudiadas esto se garantiza mediante las ecuaciones: x 2 + x y 23 x 2 + x 3 2y 23 Análogamente para x 3, x 4 y y 34 x 3 + x y 34 x 3 + x 4 2y 34 9
10 Con lo que sustituyendo en el problema se obtiene el problema de programación lineal entera binaria equivalente al no lineal. máx Z = x 1 + y 23 + x 4 s. a: x 1 + x 2 + y x 2 + x y 23 x 2 + x 3 2y 23 x 3 + x y 34 x 3 + x 4 2y 34 x j {0, 1}, j = 1, 2, 3, 4, y 23, y 34 {0, 1} Manipulación de problemas de programación entera no lineal En este caso se consideran problemas con variables enteras generales que sean no lineales en el mismo sentido que antes, potencias de variables y productos de variables. En este caso lo que haremos será pasar el problema entero general a binario y después aplicaremos las herramientas de la aplicación anterior. Para transformar una variable entera x j que toma valores entre 0 y u j realizaremos el proceso siguiente: Determinar el p entero que cumple 2 p 1 < u j 2 p Sustituiremos en el problema x j por su representación binaria, y 0j y 1j y 2j y p 1j 2 p 1 donde y ij {0, 1}. Una vez realizado dicho proceso el problema será un problema de programación entera binaria no lineal como los vistos en el punto anterior y se podrá aplicar lo visto anteriormente. Veamos un sencillo ejemplo: máx Z = x 1 x 2 + x 3 s. a: x 1 + x 2 2 2x 1 + x 3 7 x 1 {0, 1}, x 2, x 3 0 y enteras En primer lugar establecemos cotas u 2 = 2 y u 3 = 7 para las variables x 2 y x 3. Para x 2 tenemos que 2 1 u 2 = 2 < 2 1 por tanto p = 2 y x 2 se sustituirá por: x 2 = 2 0 y y 12 y i2 {0, 1} 10
11 Para x 2 tenemos que 2 2 u 3 = 7 < 2 3, por tanto p = 3 y x 3 se descompone en: x 3 = 2 0 y y y 23 y i3 {0, 1} Sustituyendo en el problema original tenemos: máx Z = x 1 (y y 12 ) + y y y 23 s. a: x 1 + y y x 1 + y y y 23 7 x 1, y ij {0, 1} Este problema ya es del tipo del ejemplo anterior y ya podemos modelarlo sin más que eliminar los dos productos que aparecen en la función objetivo, x 1 y 02 y x 1 y 12. Definimos z 102 = 1x 1 y 02 y añadimos las restricciones x 1 + y z 102 x 1 + y 02 z 102 y definimos z 112 = 1x 1 y 12 y añadimos las restricciones Con lo que el problema queda: x 1 + y z 112 x 1 + y 12 z 112 máx Z = z z 112 ) + y y y 23 s. a: x 1 + y y x 1 + y y y 23 7 x 1 + y z 102 x 1 + y 02 z 102 x 1 + y z 112 x 1 + y 12 z 112 x 1, y ij, z ijk {0, 1} 3. Resolución de problemas de PLE En esta sección se desarrollan dos métodos de resolución de problemas de programación lineal entera. El primero de ellos está diseñado para problemas de programación lineal entera binaria (únicamente con variables 0,1) y el segundo para problemas de carácter general, es decir para PLE puros o mixtos. La idea básica de ambos algoritmos es similar. Teniendo en cuenta que ciertas variables del problema toman soluciones enteras (0,1, 2, 3,..., ó 0/1) los algoritmos realizan 11
12 una enumeración de todas las posibles soluciones. Por ejemplo, si en un problema tenemos x 1, x 2 que toman valores 0/1 entonces probaremos las soluciones (x 1, x 2 ) = (0, 0), (x 1, x 2 ) = (0, 1), (x 1, x 2 ) = (0, 1) y (x 1, x 2 ) = (1, 0). Obviamente cuando el número de variables es grande dicha comprobación/enumeración de las soluciones se hace impracticable, por ejemplo, si tenemos 10 variables x j que toman valores 0/1 el número de posibles soluciones es 2 20 = , si consideramos 100 variables alcanzamos el número de , , etc. Aunque el número de posibles soluciones aumente exponencialmente (2 n ) los algoritmos disponen de herramientas para poder examinar muchas soluciones de golpe y de mecanismos para descartar conjuntos de soluciones sin necesidad de comprobarlas una a una. Dicho proceso se denominará enumeración implícita de soluciones, ya que se consideran pero no se llegan a tomar explícitamente Método enumerativo sencillo para PLE s binarios puros Este algoritmo sólo es válido para problemas de programación lineal entera con todas las variables binarias. Vamos a desarrollar el algoritmo para un formato específico de los PLE: problema de mínimo con todos los costos, c j, no negativos (c j 0, j). Obviamente las dos imposiciones sobre los problemas no constituyen una restricción para el tipo de problemas a resolver. Si un problema es de máximo basta con considerar la minimización de su función objetivo opuesta (máx Z mín (Z)). Por otro lado, si algún x j tiene c j < 0 entonces se realiza el cambio de variable x j = 1 x j, esta nueva variable también es una variable binaria y al realizar dicho cambio la nueva variable tiene su costo igual a c j = c j > 0. Por otro lado en la función objetivo aparece una constante que se puede suprimir ya que no va a afectar al proceso de optimización. Por tanto cualquier PLE binario se puede poner como mínimo con todos sus costos no negativos. Veamos un ejemplo, máx Z = 3x 1 + 2x 2 5x 3 2x 4 + 3x 5 s.a : x 1 + x 2 + x 3 + 2x 4 + x 5 4 7x 1 + 3x 3 4x 4 + 3x x 1 6x 2 + 3x 4 3x 5 3 x j {0, 1}, j = 1,..., 5 En primer lugar pasamos a mínimo considerando la función objetivo opuesta. mín Z = 3x 1 2x 2 + 5x 3 + 2x 4 3x 5 12
13 A continuación, hacemos los cambios de variable x 1 = 1 x 1, x 2 = 1 x 2 y x 5 = 1 x 5. Al sustituirlo obtenemos: mín Z = 3x 1 + 2x 2 + 5x 3 + 2x 4 + 3x 5 8 s.a : x 1 x 2 + x 3 + 2x 4 x 5 1 7x 1 + 3x 3 4x 4 3x x 1 + 6x 2 + 3x 4 + 3x 5 1 x 1, x 2, x 3, x 4, x 5 {0, 1} Y finalmente, para aplicar el algoritmo que vamos a desarrollar, ordenamos las variables del problema según el coeficiente de la función objetivo, de menor a mayor valor (olvidándonos de la constante): mín Z = 2x 2 + 2x 4 + 3x 1 + 3x 5 + 5x 3 Una vez que se dispone el problema en la forma indicada, la idea del procedimiento es muy sencilla. Por un lado mantenemos en una variable el mejor valor encontrado hasta el momento, inicialmente Z = (cota superior del valor óptimo). Por otro lado tratamos de buscar las soluciones en orden creciente de función objetivo (de mejor a peor soluciones). La mejor solución posible, si fuera factible, sería la solución con todas las variables tomando valor cero. x 2 = x 4 = x 1 = x 5 = x 3 = 0. Pero esta solución no verifica la segunda restricción (ni la tercera), por tanto no puede ser candidata a ser solución óptima. Ahora continuamos considerando soluciones en las que sólo una variable toma valor 1 y el resto son cero. La variable que toma valor 1 se toma siguiendo el orden que aparece en la función objetivo, ya que, si por ejemplo x 2 = 1 y el resto cero, fuera una solución factible seguro que no podría ser mejorada por x 4 = 1 (resto cero), o x 1 = 1 (resto cero), etc. x 2 = 1 y resto de variables valor cero. Solución que no verifica la segunda restricción. Consideramos la siguiente mejor solución en la que sólo una variable toma valor, que es x 4 = 1 y el resto cero. x 4 = 1 (resto cero), solución no factible por restricción 1. x 1 = 1 (resto cero), solución no factible por restricción 3. 13
14 x 5 = 1 (resto cero), solución factible de valor 3. Como dicho valor es mejor (menor) que la mejor solución almacenada (hasta el momento no tenemos ninguna solución almacenada), guardamos la solución y actualizamos la cota superior Z = 3. Aún queda una solución en la que sólo una variable toma valor, x 3, pero esta solución no se comprueba por que x 3 se encuentra a la derecha de x 5 y su coeficiente en la función objetivo será igual o peor (mayor). Tras comprobar las soluciones en las que sólo una variable toma valor pasamos a considerar las soluciones en las que dos variables toman valor 1 y el resto son cero. La mejor de ellas será la solución en la que las dos primeras variables de la función objetivo ordenada toman valor, después cuando la primera y la tercera toman valor, después cuando la primera y la cuarta toman valor, y así sucesivamente. Desde el momento el que se dispone de una cota superior Z lo primero que se hace antes de comprobar la factibilidad es comprobar el valor de la función objetivo, si dicho valor es peor que el de la cota, dicha solución no merece la pena y se elimina por lo que denominaremos acotación. Si el valor es mejor se procede con la comprobación de la factibilidad. x 2 = x 4 = 1 (resto cero). El VFO= 4 > Z = 3 por tanto independientemente de si fuera factible o no dicha solución no podría mejorar la que ya tenemos de antes, por tanto se descarta. Además de descartar la solución anterior por acotación hay que tener en cuenta que dicha solución era, en cuanto a valor de la función objetivo, la mejor candidata de todas (tiene las dos variables de más a la izquierda de la función objetivo ordenada). Por tanto, cualquier solución de dos variables tomando valor 1 será igual o peor que ella y como ya es peor que la que nos definió la cota superior, descartamos automáticamente, por acotación, todas las soluciones con dos variables tomando valor 1. Las soluciones con 3, 4 o 5 variables tomando valor se descartan automáticamente, por que la mejor de cada una de ellas contiene en particular x 2 = x 4 = 1 que proporcionaba un valor peor que el de la cota superior almacenada. Una vez estudiadas todas las soluciones, implícita o explícitamente, la solución óptima corresponde a la última vez que se actualizó la cota Z. En nuestro caso la solución es x 5 = 1, x 1 = x 2 = x 3 = x 4 = 0 Tras obtenerla deshacemos los cambios de variable, obteniendo como solución x 1 = 1, x 2 = 1, x 3 = 0, x 4 = 0, x 5 = 0 con un VFO=5. 14
15 Consideremos ahora un ejemplo un poco más grande que previamente ha sido transformado al formato apropiado. mín Z = 2x 1 + 3x 2 + 4x 3 + 4x 4 + 5x 5 + 6x 6 + 7x 7 + 8x 8 s.a: 4x 1 + 4x 2 + 3x 3 + 4x 4 + 6x 5 + 8x 6 + 5x 7 + 9x x 1 + 2x 2 + 3x 3 + 2x 4 + 5x 5 + 4x 6 + 3x 7 + x 8 12 x 6 + x 8 1 x 1 x 2 x 7 0 x 3 + x 5 0 x 1 + x 2 + x 3 + x 4 + x 5 + x 6 + x 7 + x 8 5 x j {0, 1}, j = 1,..., 8 Teniendo en cuenta la última restricción comenzaremos la búsqueda con soluciones que contengan al menos 5 variables tomando valor 1. Las soluciones con 4 o menos variables tomando valor 1 no serán factibles ya que no verifican la última de las restricciones. x 1 = x 2 = x 3 = x 4 = x 5 = 1 No factible por restricción 1. x 1 = x 2 = x 3 = x 4 = x 6 = 1 No factible por restricción 1. x 1 = x 2 = x 3 = x 4 = x 7 = 1 No factible por restricción 1. x 1 = x 2 = x 3 = x 4 = x 8 = 1 No factible por restricción 1. x 1 = x 2 = x 3 = x 5 = x 6 = 1 No factible por restricción 1. x 1 = x 2 = x 3 = x 5 = x 7 = 1 No factible por restricción 1. x 1 = x 2 = x 3 = x 5 = x 8 = 1 No factible por restricción 1. x 1 = x 2 = x 3 = x 6 = x 7 = 1 No factible por restricción 1. x 1 = x 2 = x 3 = x 6 = x 8 = 1 Solución factible. Como no hemos encontrado previamente ninguna solución factible, hacemos Z = = 23. Ya no es necesario examinar la solución x 1 = x 2 = x 3 = x 7 = x 8 = 1 (será igual o peor), es la única que queda de la forma x 1 = x 2 = x 3 = 1 Pero si que hay que seguir con las soluciones de la forma x 1 = x 2 = x 4 = 1. x 1 = x 2 = x 4 = x 5 = x 6 = 1 Z = 20 < Z = 23. No factible 1. 15
16 x 1 = x 2 = x 4 = x 5 = x 7 = 1 Z = 21 < Z = 23. No factible 1. x 1 = x 2 = x 4 = x 5 = x 8 = 1 Z = 22 < Z = 23. No factible 1. x 1 = x 2 = x 4 = x 6 = x 7 = 1 Z = 22 < Z = 23. No factible 1. x 1 = x 2 = x 4 = x 6 = x 8 = 1 Z = 23 Z = 23. Descartada por acotación, no puede mejorar lo que ya tenemos. x 1 = x 2 = x 5 = x 6 = x 7 = 1 Z = 23 Z = 23. Descartada por acotación. x 1 = x 2 = x 6 = x 7 = x 8 = 1 Z = 28 Z = 23. Descartada por acotación. x 1 = x 3 = x 4 = x 5 = x 6 = 1 Z = 21 < Z = 23. No factible 1. x 1 = x 3 = x 4 = x 5 = x 7 = 1 Z = 22 < Z = 23. No factible 1. x 1 = x 3 = x 4 = x 5 = x 8 = 1 Z = 23 Z = 23. Descartada por acotación. x 1 = x 3 = x 4 = x 6 = x 7 = 1 Z = 23 Z = 23. Descartada por acotación. x 1 = x 4 = x 5 = x 6 = x 7 = 1 Z = 24 Z = 23. Descartada por acotación. x 2 = x 3 = x 4 = x 5 = x 6 = 1 Z = 22 < Z = 23. No factible 1. x 2 = x 3 = x 4 = x 5 = x 7 = 1 Z = 23 Z = 23. Descartada por acotación. x 2 = x 3 = x 4 = x 6 = x 7 = 1 Z = 24 Z = 23. Descartada por acotación. No es necesario examinar más soluciones de 5 variables, quedan eliminados implícitamente por acotación. De seis variables, la de menor valor es x 1 = x 2 = x 3 = x 4 = x 5 = x 6 = 1 con Z = 24 Z por tanto no es necesario considerarlas y mucho menos las de siete variables tomando valor. Por tanto la solución óptima es: x 1 = x 2 = x 3 = x 6 = x 8 = 1 con un VFO = 23 Observad que hemos examinado explícitamente sólo 24 soluciones de las 2 8 = 256 posibles, lo que supone algo menos de un 10 % de las soluciones. 16
17 3.2. Método de ramificación y acotación En este apartado se considera la resolución de problemas de programación lineal entera mixta con el formato siguiente: máx Z = c 1 x + c 2 y s. a: A 1 x + A 2 y = b [P E] x, y 0 x enteras Definición 1. Llamaremos problema relajado de un problema de programación lineal entera al problema de programación lineal obtenido al eliminar todas las condiciones de integridad que existan sobre las variables. Desarrollamos el algoritmo de resolución que denominaremos Algoritmo de ramificación y acotación en 5 pasos. Un primer paso de inicialización que se realiza una única vez y cuatro pasos más que se repiten sucesivamente hasta alcanzar la solución óptima. Paso 0 Inicialización. Hacer S = I = 1. S nos indica el subproblema que se está estudiando en un momento dado. I es un contador de subproblemas generados. Establecemos una variable Z que contiene el mejor valor de la función objetivo encontrada hasta un momento dado, inicialmente hacemos Z = (si dispusiéramos inicialmente de alguna solución factible para el [PE], entonces asignaríamos su valor de función objetivo a Z). Resolvemos el problema relajado de [PE], PL-1. Sea (x 1, y 1 ) su solución óptima, con valor de la función objetivo Z 1. Si la solución (x 1, y 1 ) es factible para [PE], es decir, si todas las variables x 1 toman valores enteros, entonces dicha solución es la solución óptima de [PE], el algoritmo finaliza. En otro caso continuamos con el paso 1. Paso 1 Elección de una variable para ramificar. Consideramos el problema S-ésimo, P L S, aplicando alguno de los criterios que se enumeran tras el algoritmo determinar una variable para ramificar, sea ésta X Bi. Paso 2 Generación de subproblemas, ramificación. Se crean, a partir de PL-S, los dos subproblemas siguientes: P L (I + 1) = { P L S x Bi INT ( b i ) P L (I + 2) = { P L S x Bi INT ( b i )
18 Observad que los dos nuevos subproblemas cumplen que la solución obtenida al resolver el problema PL-S es infactible para ellos. Se está eliminando dicha solución y un conjunto de soluciones que no son factibles para [PE] (todas soluciones que tienen x Bi (INT ( b i ), INT ( b i ) + 1) y que por tanto no tienen un valor entero para X Bi ). Se finaliza este paso resolviendo ambos problemas, sean (x (I+1), y (I+1) ) y (x (I+2), y (I+2) ) las soluciones de ambos problemas con VFO Z (I+1) y Z (I+2), respectivamente. Paso 3 Cerrado de subproblemas. Si se cumple alguna de las condiciones siguientes, el nodo/subproblema/rama correspondiente, I + 1 o I + 2 se cierra. La solución obtenida es factible para [PE]. Además, si el VFO de dicha solución es mejor que el almacenado en Z se actualiza Z con dicho valor (Z (I+1) o Z (I+2), según corresponda). El valor de la función objetivo de la solución óptima del subproblema, sin ser factible para [PE], es peor/menor que el valor almacenado en Z. Es decir, se cierra la rama por acotación. El problema no es factible Hacer I = I + 2. Paso 4 Selección de problema sobre el que ramificar. Elegir alguno de los subproblemas no cerrado para ramificar de acuerdo a alguno de los criterios que se muestran al final del algoritmo. Sea el subproblema elegido el subproblema P L S, volver al paso 1. Si en este paso no existen subproblemas para ramificar el algoritmo finaliza. La solución que se utilizó por última vez para actualizar la cota Z es la solución óptima de [PE]. Si Z no ha sido actualizada nunca, es decir si Z =, entonces el [PE] es no factible. Criterios de selección de variable para ramificar En el paso 1 es necesario seleccionar una variable de la base óptima del problema PL-S para comenzar un nuevo proceso de ramificación. La variable seleccionada debe ser una variable tal que, teniendo que tomar valores enteros, no lo hace. La siguiente lista muestra cuatro posibles métodos de selección de problema: Arbitrariamente, cualquiera de las variables de la base que deberían ser enteras y no lo son. 18
19 La variable básica con mayor valor fraccionario. Se asignan prioridades a las variables que deben tomar valores enteros de acuerdo a algún criterio y se elige la variable básica con valor no entero de mayor prioridad. Se elige la variable en la que se alcanza el máximo de la expresión siguiente: { máx mín ( bi INT ( b i ), INT ( b i ) + 1 b )} i x i básicas Criterios de selección de subproblema para ramificar Cuatro posibles criterios de selección de subproblema para ramificar son los siguientes: Arbitrariamente, cualquier problema no cerrado. El de mayor VFO, de esta forma se espera que tengamos una mayor posibilidad de cerrar problemas por acotación y/o tengamos la posibilidad de encontrar soluciones con mejores valores de la función objetivo. LIFO. Se toma el subproblema no cerrado más nuevo. (Last Input First Output). FIFO. Se toma el subproblema no cerrado más antiguo. (First Input First Output). A continuación aplicamos el algoritmo de ramificación y acotación al siguiente ejemplo: máx Z = 3x 1 + 2x 2 s. a: x 1 2 x 2 2 x 1 + x 2 3,5 x 1 0, x 2 0 y enteras En primer lugar hacemos S = I = 1 y consideramos el problema relajado, PL-1, problema en el que se elimina la condición de integridad. Las variables x 1 y x 2 sólo se restringen a ser no negativas. A continuación se resuelve dicho problema. En general para la resolución del problema se utilizará el algoritmo simplex o simplex dual. En nuestro ejemplo, por su sencillez y para mostrar el funcionamiento del algoritmo, se utiliza el método gráfico. En la siguiente figura se muestra el recinto de PL-1 junto con la solución óptima x 1 = (2, 1,5) con un valor de la función objetivo Z 1 = 9. Como la solución no es factible para [PE], ya que x 2 debería ser entera y no lo es, pasamos al paso 1. 19
20 2 PL x =( 2, 1.5), Z = Consideramos el problema PL-S, en esta primera iteración PL-1, y seleccionamos una variable para ramificar. Como sólo hay una variable con valor no entero, x 2, no hay lugar a la elección, la única variable seleccionable es ella. Tomamos pues x 2 y vamos al paso 2. A partir de x 2 creamos dos nuevos subproblemas, PL-2 y PL-3, tal y como se muestra a continuación. P L 2 = { P L 1 x 2 1 P L 3 = { P L 1 x 2 2 Es decir, P L 2 máx Z = 3x 1 + 2x 2 s. a: x 1 2 x 2 2 x 1 + x 2 3,5 x 2 1 x 1 0, x 2 0 P L 3 máx Z = 3x 1 + 2x 2 s. a: x 1 2 x 2 2 x 1 + x 2 3,5 x 2 2 x 1 0, x 2 0 Tras generar dichos problemas los resolvemos. En el caso de haber utilizado un algoritmo de tipo simplex para su resolución podemos aplicar la técnica de adición de restricciones estudiada en el tema de análisis pot-optimal. En nuestro caso utilizamos el método gráfico nuevamente. La resolución puede verse en la figura siguiente. Los recintos de factibilidad son un rectángulo para PL-2 y un segmento para PL-3 (el segmento que va de (0,2) a (1.5,2)). Observad que la unión de los dos recintos sigue conteniendo todas las soluciones enteras que tenía el reciento original. El proceso ha eliminado una franja de soluciones, pero ninguna de ellas era factible para [PE] ya que tenían el valor de x 2 entre 1 y 2 estrictamente. Además la solución óptima de PL-1 pertenece a la franja eliminada. 20
21 2 2 PL 3 x 3 3 =(1.5,2), Z =8.5 1 PL 2 x 2 2 =(2,1), Z =8, Z= Las dos soluciones obtenidas son x 2 = (2, 1) con Z 2 = 8 y x 3 = (1,5, 2) con Z 3 = 8,5. Seguimos con el paso 3. El subproblema PL-2 se cierra (ya no se ramifica más) ya que se ha alcanzado una solución factible para [PE]. Si continuamos ramificando podríamos encontrar soluciones con valor de la función objetivo igual o peor, nunca mejor, ya que al imponer más restricciones a los subproblemas se reducen los recintos de factibilidad. Además como aún no habíamos establecido una cota inferior Z la establecemos con el valor de la función objetivo obtenida, Z = Z 2 = 8. El subproblema PL-3 aún no puede cerrarse, ya que no se cumple ninguno de los supuestos del paso 3, por lo que pasamos al paso 4. Elegimos un problema no cerrado para ramificarlo, para generar nuevos subproblemas. Como sólo hay un problema no cerrado, el PL-3, no hay lugar a la elección, lo elegimos directamente. Hacemos S = 3 y tomamos como problema actual a PL-3. Volvemos al paso 1, seleccionamos x 1 como variable para realizar la ramificación (es la única con valor no entero). En el paso 2, generamos los problemas PL-4 y PL-5 añadiendo, respectivamente, las restricciones x 1 menor o igual que la parte entera del valor que toma y x 1 mayor o igual que la parte entera más 1 del valor que toma. Es decir, P L 4 P L 4 = { P L 3 x 1 1 máx Z = 3x 1 + 2x 2 s. a: x 1 2 x 2 2 x 1 + x 2 3,5 x 2 2 x 1 1 x 1 0, x 2 0 En la figura siguiente se muestra su resolución: P L 5 = P L 5 { P L 3 x 1 2 máx Z = 3x 1 + 2x 2 s. a: x 1 2 x 2 2 x 1 + x 2 3,5 x 2 2 x 1 2 x 1 0, x
22 2 PL 4 x 4 4 =(1,2), Z =7 2 PL 5 No factible El problema PL-4 tiene la solución x 4 = (1, 2) con Z 4 = 7 y PL-5 es un problema no factible no hay ninguna solución que verifique todas las restricciones del subproblema. En el paso 3 cerramos ambos problemas. PL-4 por tener solución factible para [PE], tanto x 1 como x 2 son enteras. Como su valor Z 4 = 7 es menor que la mejor cota hasta el momento Z = 8, Z no se actualiza. El problema PL-5 se cierra por ser no factible, si con las restricciones añadidas hasta el momento ya no hay ninguna solución que las verifique, si añadiésemos más restricciones con más razon sería no factible. Observad que el problema PL-4 también se hubiera cerrado aunque su solución óptima no hubiera sido factible para [PE] ya que su VFO Z 4 = 7 es peor que Z = 8. Finalmente consideramos el paso 4 nuevamente. Como no hay ningún subproblema/rama abierto el algoritmo finaliza. La solución óptima corresponde al subproblema PL-2 (última actualización de Z). Para finalizar el tema repetimos el proceso utilizando el método simplex. Resolvemos el problema PL-1 obteniendo la tabla óptima: X B x 1 x 2 x 3 x 4 x 5 b x x /2 1/2 x /2 3/ Que nos proporciona la solución x 1 = (2, 1,5) con Z 1 = 9. Como no es entera se ramifica sobre x 2, generando los problemas PL-2 y PL-3. Obtenidos al añadir a PL-1 las restricciones, x 2 1 y x 2 2, respectivamente. A la hora de determinar la variable que va generar la ramificación no es necesario tener en cuenta las variables de holgura, 22
23 sólo se consideran las variables reales del problema (en este caso la variable x 4 que también toma valor no entero no se consideraría, se tratan como variables de la parte y del algoritmo, de las que no están obligadas a tomar valor entero). Para añadir las restricciones se despejan de la tabla óptima de PL-S, las variables básicas que aparecen en la restricción (en este caso las restricciones sólo tienen una variable). x 2 = x x La restricción x 2 1 queda x 3 1x es decir x 2 3 1x y la restricción 2 x 2 2 queda x 2 = x 3 1x es decir x x Se añade una variable de 2 holgura a cada una de las restricciones y se introducen en sus tablas respectivas (aunque ambas variables de holgura se nombran como x 6 son variables distintas una es de PL-2 y la otra de PL-3): PL-2 X B x 1 x 2 x 3 x 4 x 5 x 6 b x x /2 0 1/2 x /2 0 3/2 X /2 1-1/ Aplicamos el algoritmo del simplex dual hasta llegar a las tablas: PL-2 X B x 1 x 2 x 3 x 4 x 5 x 6 b x x x X PL-3 X B x 1 x 2 x 3 x 4 x 5 x 6 b x x /2 0 1/2 x /2 0 3/2 x /2 1-1/ PL-3 X B x 1 x 2 x 3 x 4 x 5 x 6 b x /2 1 3/2 x x x /2-1 1/ /2-1 Proporcionando las soluciones x 2 y x 3. La rama de PL-2 se cierra por solución entera y además nos actualiza la cota Z. Y la rama PL-3 se ramifica a partir de la variable x 1 que toma valor 3/2. Generamos los problemas PL-4 y PL-5, añadiendo, respectivamente, x 1 1 y x 1 2. Despejamos la variable x 1 de la tabla óptima del problema que ramificamos PL-3. Lo sustituimos en las dos restricciones x 1 = 1 2 x 5 x P L 4 : 1x 2 5 x x 2 5 x P L 5 : 1x 2 5 x x x
24 Y las introducimos en la tabla óptima de PL-3, junto con holguras de mismo nombre pero diferentes x 7 : PL-4 X B x 1 x 2 x 3 x 4 x 5 x 6 x 7 b x / /2 x x x / /2 x / / /2-1 0 PL-5 X B x 1 x 2 x 3 x 4 x 5 x 6 x 7 b x / /2 x x x / /2 x / / /2-1 0 La continuación de PL-4 (sale x 7 entra x 6 ) nos lleva a la solución x 4 = (1, 2) con Z 4 = 7 y al tratar de continuar con PL-5 vemos que sale la variable x 7 pero no hay ninguna variable para entrar, ya que en su fila todos los elementos son nulos o positivos, por tanto dicho subproblema es no factible. Ambos problemas se cierran en el paso 3, uno por alcanzarse solución factible para [PE] o por acotación, ya que su VFO es 7 menor que Z = 8. Y el otro por ser no factible. Tanto para el caso de resolución gráfica como resolución mediante tablas podemos construir un árbol que nos muestra el proceso de ramificación seguido y las distintas soluciones encontradas. PL 1 Z=oo x 1 =(2,1.5), Z 1=9 SNE x <1 2 x 2 >2 PL 2 Z=8 2 2 x =(2,1.5), Z =8 SE PL 3 Z=8 3 3 x =(1.5,2), Z =8.5 SNE # x 1 <1 x 1 >2 PL 4 Z=8 4 4 x =(1,2), Z =7 SE ACOT. PL 5 Z=8 NO FACTIBLE NF # # 24

References: Resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 Resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución