Preview only show first 10 pages with watermark. For full document please download

Branch And Bound

   EMBED


Share

Transcript

Branch and Bound Unidad 1 Dr. Cristian Oliva San Martín [email protected] Departamento de Ingeniería Civil Industrial Investigación de Operaciones II Temario Dividir para Conquistar Temario Dividir para Conquistar Enumeración Implícita Dividir para Conquistar Considere el problema ◮ z  = max {cx  : x  ∈ S }. Cómo podemos dividir el problema en una serie de problemas más pequeños, más fáciles de resolver y que uniendo la información podamos resolver el problema original? ∪ S 2 ∪ . . . ∪ S K  una descomposición de S  en conjuntos más pequeños. Sea z k  = max {cx  : x  ∈ S k } para k  = 1, . . . , K . Entonces z  = max k =1 K  {z k }. Proposición: Sea S  = S 1 ,..., Enumeración Implícita ◮ Cómo podemos usar las cotas sobre los valores de {z k } inteligentemente? ∪ S 2 ∪ . . . ∪ S K  una descomposición de S  en conjunto más pequeños. Sean z k  = max {cx  : x  ∈ S k } para ¯ k  una cota superior de z k  y z k  una cota k  = 1, . . . , K .. Sea z inferior de z k . Entonces z¯  = max k {z¯ k } es una cota superior para z  y z  = max k {z k } es una cota inferior para z . Proposición: Sea S  = S 1 Ejemplo: En la figura 1 se muestra una descomposición de en dos conjuntos S 1 y S 2 . Además se ilustran las cotas superiores e inferiores de los problemas correspondientes. 27 S  25 S  S  13 20 20 25 S 1 S 2 25 S 1 S 2 Ejemplo 2 En la figura 2, S  se descompone en dos conjuntos S 1 y S 2 e ilustra las cotas inferiores y superiores de los problemas correspondientes. 27 26 S  S  13 21 20 26 S 1 S 2 18 21 26 S 1 S 2 21 Figura: Podado por Cota 2 Ejemplo 3 En la figura 3, S  se descompone en dos conjuntos S 1 y S 2 e ilustra las cotas inferiores y superiores de los problemas correspondientes. 40 37 S  S  13 24 37 S 1 S 2 24 37 S 1 S 2 13 13 Figura: Imposible podar 3 Tres razones que nos permiten podar el árbol ◮ Podar por optimalidad: resuelto. z t  = {max cx  : x  ∈ S t } ha sido Tres razones que nos permiten podar el árbol ◮ ◮ Podar por optimalidad: resuelto. Podar por cota: z¯ t  ≤ z . z t  = {max cx  : x  ∈ S t } ha sido Tres razones que nos permiten podar el árbol ◮ Podar por optimalidad: resuelto. z t  ◮ Podar por cota: z¯ t  ≤ z . ◮ Podar por infactibilidad: = {max S t  = ∅. cx  : x  ∈ S t } ha sido Branch and Bound: Un ejemplo z  = max  s .a 4x 1 − x 2 7x 1 − 2x 2 ≤ 14 x 2 2x 1 − 2x 2 2 x  ∈ Z + ∪0 ≤3 ≤3 Obtención de cotas Para obtener una primera cota superior, se agregan las variables de holgura x 3 , x 4 , x 5 y se resuelve la relajación de programación lineal, en la cual las restricciones de integralidad son eliminadas. La representación óptima resultante es: ¯  = max  z 59 7 − 4 x  7 3 − 1 x  7 4 x 1 + 1 x  7 3 + 2 x  7 4 + x 4 x 2 − 27 x 3 + 10 x  7 4 x 1 , x 2 , x 3 , x 4 , x 5 ≥0 20 7 =3 23 = 7 = + x 5 Se obtiene una cota superior z¯  = 59 y una solución no-entera 7 (x ¯1 , x ¯2 ) = ( 20 , 3). Existe alguna forma directa de encontrar una 7 cota inferior? Aparentemente podemos suponer que la mejor solución encontrada es (0 0) con valor objetivo z  0 Branch and Bound hasta aquí  59 7 S  0 Ramificando Dado que z  < z¯ , se necesita ramificar o dividir. Cómo deberíamos dividir la región factible? Una idea es seleccionar una variable que requiere ser entera pero que en la solución de programación lineal es fraccionaria. Luego, podemos dividir el problema de la siguiente forma: S 1 S 2 = S  ∩ {x  : x  j  ≤ ⌊x ¯ j ⌋} = S  ∩ {x  : x  j  ≥ ⌈x ¯ j ⌉} Siguiendo nuestro ejemplo, dado que x ¯1 = 7 , tomamos:   ≤ }   S 1 = S  ∩ {x  : x 1 S 2 = S  ∩ {x  : x 1 ≥ 59 7 20 20 7 20 } 7 S  0 x 1 ≤2 x 1 ≥3 Seleccionando un problema (nodo) La lista de problemas activos (nodos) que tienen que ser examinados contiene ahora S 1 y S 2 . Arbitrariamente seleccionamos S 1 . Reoptimizando ◮ ◮ ◮ Cómo deberíamos resolver los programas lineales modificados sin tener que resolverlos nuevamente desde el inicio? Dado que sólo hemos añadido una restricción al programa lineal, la base óptima actual sigue siendo factible dual, y es por esta razón que se reoptimiza desde esta base utilizando el algoritmo simplex dual. Aplicando esta idea a la relajación de programación lineal de S 1 y reescribiendo x 1 ≤ 2 como x 1 + x 6 = 2, x 6 ≥ 0 se tiene: z  ¯1 = max  15 2 − 1 x  2 5 x 1 x 2 − − 3x 6 + x 6 1 x  2 5 + x 6 − x 5 − 5x 6 x 3 x 4 + 1 x  2 5 x 1 , x 2 , x 3 , x 4 , x 5 , x 6 + 6x 6 ≥0 =2 1 = 2 =1 5 = 2 Branch and Bound hasta aquí  59 7 S  0 x 1 ≤2 x 1 ≥3 15 2 S 1 0 S 2 Ramificando no puede ser podado, así usando la misma regla de ramificación anterior creamos dos nodos S 3 y S 4 . Dado que x ¯2 = 12 , tomamos: S 1 S 1 S 2 = S  ∩ {x  : x 2  ≤ }  = S  ∩ {x  : x 2 ≥ 1 2 1 } 2 59 7 S  0 x 1 ≤2 x 1 ≥3 15 2 S 1 S 2 0 x 2 =0 S 3 x 2 S 4 ≥1 Seleccionando un problema (nodo) La lista de problemas activos (nodos) que tienen que ser examinados contiene ahora S 2 ,S 3 y S 4 . Arbitrariamente seleccionamos S 2 . Reoptimizando ◮ Aplicando el algoritmo simplex dual a la relajación de programación lineal de S 2 y reescribiendo x 1 ≥ 3 como x 1 − x 7 = 3, x 7 ≥ 0 se tiene: ¯  = max  z 59 7 x 1 − 4 x  7 3 + 1 x  7 3 − 1 x  7 4 + 2 x  7 4 + x 4 x 2 − 27 x 3 + 10 x  7 4 + x 5 1 x  7 3 2 x  7 4 + x 7 + x 1 , x 2 , x 3 , x 4 , x 5 , x 7 es infactible y por ello S 2 ≥0 se poda por infactibilidad. 20 = 7 =3 23 = 7 1 =− 7 Branch and Bound hasta aquí  59 7 S  0 x 1 ≤2 x 1 ≥3 15 2 S 1 S 2 0 x 2 =0 S 3 x 2 S 4 ≥1 Seleccionando un problema (nodo) La lista de problemas activos (nodos) que tienen que ser examinados contiene ahora S 3 y S 4 . Arbitrariamente seleccionamos S 4 . Reoptimizando ◮ Aplicando el algoritmo simplex dual a la relajación de programación lineal de S 4 = S  ∩ {x  : x 1 ≤ 2, x 2 ≥ 1 la solución óptima es: (x ¯1 , x ¯2 ) = (2, 1) con valor 7. Como esta solución es entera, z ¯4 = z 4 = z 4 = 7. El nodo se poda por optimalidad. 59 7 S  0 x 1 ≤2 x 1 ≥3 15 2 S 1 S 2 0 x 2 =0 x 2 7 S 3 S 4 ≥1 Actualización del Branch and Bound Como la solución es entera, actualizamos el valor de la mejor solución factible encontrada hasta aquí: z  ← max {0, 7}, almacenar la solución correspondiente (2,1).59 7 S  7 x 1 ≤2 x 1 ≥3 15 2 S 1 S 2 7 x 2 =0 x 2 7 S 3 S 4 7 ≥1 Seleccionando un problema (nodo) La lista de problemas activos (nodos) que tienen que ser examinados contiene ahora sólo S 3 . Seleccionamos S 3 . Reoptimizando ◮ Aplicando el algoritmo simplex dual a la relajación de programación lineal de S 3 = S  ∩ {x  : x 1 ≤ 2, x 2 = 0 la solución óptima es: (x ¯1 , x ¯2 ) = ( 32 , 0) con valor 6. 59 7 S  7 x 1 ≤2 x 1 ≥3 15 2 S 1 S 2 7 x 2 =0 x 2 6 7 S 3 S 4 ≥1 Actualización del Branch and Bound Como z  = 7 > z ¯3 = 6, S 3 se poda (muere) por cota. 59 7 S  7 x 1 ≤2 x 1 ≥3 15 2 S 1 S 2 7 x 2 =0 x 2 6 7 S 3 S 4 7 ≥1 Seleccionando un problema (nodo) y Conclusiones ◮ La lista de problemas activos (nodos) que tienen que ser examinados esta vacía. Por ello, la solución óptima es (x 1 , X 2 ) = (2, 1) con z  = 7. ◮ Observe que también se hubiera podido utilizar un preprocesamiento de la cota superior observando que el valor de la función objetivo debe ser entero dado que los coeficientes son enteros y las variables enteras. Con ello, no hubiera sido necesario explorar el nodo S 3 . Branch and Bound basado en programación lineal En la figura se presenta un flujograma de un algoritmo simple del tipo branch and bound. Inicialización Problema inicial S  con Formulación z  = −∞ P  en la lista SI-PARE. OPTIMO Lista vacía? no   ? Seleccione Problema S i  con formulación i  P    ? Resuelva relajación PL de P i  ¯ i  = valor PL Cota dual z i  x  (PL)=solución PL   ? si Si  i  P  vacío, pode por infactibilidad no   ? si Si z¯ i  ≤  z , pode por cota no   ? si Si x (PL) entero, actualice cota primal  Actualice x  = x i  (PL) pode por optimalidad no   ? i  i  generar dos subproblemas S 1 y S 2  ∗ con formulaciones i  P 1 y i  P 2 z  = z¯ i  ∗ x