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