Ejemplos de Backtracking

Anuncio
Ejemplos de Backtracking
Andrés Becerra Sandoval
Backtracking
I
Técnica genérica de diseño de algoritmos de búsqueda
I Una solución
I Todas las soluciones
I La mejor solución!
Estrategia General
I
I
Representar las variables del problema en un arreglo
Denir los dominios de las variables del problema
I Pensar como recorrer dichos dominios iterativamente
I
I
Visualizar un árbol de búsqueda para un n pequeño
Plantear que es un arreglo k-prometedor
Permutaciones
I
I
I
A contendrá una permutación
A[i ] 6= A[j ] si i 6= j para todos los 1 ≤ i , j ≤ n
El dominio de cada variable es [1, n]
El arreglo
I Se puede recorrer en un ciclo for
I
k prometedor: el valor que ponga en A[k ] debe ser distinto a
todos los anteriores
k-prometedor
prometedor(A, k )
PRE: A ya es k-1 prometedor
for j ← 1 to k − 1
do if A[j ] = A[k ]
then return False
return True
Permutaciones
permutar(A, k , n)
if k = n
then if prometedor(A,k)
then print A
else return
else for j ← 1 to n
do if prometedor(A, k )
then A[k + 1] ← j
permutar(A, k + 1, n)
Permutaciones Iterativo
permutaciones(A,n)
k =1
while k > 0
do
A[k ] ← proximoElemento(A, k )
while not ultimaOpcion(A,k) and not prometedor(A,k)
do A[k ] ← proximoElemento(A, k )
if not ultimaOpcion(A,k,n)
then if k = n
then print A
else k ← k + 1
else
A[k ] ← primerElemento(A, k )
Vuelta atrás al nivel superior (Backtrack)
k ←k −1
Funciones
ultimaOpcion(A, k , n)
return A[k ] == n + 1
proximoElemento(A, k )
return A[k ] + 1
primerElemento(A, k )
return 0
Subconjuntos de un conjunto
I
I
I
El conjunto de partes de un conjunto tiene 2n elementos
Podemos buscarlos todos sistemáticamente si denimos una
codicación adecuada en un arreglo
¾Cual?
Codicación
I
I
I
A[i ] ∈ 0, 1
Si A[i ] = 0 el elemento i no está en el subconjunto que se está
armando
Si A[i ] = 1 el elemento i
armando
está en el subconjunto que se está
k-Prometedor
I
I
El valor que asigne a cada variable es 1 o 0.
O sea, todos son prometedores!.
k-Prometedor
prometedor(A, k )
return True
Subconjuntos
subconjuntos(A, k , n)
if k = n
then if prometedor(A,k)
then print A
else return
else for j ← 0 to 1
do if prometedor(A, k )
then A[k + 1] ← j
subconjuntos(A, k + 1, n)
Subconjuntos iterativo
permutaciones(A,n)
k =1
while k > 0
do
A[k ] ← proximoElemento(A, k )
while not ultimaOpcion(A,k) and not prometedor(A,k)
do A[k ] ← proximoElemento(A, k )
if not ultimaOpcion(A,k,n)
then if k = n
then print A
else k ← k + 1
else
A[k ] ← primerElemento(A, k )
Vuelta atrás al nivel superior (Backtrack)
k ←k −1
Subconjuntos iterativo
ultimaOpcion(A, k , n)
return A[k ] == 2
proximoElemento(A, k )
return A[k ] + 1
primerElemento(A, k )
return −1
Tareas
I
I
Hallar todas las rutas entre un par de nodos en un grafo
Obtener todas las formas de dar un cambio (devuelta) con
unas cantidades especicadas de monedas de cada
denominación.
Descargar