400 likes | 787 Views
Ramificación y acotación (Branch and Bound). Introducción El problema del viajante de comercio El problema de la mochila 0-1 El juego del 15. Introducción: Branch and Bound. Al igual que los métodos de búsqueda con retroceso:
E N D
Ramificación y acotación(Branch and Bound) • Introducción • El problema del viajante de comercio • El problema de la mochila 0-1 • El juego del 15
Introducción: Branch and Bound • Al igual que los métodos de búsqueda con retroceso: • se aplica a problemas de optimización con restricciones (algunas veces también a probl. de decisión) • se genera el espacio de soluciones, organizándolo en un árbol. • Se podan subárboles inútiles. • Terminología: • Nodo vivo: nodo del espacio de soluciones del que no se han generado aún todos sus hijos. • Nodo muerto: nodo del que no se van a generar más hijos porque: • no hay más • no es completable, • no producirá una solución mejor que la solución en curso • Nodo en curso (o en expansión): nodo del que se están generando hijos
Introducción: (1) Ramificación… • Diferencia fundamental con el método de búsqueda con retroceso: • Búsqueda con retroceso: Tan pronto como se genera un nuevo hijo del nodo en curso, este hijo pasa a ser el nodo en curso. • Ramificación y acotación: Se generan todos los hijos del nodo en curso antes de que cualquier otro nodo vivo pase a ser el nuevo nodo en curso. • En consecuencia: • Búsqueda con retroceso: Los únicos nodos vivos son los que están en el camino de la raíz al nodo en curso. • Ramificación y acotación: Puede haber más nodos vivos. Se deben almacenar en una estructura de datos auxiliar: lista de nodos vivos.
Recordemos: Backtracking para problemas de optimización (minimización) algoritmo BackTracking(ent k:entero; entsal X:vector[1..n]de valor) {Pre: X[1..k-1] es completable, cota(X,k-1)<CosteMejorSol} para todo v en Cihacer X[k]:=v; si (completable(X,k) cota(X,k)<CosteMejorSol) entonces si Sol(X,k) entonces MejorSol:= X; CosteMejorSol:= Coste(X) fsi; si k<n entonces BackTracking(k+1,X) fsi; fsi fpara
Backtracking Iterativo tipo nodo es tupla X: vector[1..n]de valor k: [1..n+1] ftipo // X[1..k-1] es una asignación parcial algoritmo BackTracking() variable P es pila de nodo; CosteMejorSol:= pvacia(P); apilar(P,<X,1>) mientras vacia(P) hacer <X,k>:=cima(P); desapilar(P); para todo v en Cihacer X[k]:=v; si (completable(X,k) cota(X,k)<CosteMejorSol) entonces si Sol(X,k) entonces MejorSol:= X; CosteMejorSol:= Coste(X) fsi; si k<n entonces apila(P,<X,k+1>) fsi; fsi fpara fmientras devuelve (MejorSol, CosteMejorSol)
Introducción: • Diferentes estrategias de elegir el siguiente nodo del conjunto de nodos vivos Distintos órdenes de recorrido del árbol de soluciones • pila: recorr. en profundidad • cola: recorrido por niveles • cola con prioridades (Branch and Bound): selección del nodo vivo más prometedor. recorrido “extraño” La prioridad de un nodo se calcula de acuerdo con una función de estimación que mide cuánto de “prometedor” es un nodo.
Ramificación y poda tipo nodo es tupla X: vector[1..n]de valor k: [1..n+1] ftipo // X[1..k-1] es una asignación parcial algoritmo BranchAndBound() variable C es cola_prioritaria de nodo; CosteMejorSol:= cvacia(C); encolar(C,<X,1,pr(X,1)>) mientras vacia(C) hacer <X,k>:=primero(C); desencolar(C); para todo v en Cihacer X[k]:=v; si (completable(X,k) cota(X,k)<CosteMejorSol) entonces si Sol(X,k) entonces MejorSol:= X; CosteMejorSol:= Coste(X) fsi; si k<n entonces encola(C,<X,k+1,pr(X,k+1)>) fsi; fsi fpara fmientras devuelve (MejorSol, CosteMejorSol)
Ramificación y poda • La prioridad sirve para “guiar” la búsqueda y encontrar pronto una solución óptima. • Si prioridad(X,k) = “coste de la mejor extensión de X”, el algoritmo irá directo a la mejor solución • La cota sirve para descubrir pronto que es inútil continuar por el camino actual • Si, además, cota(X,k)= “coste de la mejor extensión de X”, podará el resto de ramas. • En general, conseguir prioridades y cotas perfectas es imposible. • Si prioridad(X,k) “coste de la mejor extensión de X”, el algoritmo irá casi directo a la mejor solución • Si cota(X,k) “coste de la mejor extensión de X”, el algoritmo podará casi todas las ramas • En general, el coste espacial y temporal del método es O(p(n) dn) • d=max{|Ci|} • p(n) es un polinomio
Ramificación y poda • Punto clave de los métodos de ramificación y acotación: Encontrar buenas funciones de prioridad y buenas cotas. • Habitualmente se usa la cota como prioridad del nodo (si la cota es buena, es una buena medida de lo prometedor que es el nodo). Si no decimos lo contrario, nosotros también lo haremos.
¡Estoy hasta las ’s de viajar ! El problema del viajante de comercio • Recordar: • Encontrar un recorrido de longitud mínima para un viajante que tiene que visitar varias ciudades y volver al punto de partida, conocida la distancia existente entre cada dos ciudades. • Es decir, dado un grafo dirigido con arcos de longitud no negativa, se trata de encontrar 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(circuito hamiltoniano).
El problema del viajante de comercio • Formalización: • Sean G=(V,A) un grafo orientado, V={1,2,…,n}, D[i,j] la longitud de (i,j)A, D[i,j]= si no existe el arco (i,j). • El circuito buscado empieza en el vértice 1. • Candidatos: E = { 1,X,1 | X es una permutación de (2,3,…,n) } |E| = (n-1)! • Soluciones factibles: E = { 1,X,1 | X = x1,x2,…,xn-1, es una permutación de (2,3,…,n) tal que (ij,ij+1)A, 0<j<n, (1, x1) A , (xn-1,1) A} • Funcion objetivo: F(X)=D[1,x1]+D[x1, x2] + D[x2, x3]+...+D[xn-2, xn-1]+ +D[xn,1]
1 x1=4 x1=2 x1=3 2 3 4 x2=3 x2=4 x2=2 x2=4 x2=2 x2=3 5 6 7 8 9 10 x3=4 x3=3 x3=3 x3=2 x3=4 x3=2 11 12 13 14 15 16 El problema del viajante de comercio • Representación del espacio de estados: • Caso de un grafo completo con |V| = 4. Cada hoja es una solución y representa el viaje definido por el camino desde la raíz hasta la hoja.
20 30 10 11 15 16 4 2 3 5 2 4 19 6 18 3 16 4 7 16 Ejemplo de matriz no reducida. El problema del viajante de comercio • Definición de una cota(X,k) muy sencilla: • Suma de aristas ya escogidas • cota(X,k)=D[1,X[1]]+ i=1..k-2D[X[i],X[i+1]] • Ejemplo: (n=5)
20 30 10 11 15 16 4 2 3 5 2 4 19 6 18 3 16 4 7 16 Ejemplo de matriz no reducida. El problema del viajante de comercio • Puede mejorarse usando la matriz de distancias reducida: • Una fila (columna) de la matriz de distancias se dice reducida si sus elementos son no negativos y contiene al menos un 0. • Una matriz de distancias se dice reducida si cada fila y columna es reducida. • Para cada k, 1<k<n, todo circuito hamiltoniano incluye exactamente un arco de la forma (k,-) y exactamente un arco de la forma (-,k). • Si se resta una constante t de cada elemento de una fila (columna) de la matriz de distancias, la longitud de todo hamiltoniano se reduce exactamente en t y un hamiltoniano de distancia mínima lo sigue siendo.
20 30 10 11 10 20 0 1 15 16 4 2 15 16 4 2 3 5 2 4 3 5 2 4 19 6 18 3 19 6 18 3 16 4 7 16 16 4 7 16 Reducción de la fila 1, t = 10. 20 30 10 11 10 17 0 1 15 16 4 2 12 11 2 0 3 5 2 4 0 3 0 2 19 6 18 3 15 3 12 0 16 4 7 16 11 0 0 12 El problema del viajante de comercio • Si se elige t como el mínimo de los elementos de la fila (columna) i-ésima y se resta t de todos los elementos de esa fila (columna), la fila resultante es reducida. • Repitiendo el proceso para filas y columnas, siempre se puede conseguir que la matriz de distancias sea reducida. La cantidad total L restada de filas y columnas es una cota inferior de la longitud de un hamiltoniano de longitud mínima Reducción de la matriz, L = 25.
El problema del viajante de comercio • Cálculo de la cota inferior para los nodos distintos de la raíz y de las hojas: • Sea A la matriz de distancias reducida para el nodo y. • Sea x un hijo de y que corresponda a incluir el arco (i,j) en el recorrido y que no sea hoja. • La matriz B reducida para x, y por tanto cota(x), se calcula de la siguiente forma: 1. Cambiar todos los elementos de la fila i y de la columna j de A por . • Esto evita el incluir más arcos que salgan de i o lleguen a j. 2. Cambiar el elemento (j,1) de A por • Esto evita considerar el arco (j,1). 3. B es la matriz que se obtiene al reducir todas las filas y columnas de la matriz resultante (excepto aquéllas formadas sólo por “”). • Si r es el valor total restado en el paso (3): cota(x)=cota(y) + D[i,j] + r
20 30 10 11 10 17 0 1 15 16 4 2 12 11 2 0 3 5 2 4 0 3 0 2 19 6 18 3 15 3 12 0 16 4 7 16 11 0 0 12 11 2 0 10 9 0 0 0 2 0 3 0 ˆ c 25 1 15 12 0 12 0 9 11 0 12 0 0 12 2 3 4 5 ˆ ˆ ˆ c 25+10 35 c 25+17+11 53 ˆ c 25+1+5 31 c 25 1 2 0 12 11 0 3 0 2 0 3 2 4 3 0 3 12 0 0 0 12 11 0 0 El problema del viajante de comercio • Ejemplo: Grafo original. Matriz reducida, L = 25. x1 = 2 x1 = 5 x1 = 3 x1 = 4
ˆ c 25 1 ˆ ˆ ˆ ˆ c 35 c 31 2 c 53 3 c 25 4 5 ˆ ˆ c 28 c 36 6 7 8 ˆ c 50 ˆ c 32 9 10 ˆ c 28 ˆ c 28 11 El problema del viajante de comercio UB = x1 = 2 x1 = 5 x1 = 3 x1 = 4 x2 = 5 x2 = 2 x2 = 3 x3 = 3 x3 = 5 x4 = 3 Es hoja (solución), se actualiza UB = 28. El siguiente nodo en curso sería el 5, pero cota(5)>UB luego el algoritmo termina y el hamiltoniano mínimo es 1,4,2,5,3,1.
El problema del viajante de comercio • Otras versiones, basadas en otra representación del espacio de estados: • G=(V,A), • |V|=n, |A|=a • A={(oi, di)}, oiV, di V • D[oi, di], distancia de la arista • Un hamiltoniano es un conjunto de n arcos. • Además, para cada vértice i, 0<i<n+1, debe haber en ese conjunto exactamente un arco de la forma (i,j) y uno de la forma (k,i). • Soluciones Factibles: {X=()| ixi{0,1}, xi =n,uV ((!i (xi =1 oi =u) (!j (xj =1 dj =u))} • Función Objetivo: F(X)= xi D[oi, di] • Arbol de búsqueda= árbol binario: • Un hijo izquierdo representa la inclusión de un determinado arco en el hamiltoniano mientras que su hermano derecho representa la exclusión de ese arco.
El problema del viajante de comercio • Si se elige, para empezar, el arco (i,j): • el subárbol izquierdo representa todos los recorridos que incluyen el arco (i,j), y • el subárbol derecho los recorridos que no lo incluyen; • si hay un recorrido óptimo incluido en el subárbol izquierdo, entonces sólo faltan por seleccionar n-1 arcos para encontrarlo, • mientras que si todos están en el derecho, hay que seleccionar todavía n arcos. • Ejercicio: pensar en como se calcula la cota de un nodo, dada la cota de su padre
ˆ c 25 1 20 30 10 11 15 16 4 2 ˆ ˆ c 25 c 36 2 3 3 5 2 4 19 6 18 3 ˆ ˆ c 28 c 36 4 5 16 4 7 16 ˆ ˆ c 28 6 7 c 37 ˆ c ( 3 ) 36 UB El problema del viajante de comercio • Por ejemplo, con el grafo de antes: Se llega al nodo 6. Se han elegido ya tres arcos: (3,1), (5,3), (1,4). Para los dos restantes, sólo queda ya una opción: (4,2) y (2,5). Así, se obtiene el recorrido: 5,3,1,4,2,5. Con distancia total: 28 (así, UB = 28) El siguiente nodo en curso es el 3, con y el algoritmo acaba. incluir (3,1) excluir (3,1) incluir (5,3) excluir (5,3) excluir (1,4) incluir (1,4)
maximizar b x i i 1 i n sujeto a p x C i i 1 i n con x 0 , 1 , b 0 , p 0 , 1 i n i i i El problema de la mochila 0-1 • Recordar el problema de la mochila… • Se tienen n objetos fraccionables y una mochila. • El objeto i tiene peso pi y beneficio bi. • El objetivo es llenar la mochila, de capacidad C, de manera que se maximice el beneficio. • ya vimos una cota que consistía en resolver el problema permitiendo fracciones en los objetos sobre los que aún no se ha decidido.
1 2 3 4 1 2 3 4 ? 5 6 7 8 5 6 7 8 9 10 11 12 9 10 11 12 13 15 14 13 14 15 Problema de Lloyd El objetivo Un primer ejemplo:El juego del 15 Samuel Loyd: El juego del 15 o “taken”. Problema publicado en un periódico de Nueva York en 1878 y por cuya solución se ofrecieron 1000 dólares. • El problema original: Decisión: encontrar una secuencia de movimientos que lleven al objetivo Optimización: encontrar la secuencia de movimientos más corta
1 1 2 3 4 5 6 8 9 10 7 11 13 14 15 12 2 1 2 4 1 2 3 4 1 2 3 4 1 2 3 4 4 5 3 5 6 3 8 5 6 8 5 6 7 8 5 6 8 9 10 7 11 9 10 7 11 9 10 11 9 10 7 11 13 14 15 12 13 14 15 12 13 14 15 12 13 14 15 12 7 8 9 10 6 12 13 15 11 14 1 2 4 1 2 4 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 3 4 1 2 3 4 1 2 3 4 5 6 3 8 5 6 3 8 5 6 8 4 5 6 8 11 5 6 7 8 5 6 7 8 5 6 7 8 5 2 6 8 5 10 6 8 5 6 8 9 10 7 11 9 10 7 11 9 10 7 11 9 10 7 9 10 11 9 10 15 11 9 10 11 9 10 7 11 9 7 11 9 10 7 11 13 14 15 12 13 14 15 12 13 14 15 12 13 14 15 12 13 14 15 12 13 14 12 13 14 15 12 13 14 15 12 13 14 15 12 13 14 15 12 16 19 22 23 1 2 4 8 1 2 3 1 2 3 4 1 2 3 4 5 6 3 5 6 8 4 5 6 7 5 6 7 8 9 10 7 11 9 10 7 11 9 10 11 8 9 10 11 12 13 14 15 12 13 14 15 12 13 14 15 12 13 14 15 18 21 20 objetivo 17 1 6 2 4 1 2 4 1 2 3 4 1 2 3 4 5 3 8 5 6 3 8 5 6 8 11 5 6 8 11 9 10 7 11 9 10 7 11 9 10 7 12 9 10 7 13 14 15 12 13 14 15 12 13 14 15 13 14 15 12 Un primer ejemplo:El juego del 15 • Configuración: permutación de (1,2,...,16) • Solución: secuencia de configuraciones que • empiezan en el estado inicial y acaban en el final. • De cada configuración se puede pasar a la siguiente. • No hay configuraciones repetidas
Un primer ejemplo:El juego del 15 • Problema muy difícil para backtracking • El árbol de búsqueda es potencialmente muy profundo (16! niveles), aunque puede haber soluciones muy cerca de la raíz. • Se puede resolver con branch and bound (aunque hay métodos mejores) • funciones de prioridad: • numero de fichas mal colocadas (puede engañar) • suma, para cada ficha, de la distancia a la posición donde le tocaría estar • ...