Transcript
Exploración de grafos
Grafos Recorridos sobre grafos
Backtrackin “vuelta Backtrackin “vuelta atrás” atrás” at
Búsqueda primero en profundidad Búsqueda primero en anchura Descripción general Espacio de soluciones Implementación Ejemplos
Branch Bran Brancch & Bound Bound (“ramificación (“rami (“ramific ficaci ación ón y poda”)
Descripción general Estrategias de ramificación Implementación Ejemplos
125
Branch & Bound Branch “Branch “Bran Branch ch and and Bound” Bound” (B&B) es una generalización de la técnica de backtracking: backtracking:
Se realiza un recorrido sistemático del árbol de estados de un problema, si bien ese recorrido no tiene por qué , usaremos una estrategia de ramificación. ramificación. Además, utilizaremos técnicas de poda para eliminar todos aquellos nodos que no lleven a soluciones óptimas (estimando, en cada nodo, cotas del beneficio que podemos obtener a partir del mismo). NOTA: Los algoritmos algoritmos que utilizan utilizan B&B suelen suelen ser ser de orden exponencial (o peor)en su peor caso.
126
Branch & Bound Branch Diferencias con backtracking En bactracking bactracking,, tan pronto como se genera un nuevo hijo del nodo en curso, este hijo pasa a ser el nodo en curso. En B&B, se generan todos los hijos del nodo en curso antes antes de ue cual cual uier uier otro otro nodo vivo vivo ase a ser el nuevo nodo en curso (no (no se realiza un recorrido en profundidad).
En consecuencia: En backtracking backtracking,, los únicos nodos vivos son los que están en el camino de la raíz al nodo en curso. En B&B, puede haber más nodos vivos, 127 que se almacenan en una lista de nodos vivos.
Branch & Bound Branch Diferencias con backtracking En bactracking bactracking,, el test de comprobación realizado por la funciones de poda nos indica únicamente si un nodo concreto nos puede llevar a una solución o no. En B&B B&B sin sin emb embar ar o se acot acotaa el el val valor or de la so solu luci ción ón a la la que nos puede conducir un nodo concreto, de forma que esta acotación nos permite… podar el árbol (si sabemos que no nos va a llevar a una solución mejor de la que ya tenemos) y establecer el orden de ramificación (de modo que comenzaremos explorando las ramas más prometedores del árbol).
128
Branch & Bound Estimación de las cotas a partir de una solución parcial: Antes de explorar s,
2
la mejor solución M alcanzable desde s. ................ CI(s) ≤ valor(M) ≤ CS(s)
1
x1 x2 s
3 s= (x1, x2)
¿? (sin explorar)
M= (x1, x2, x 3, x 4,..., x n) valor(M) = ¿?
M 129
Branch & Bound Descripción general Branch & Bound es un método general de búsqueda que se aplica de la siguiente forma:
raíz y su región factible (inicialmente, el problema original, con su espacio de soluciones completo). Aplica funciones de acotación al problema raíz, para el que establece cotas inferiores y/o superiores. Si las cotas cumplen las condiciones que se hayan establecido, habremos encontrado la solución óptima del problema y la búsqueda termina. 130
Branch & Bound Descripción general
Si se encuentra una solución óptima para un subproblema concreto, ésta será una solución factible ara el roblema com leto ero no necesariamente su óptimo global. Cuando en un nodo (subproblema), su cota local es peor que el mejor valor conocido en la región, no puede existir un óptimo global en el subespacio de la región factible asociada a ese nodo y, por tanto, ese nodo puede ser eliminado (“podado”). 131
Branch & Bound Descripción general En B&B, la búsqueda prosigue hasta que… “
”
,
se cumple algún criterio pre-establecido sobre el mejor valor encontrado y las cotas locales de los subproblemas aún no resueltos.
132
Branch & Bound Estimadores y cotas en Branch & Bound
Valor
Problema de maximización
Problema de minimización
Beneficio
Coste
CL ≥ Óptimo local
CL ≤ Óptimo local
o a oca
Interpretación: No alcanzaremos nada mejor al expandir el nodo. Cota global
Cota inferior
Cota superior CG ≤ Óptimo global CG ≥ Óptimo global Interpretación: La solución óptima nunca será peor que esta cota. 133
Branch & Bound Estimadores y cotas en Branch & Bound Bound:: Cota local Nos permite asegurar que no se alcanzará nada mejor al expandir un nodo determinado. . Si ÓptimoLocal(i) ÓptimoLocal(i) es el coste/beneficio de la mejor solución que se podría alcanzar al expandir el nodo i, la cota local es una estimación de dicho valor que debe ser mejor o igual que ÓptimoLocal(i). ÓptimoLocal(i). Cuanto más cercana sea la cota a ÓptimoLocal(i), ÓptimoLocal(i), mejor será la cota y más se podará el árbol (si bien debemos mantener un equilibrio entre la eficiencia del cálculo 134 de la cota y su calidad).
Branch & Bound Estimadores y cotas en Branch & Bound Bound:: Cota global La solución óptima nunca será peor que esta cota. cota. Es el valor de la mejor solución estudiada hasta el
ser peor o igual al coste/beneficio de la solución óptima. Inicialmente, se le puede asignar el valor obtenido por un algoritmo greedy o, en su defecto, el peor valor posible. Se actualiza siempre que alcanzamos una solución que mejore su valor actual. Cuanto más cercana sea al coste/beneficio óptimo, más se podará el árbol, por lo que es importante 135 encontrar buenas soluciones cuanto antes.
Branch & Bound Estimadores y cotas en Branch & Bound Bound:: Estimador del coste/beneficio local óptimo Se calcula para cada nodo i y sirve para determinar el siguiente nodo que se expandirá. , , pero no tiene por qué ser mejor o igual que ÓptimoLocal(i). ÓptimoLocal (i). Normalmente, se utiliza la cota local como estimador, pero, si se puede definir una medida más cercana a ÓptimoLocal(i) ÓptimoLocal (i) sin que importe si es mejor o peor que ÓptimoLocal(i), ÓptimoLocal (i), podría interesar el uso de esta medida para decidir el siguiente nodo que se expandirá.
136
Branch & Bound Estrategia de poda en Branch & Bound Además de podar aquellos nodos que no cumplan las restricciones implícitas (soluciones parciales no factibles), se odrán odar a uellos nodos cu a cota local sea peor que la cota global. global. Si sé que lo mejor que se puede alcanzar al expandir un nodo no puede mejorar una solución que ya se ha obtenido (o se va a obtener al explorar otra rama del árbol), no es necesario expandir dicho nodo. 137
Branch & Bound Estrategia de poda en Branch & Bound Por la forma en la que están definidas las cotas local y global, se puede asegurar que con la poda no se erderá nin una solución ó tima: Por definición: - CotaLocal(i) CotaLocal(i) es mejor o igual que ÓptimoLocal(i). ÓptimoLocal(i). - CotaGlobal es peor o igual igual que Óptimo. Si CotaLocal CotaLocal(i) (i) es peor que CotaGlobal, CotaGlobal, entonces ÓptimoLocal(i) ÓptimoLocal (i) tiene que ser peor que Óptimo.
138
Branch & Bound Estrategia de poda en Branch & Bound
Valor
Problema de maximización
Problema de minimización
Beneficio
Coste
CL ≥ Óptimo local
CL ≤ Óptimo local
o ar s Cota local
Interpretación: No alcanzaremos nada mejor al expandir el nodo. Cota global CG ≤
Óptimo global CG ≥ Óptimo global Interpretación: La solución óptima nunca será peor que esta cota. 139
Branch & Bound Estrategias de ramificación
Normalmente, el árbol de estados de un problema no se representa de forma explícita. nodos vivos (nodos generados pero aún no explorados). Según cómo se implemente la lista de nodos vivos, el recorrido será de uno u otro tipo. La lista de nodos vivos contiene todos los nodos que han sido generados pero que no han sido explorados todavía (los nodos pendientes de tratar por B&B). 140
Branch & Bound Estrategias de ramificación Sin tener en cuenta los costes/beneficios, realizando una búsqueda “a ciegas”:
Estrategia FIFO (First In First Out Out))
Estrategia LIFO (Last In, First Out Out). ).
Usando estimaciones de costes/beneficios, explorando primero los nodos más prometedores:
Estrategias LC (Least Cost) Cost) / MB (Maximum Benefit Benefit). ). 141
Branch & Bound Estrategias de ramificación: Estrategia FIFO
LNV
Lista de nodos vivos: Cola FIFO. . 1 2 4
3 5
LNV
1
6
7
2
3
3
4
5
4
5
6
7 142
Branch & Bound Estrategias de ramificación: Estrategia LIFO
LNV
Lista de nodos vivos: Pila LIFO. . 1 2
LNV
1
3 4
5 6
7
2
3
2
4
5
2
4
6
7 143
Branch & Bound Estrategias de ramificación: Estrategias LC [Least [Least Cost Cost]] / MB [[Maximum Maximum Benefit] Benefit] De los nodos de la lista de nodos vivos, … menor coste estimado (LC) en problemas de minimización, o mayor beneficio estimado (MB) en problemas de maximización. 144
Branch & Bound Estrategias de ramificación: Estrategias LC [Least [Least Cost Cost]] / MB [[Maximum Maximum Benefit] Benefit] En caso de empate (de beneficio o coste estimado)
Estrategia LCLC-FIFO/MB FIFO/MB--FIFO FIFO: En caso de empate, escoger el primero que se introdujo en la LNV. Estrategia LCLC-LIFO/MB LIFO/MB--LIFO: LIFO En caso de empate, escoger el último que se introdujo en la LNV. 145
Branch & Bound Estrategias de ramificación: Estrategias LC [Least [Least Cost Cost]] / MB [[Maximum Maximum Benefit] Benefit] En cada nodo podemos tener: ,
un coste/beneficio estimado y una cota superior del coste/beneficio.
CI E CS
El árbol se poda según los valores de las cotas (CI,CS). El árbol se ramifica según los valores estimados (E). 146
Branch & Bound Branch & Bound en problemas de minimización
La cota local es una cota inferior CI(i) del mejor coste que se puede conseguir al expandir el nodo i:
La cota global es una cota superior CS del coste del óptimo global: CS ≥ Óptimo Se puede podar un nodo i cuando CI(i) > CS. CS. 147
Branch & Bound Branch & Bound en problemas de maximización
La cota local es una cota superior CS(i) del máximo beneficio que se puede conseguir al expandir el nodo i:
La cota global es una cota inferior CI del beneficio del óptimo global: CI ≤ Óptimo Se puede podar un nodo i cuando CS(i) < CI. CI. 148
Branch & Bound Implementación para un problema de minimización (C,s C,s) ) BranchAndBoundMin (nodoRaíz nodoRaíz) ) { LNV = {nodoRaíz {nodoRaíz}; }; ,s = no o a z ; r mera so uc n p.e . ree y // y cota superior asociada while (LNV
≠ ∅)
{
x = seleccionar(LNV); // Según un criterio FIFO, // LIFO, LCLC-FIFO ó LCLC-LIFO LNV = LNV - {x}; … 151
Branch & Bound Implementación para un problema de minimización … if ( CI(x) <= C ) foreach (y hijo de x) if (y es una solución final mejor que s) { s = C = coste(y); } else if ( y no es solución final && (CI(y) <= C) ) { LNV = LNV + {y}; (Ctmp,Stmp Ctmp,Stmp) ) = CS (y); if (Ctmp < < C) { C = Ctmp; Ctmp; s = Stmp Stmp; ; } } } // del bucle while while (LNV ≠ ∅) return (C,s C,s); ); }
152
Branch & Bound Implementación para un problema de maximización (C,s C,s) ) BranchAndBoundMax (nodoRaíz nodoRaíz) ) { LNV = {nodoRaíz {nodoRaíz}; }; ,s = no o a z ; r mera so uc n p.e . ree y // y cota inferior asociada while (LNV
≠ ∅)
{
x = seleccionar(LNV); // Según un criterio FIFO, // LIFO, MBMB-FIFO ó MBMB-LIFO LNV = LNV - {x}; … 153
Branch & Bound Implementación para un problema de maximización … if ( CS(x) >= C ) foreach (y hijo de x) if (y es una solución final mejor que s) { s = C = beneficio(y) = beneficio(y); ; } else if ( y no es solución final && (CS(y) (CS(y) >= C) C) ) { LNV = LNV + {y}; (Ctmp,Stmp Ctmp,Stmp) ) = CI (y); (y); if (Ctmp > > C) C) { C = Ctmp Ctmp; ; s = Stmp Stmp; ; } } } // del bucle while while (LNV ≠ ∅) return (C,s C,s); ); }
154
Branch & Bound Observaciones:
Sólo se comprueba el criterio de poda cuando se
.
Si un descendiente de un nodo es una solución final, entonces no se introduce en la lista de nodos vivos. Se comprueba si esa solución es mejor que la actual y, si es así, se actualiza C y se guarda como mejor solución hasta el momento. 155
Branch & Bound ¿Qué hacemos cuando CI(x) = CS(x)?
Opción A: No podar (no sabemos si tenemos la solución).
O ción B: Usar dos variables de oda. CI: CI: Cota inferior actual de una solución parcial. voa: voa: Valor óptimo actual de una solución encontrada. Podar x Podar x si (CS(x) < CI) CI) o bien (CS(x) (CS(x) ≤ voa) voa).
Opción C: Generar directamente el nodo solución usando el método utilizado para calcular la cota. if (CI(x) == CS(x)) x = Solución empleada para calcular la cota (p.ej. algoritmo greedy greedy) )
156
Branch & Bound Tiempo de ejecución de un algoritmo B&B El tiempo de ejecución de un algoritmo B&B depende de: El número de nodos recorridos
(que, a su vez, depende de la efectividad de la poda).
El tiempo empleado en cada nodo
(tiempo necesario para hacer las estimaciones de coste y gestionar la lista de nodos vivos en función de la estrategia de ramificación).
En el peor caso, el tiempo de un algoritmo B&B será igual al de un algoritmo backtracking (o peor incluso, si tenemos en cuenta el tiempo que requiere la LNV). En el caso promedio, no obstante, se suelen obtener mejoras con respecto a backtracking.
157
Branch & Bound Tiempo de ejecución de un algoritmo B&B ¿Cómo hacer que un algoritmo B&B sea más eficiente? Haciendo estimaciones de coste muy precisas
(con lo que se realiza una poda exhaustiva del árbol y se recorren menos nodos, pero se emplea mucho tiempo en realizar las estimaciones).
Haciendo estimaciones de coste poco precisas (con lo que se emplea poco tiempo en cada nodo, a costa de no podar demasiado, con lo que el número de nodos explorados puede ser muy elevado).
Conclusión: Se debe buscar un equilibrio entre la precisión de las cotas y el tiempo empleado en calcularlas.
158
Branch & Bound Soluciones branch & bound para distintos problemas
El problema de la mochila 0/1
El problema de la asignación
NOTA: Para cada problema, describiremos la forma de las soluciones (y su árbol asociado), el cálculo de las cotas y las estrategias de ramificación y poda.
159
Branch & Bound
El problema de la mochila 0/1 1. Representación de la solución
Mediante un árbol binario: binario: (s1, s2, ..., sn), con si ∈ {0, 1}. os e un no o s1,..., ,...,ssk : (s1,...,sk ,0) y (s1,...,sk ,1).
Mediante un árbol combinatorio: combinatorio: (s1, s2, ..., sn), donde m≤n y si ∈ {1, 2, ..., n}. Hijos de un nodo (s1,..., ,...,ssk ): (s1,...,sk ,sk +1), (s1,...,sk ,sk +2), …, (s1,..., ,...,ssk ,n ,n). ). 160
Branch & Bound
El problema de la mochila 0/1 2. Cálculo de las cotas
Cota inferior: Beneficio que se obtendría sólo con los objetos incluidos hasta ese nodo. Estimación del beneficio: A beneficio: A la solución actual, sumar el beneficio de incluir los objetos enteros que quepan, utilizando un algoritmo greedy (p.ej. en orden decreciente de b /p i i). Cota superior: Valor superior: Valor obtenido resolviendo el problema de la mochila continuo a partir de ese nodo (un algoritmo greedy que proporciona una cota 161 superior válida para el problema de la mochila 0/1).
Branch & Bound
El problema de la mochila 0/1 3. Estrategia de ramificación y poda Estrategia de poda (problema de maximización): Variable de poda C: Valor de la mayor cota inferior o solución final del roblema encontrada hasta ahora. Condición de poda: Podar el nodo i si CS(i) ≤ C C..
Estrategia de ramificación: Puesto que disponemos de una estimación del beneficio, usamos una estrategia MB (exploramos primero las ramas con mayor beneficio esperado). ¿MB--FIFO ó MB ¿MB MB--LIFO? Si usásemos MBMB-LIFO, en caso 162 de empate, seguiríamos por la rama más profunda.
Branch & Bound
El problema del viajante de comercio Encontrar un recorrido de longitud mínima para una persona que tiene que visitar varias ciudades y volver al punto de partida, conocida la distancia existente entre cada dos c u a es. En términos formales: Dado un grafo dirigido con arcos de longitud no negativa, se trata de encontrar un circuito hamiltoniano de longitud mínima (un circuito de longitud mínima que comience y termine en el mismo vértice y pase exactamente una vez por cada uno de los vértices restantes). 165
Branch & Bound
El problema del viajante de comercio 1. Representación del espacio de soluciones: Árbol de permutaciones restringido al grafo G
Grafo G(V,E), con D i la distancia asociada a la arista i
∈
E.
Candidatos:
C = { (1,X,1) | X es una permutación de (2,3,…,n) }, |C| = (n(n-1)!
Soluciones factibles:
E = { (1,X,1) | X = (x1,x2,…,xn-1) es una permutación de (2,3,…,n) tal que (i j,i j+1)∈E, 0