Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Back Tracking 1193073889558994 4
Back Tracking 1193073889558994 4
Introduccin El problema de las ocho reinas El problema de la suma de subconjuntos Coloreado de grafos Ciclos hamiltonianos Atravesar un laberinto El problema de la mochila 0-1
t!
ti
i !1
n-tuplas candidatas para satisfacer Sol. Mtodo de fuerza bruta: examinar las t n-tuplas y seleccionar las que satisfacen Sol. Bsqueda con retroceso (backtracking, en ingls): formar cada tupla de manera progresiva, elemento a elemento, comprobando para cada elemento xi aadido a la tupla que (x1,,xi) puede conducir a una tupla completa satisfactoria.
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
En el ejemplo, con la 2 formulacin y para el problema de las cuatro reinas (en un tablero 4v4):
variable v:valor para todo v en Ci hacer X[k]:=v; si completable(X,k) entonces si Sol(X,k) entonces guardar(X,k) fsi; si k<n entonces BackTracking(k+1,X) fsi; fsi fpara
Ntese que el rbol no se construye explcitamente sino implcitamente mediante las llamadas recursivas del algoritmo de bsqueda. El algoritmo no hace llamadas recursivas cuando:
k = n+1, o cuando el nodo generado no es completable (PODA).
Backtracking : bsqueda primero en profundidad (DFS) en un rbol y con deteccin de soluciones parciales no completables (poda)
El algoritmo anterior halla todas las soluciones y adems stas pueden ser de longitud variable (< n+1).
Variantes:
Limitar el nmero de soluciones a una sola aadiendo un parmetro booleano de salida que indique si se ha encontrado una solucin. Forzar a que slo los nodos hoja puedan significar solucin (realizando la recursin slo si no se ha encontrado un nodo solucin): Resolver problemas de optimizacin: adems de la solucin actual en construccin hay que guardar la mejor solucin encontrada hasta el momento. Se mejora la eficiencia de la bsqueda si el predicado completable permiten eliminar los nodos de los que se sabe que no pueden llevar a una solucin mejor que la ahora disponible (poda; mtodos de ramificacin y acotacin).
Sobre la eficiencia:
Depende de: el nmero de nodos del rbol de bsqueda que se visitan: v(n) el trabajo realizado en cada nodo (normalmente un polinomio): p(n)
Coste de: Completable y Sol
Mejoras: Si se consigue que los predicados acotadores reduzcan mucho el nmero de nodos generados (aunque un buen predicado acotador precisa mucho tiempo de evaluacin; compromiso) Si lo reducen a un solo nodo generado (solucin voraz): O(p(n) v n) nodos a generar en total Normalmente: O(p(n) v 2n) O(p(n) v n!)
Problema:
Dados un conjunto W={w1,,wn} de n nmeros positivos y otro nmero positivo M, se trata de encontrar todos los subconjuntos de W cuya suma es M. Ejemplo: si W={11,13,24,7} y M=31, entonces la solucin es {11,13,7} y {24,7}.
t r y
eje
Implicitas:
i { j xi { x j
k
w xi
i!1
!M n
xi
xi 1 , 1 e i
Conclusin:
Pueden existir varias formas de formular un problema, con distintas representaciones de las soluciones (aunque siempre verificando stas un conjunto de restricciones explcitas e implcitas). En el problema que consideramos, ambas representaciones nos llevan a un espacio de estados que consta de 2n tuplas.
Arbol del espacio de soluciones (n=4) para la primera representacin (tuplas de tamao variable):
Un arco del nivel i al nivel i+1 representa un valor para xi. El espacio de soluciones est definido por todos los caminos desde la raz hasta cualquier hoja del rbol.
1
x1=1
2
x1=2
3
x1=4 x1=3
4 5
x2=2 x2=3 x =4 2
6 7 8
x2=3 x2=4
9 10
x2=4
11
x3=3
x3=4 x3=4
14
x3=4
15
12 13
x4=4
16
Arbol del espacio de soluciones (n=4) para la segunda representacin (tuplas de tamao fijo):
Los arcos del nivel i al nivel i+1 estn etiquetados con el valor de xi (1 0). Todos los caminos desde la raz a una hoja definen el espacio de soluciones (24 hojas que representan las 16 posibles 4-tuplas).
1
x1=1
2
x1=0
3
x2=1
18
x2=0
19
x2=1
4
x2=0
5
x3=1
26
x3=0
27
x3=1
20
x3=0
21
x3=1
12
x3=0
13
x3=1
6
x3=0
7
x4=1
30
x4=0 x4=1
17 14
x4=0 x4=1
15 10
x4=0 x4=1
11 8
x4=0
9
Estudiemos una solucin de bsqueda con retroceso basada en la segunda representacin (tuplas de tamao fijo).
El elemento x[i] del vector solucin toma el valor 1 0 dependiendo de si el nmero w[i] se incluye o no en la solucin. Funcin acotadora (completable): La tupla (x[1],x[k]) slo puede conducir a una solucin si:
-1 j 1 w[j]*x[j]; r=
w[j]
s+w[k]eM; s+ }
X[k]:=1; si s+w[k]=M entonces escribir(X[1..k]) sino si s+w[k]+w[k+1]eM entonces sumasub(s+w[k],k+1,r-w[k],X) fsi fsi si (s+r-w[k] u M) y (s+w[k+1] e M) entonces X[k]:=0; sumasub(s,k+1,r-w[k],X) fsi fin
1 w[i]uM
i =1w[i])
i =1 w[ i ]x[ i ]
i =k +1 w[ i ]
cada vez guardando esos valores en s y r. A esto se le llama MARCAJE. Coste: n con marcaje: O(2 )
0,1,73
x[1]=1
5,2,68
x[2]=1 x[2]=0
15,3,58
x[3]=1 x[3]=0
x[3]=1
27,4,46
15,4,46 15,5,33
x[5]=1
17,4,46
x[4]=1
5,4,46
x[4]=0
10,4,46 10,5,33
x[4]=0
5,5,33 20,6,18
x[5]=1
12,6,18
Coloreado de grafos
Problema de decisin:
Dados un grafo G y un nmero entero positivo m, es G m-coloreable? Es decir, se puede pintar con colores los nodos de G de modo que no haya dos vrtices adyacentes con el mismo color y se usen slo m colores?
Problema de optimizacin:
Dado un grafo G, cul es su nmero cromtico? Es decir, cul es el menor nmero m de colores con el que se puede colorear G?
Coloreado de grafos
Cada regin se modela con un nodo y si dos regiones son adyacentes sus correspondientes nodos se conectan con un arco. As se obtiene siempre un grafo plano (puede dibujarse en un plano sin cruzar sus arcos). El mapa de la figura requiere 4 colores. Desde hace muchos aos se saba que 5 colores eran suficientes para pintar cualquier mapa, pero no se haba encontrado ningn mapa que requiriera ms de 4. Recientemente, despus de varios cientos de aos, se ha demostrado que 4 colores siempre son suficientes.
Bsqueda con retroceso Pg. 21
Coloreado de grafos
x[1]=1
x[1]=2
x[1]=3
x[2]=3
x[3] =2
Coloreado de grafos
algoritmo m_col(ent k:entero; entsal X:vector[1..n]de nat)
{Se usa una variable global g de tipo grafo.}
si completable(X,k) entonces si k=n entonces escribir(X) sino m_col(k+1,X) fsi fsi fpara fin funcion Completable(entsal x:sol; ent k:entero) variables b:booleano; j:entero b:=verdad; j:=1; mientras (j<k) b hacer si g[k,j] y (x[k]=x[j]) entonces b:=falso sino j:=j+1 fsi fmientras retorna(b)
Ciclos hamiltonianos
No se conoce un algoritmo eficiente para resolver el problema. Ntese la relacin entre el problema del clculo de un hamiltoniano y el problema del viajante de comercio
Ciclos hamiltonianos
Ejemplos:
1 8 2 7 3 6 4 5
Hamiltoniano: 1-2-8-7-6-5-4-3-1
Ciclos hamiltonianos
k=1: x1 puede ser cualquiera de los n vrtices, pero para evitar escribir el mismo ciclo n veces obligamos que x1=1; 1<k<n: xk puede ser cualquier vrtice distinto de x1,,xk-1 y conectado por un arco con xk-1. k=n: xn slo puede ser el vrtice que queda sin visitar y debe estar conectado por sendos arcos con x1 y xn-1.
Ciclos hamiltonianos
Grafo: matriz de adyacencias (slo necesitaremos saber si un arco existe o no) solucin: vector de vrtices. algoritmo hamiltoniano(ent k:entero; entsal X:vector[1..n] de nat)
{Se usa una variable global g de tipo grafo.}
para v:=1..n hacer X[k]:=v; si completable(k,X) entonces si k=n entonces escribir(X) sino hamiltoniano(k+1,X) fsi fsi fpara funcion completable(ent k:entero; ent X:vector[1..n] de nat)
b:=g[X[k-1],X[k]];
para i:=1..k-1 mientras b hacer si X[i]=X[k] entonces b:=falso fsi fpara si k=n g[X[n],X[1]] entonces b:=falso fsi retorna b
x[1]:=1; hamiltoniano(2,x);
Bsqueda con retroceso Pg. 27
Atravesar un laberinto
Problema:
Nos encontramos en una entrada de un laberinto y debemos intentar atravesarlo.
Representacin: matriz de dimensin nvn de casillas marcadas como libre u ocupada por una pared. Es posible pasar de una casilla a otra movindose slamente en vertical u horizontal. Se debe ir de la casilla (1,1) a la casilla (n,n).
Atravesar un laberinto
Disearemos un algoritmo de bsqueda con retroceso de forma que se marcar en la misma matriz del laberinto un camino solucin (si existe). N MN M MN MN M MN N MN N N N MN M NM MN M MN M N NM M N MN M N N MN < < M < < < N< <
Si por un camino recorrido se llega a una casilla desde la que es imposible encontrar una solucin, hay que volver atrs y buscar otro camino.
Adems hay que marcar las casillas por donde ya se ha pasado para evitar meterse varias veces en el mismo callejn sin salida, dar vueltas alrededor de columnas
Atravesar un laberinto
Estructura de datos:
tipos casilla = (libre,pared,camino,imposible) laberinto = vector[1..n,1..n] de casilla
con retroceso:
funcion HayCamino(ent x,y:entero; entsal lab:laberinto) {Pre: Hemos encontrado un camino desde (1,1) hasta (x,y). Post: Devuelve cierto ssi se puede extender hasta (n,n)}
Atravesar un laberinto
funcion HayCamino(ent x,y:entero; entsal lab:laberinto) {devuelve cierto ssi existe camino} si (x<1)(x>n)(y<1)(y>n) lab[x,y]{libre entonces devuelve falso sino lab[x,y]:=camino; si (x=n)(y=n) entonces escribir(lab); devuelve cierto; sino b:= HayCamino(x+1,y,lab) HayCamino(x,y+1,lab) HayCamino(x-1,y,lab) HayCamino(x,y-1,lab); si b entonces lab[x,y]:= imposible; fsi devuelve b; fsi fsi fin
Recordar
Se tienen n objetos y una mochila. El objeto i tiene peso pi y la inclusin del objeto i en la mochila produce un beneficio bi. El objetivo es llenar la mochila, de capacidad C, de manera que se maximice el beneficio.
maximizar sujeto a
bi xi
1ei en
pi xi
1ei en
eC
x1=0
2
x1=1
17
x2=0
3
x2=1
10
x2=0
18
x2=1
25
x3=0
4
x3=1
7
x3=0
11
x3=1
14
x3=0
19
x3=1
22
x3=0
26
x3=1
29
x4=1 x4=0
21 23
x4=1 x4=0
24 27
x4=1 x4=0
28 30
x4=1
31
Formalmente:
Sea X[1..k-1] la asignacin en curso. Sea ben el beneficio de la mejor solucin que hemos encontrado en lo que llevamos de bsqueda (si aun no hemos encontrado ninguna ben=0) c(X,k) es el beneficio de la mejor solucin que se puede obtener extendiendo X[1..k-1] cota(X,k) es una cota superior de c(X,k). Es decir, cota(X,k) u c(X,k), para todo X[1..k-1] Si cota(X,k) e ben, entonces hacemos backtracking (podamos) cmo calcular cota(X,k) en el problema de la mochila? relajar el requisito de integridad en las decisiones que an no hemos hecho: xi{0,1}, kei en se sustituye por 0exi e1, keien aplicar el algoritmo voraz
principio si k>n or cap=0.0 entonces devuelve ben sino si peso[k]>cap entonces dev ben+cap/peso[k]*benef[k] sino dev cota(benef,peso,cap-peso[k], ben+benef[k],k+1) fsi fsi fin
algoritmo bsqueda(ent solAct:solucin; ent benAct,pesAct:real; ent k:entero; e/s sol:solucin; e/s ben:real) para v:=1 hasta 0 hacer solAct[k]:=v; benAct:=benAct+v*benef[k]; pesAct:=pesAct+v*peso[k]; si pesActecap ben<cota(benef,peso, cap-pesAct,benAct,k+1) entonces si k=n entonces si benAct>ben entonces sol:=solAct; ben:=benAct fsi sino bsqueda(solAct,benAct,pesAct, k+1,sol,ben) fsi fsi fpara fin
Mejora adicional:
encontrar una solucion factible (no necesariamente ptima) con un algoritmo voraz. Sea r su coste. Obviamente r es una cota inferior de la solucin del problema. Por lo tanto, podemos inicializar ben:=r
Ejemplo:
benef=(11,21,31,33,43,53,55,65) peso=(1,11,21,23,33,43,45,55) cap=110 n=8
164.88
1 1 12 32 1 33 63 0 1 11 0 0
155.11
157.44 159.76
1 56 96 1 0 89 162.44 139 1 0
1 35 65 0 1 68 108 0 157.55 0 0
160.22
1 66 106 0 1 109 159 1161.63 0 0 101 151 0
154.88 157.11
164.66
0
99 149 0
159.79
0
159.33 157.63
163.81
0 0
158
0
162
160.18
ben=159 sol=(1,1,1,0,1,1,0,0)
para todo v en Ci hacer X[k]:=v; si (completable(X,k) c(X,k)<MS) entonces si Sol(X,k) entonces MejorSol:= X; MS:= Coste(X) fsi; si k<n entonces BackTracking(k+1,X) fsi; fsi fpara
Arboles dinmicos:
Hasta ahora hemos considerado rboles de bsqueda estticos: siguiendo cualquier rama nos encontrbamos las variables en el mismo orden. recorriendo un nivel de izquierda a derecha nos encontrbamos los valores en el mismo orden Arboles dinmicos: ordenes variables
Eliminacin de simetras:
En muchos problemas reales existen simetras que hacen que varias soluciones sean esencialmente la misma (via rotaciones, proyecciones,...) Encontrar la misma solucin varias veces es ineficiente Solucin: aadir nuevas restricciones que prohiban soluciones repetidas
Vamos a desarrollar un backtracking para las nreinas que introduzca estas mejoras:
X: vector[1..n] de nat x[i]=0, la columna i, aun no tiene reina asignada x[i]= j (j<>0), la reina de la columna i esta situada en la fila j tipo dominios es vector[1..n] de lista de nat Si L es una variable de tipo dominios, L[i] es la lista de los valores posibles para la variable x[i] Inicialmente: L[i]={1,2,...,n} para i=2..n L[1]={1,2,...,n/2} (para eliminar simetras)
N- reinas
algoritmo n-reinas(ent k:entero; ent L:dominios; entsal X:vector[1..n]de nat) {k: numero de variables asignadas, X: asignacin actual L: valores compatibles con la asignacin actual} L2:=L i:=Seleccionar_Variable(X,L); {seleccin arbitraria} para v L[i] hacer {orden arbitrario}
X[i]:=v;
si anticipacin(X,i,v,L2) entonces si k=n entonces escribir(X) sino n-reinas(k+1,L2,X) fsi fsi L2:=L; fpara X[i]:=0; fin
N- reinas
funcion anticipacion(ent X:sol; ent i,v:entero; entsal L2:dominios) variables b:booleano; j:entero b:=cierto; j:=1; mientras (j<n+1) b hacer si X[j]=0 entonces para uL[j] hacer si u=v |i-j|=|u-v| entonces borrar(L[j],v) fpara b:=falso sino j:=j+1 fsi fmientras retorna(b)
Para n-reinas:
seleccionar la variable a la que le queden menos valores asignar los valores en orden aleatorio