Escolar Documentos
Profissional Documentos
Cultura Documentos
Recursin y Backtracking
En su forma bsica, la idea de Backtracking se asemeja a un recorrido en profundidad dentro de un grafo
dirigido. El grafo en cuestin suele ser un rbol, o por lo menos no contiene ciclos. Sea cual sea su
estructura, existe slo implcitamente. El objetivo del recorrido es encontrar soluciones para algn
problema. Esto se consigue construyendo soluciones parciales a medida que progresa el recorrido; estas
soluciones parciales limitan las regiones en las que se puede encontrar una solucin completa. El
recorrido tiene xito si, procediendo de esta forma, se puede definir por completo una solucin. En este
caso el algoritmo puede, o bien detenerse (si lo nico que se necesita es una solucin del problema) o
bien seguir buscando soluciones alternativas (si deseamos examinarlas todas). Por otra parte, el
recorrido no tiene xito si en alguna etapa la solucin parcial construida hasta el momento no se puede
completar. En tal caso, el recorrido vuelve atrs exactamente igual que en un recorrido en profundidad,
eliminando sobre la marcha los elementos que se hubieran aadido en cada fase. Cuando vuelve a un
nodo que tiene uno o ms vecinos sin explorar, prosigue el recorrido de una solucin.
Descripcin de la Tcnica
Normalmente, se suele implementar este tipo de algoritmos como un procedimiento recursivo. As, en
cada llamada al procedimiento se toma una variable y se le asignan todos los valores posibles, llamando
a su vez al procedimiento para cada uno de los nuevos estados. La diferencia con la bsqueda en
profundidad es que se suelen disear funciones de cota, de forma que no se generen algunos estados si
no van a conducir a ninguna solucin, o a una solucin peor de la que ya se tiene. De esta forma se
ahorra espacio en memoria y tiempo de ejecucin.
Esto es,
1. Buscar una representacin del tipo (X1, X2, . . . , Xn) para las soluciones del problema
2. Identificar las restricciones implcitas y explcitas del problema
3. Establecer la organizacin del rbol que define los diferentes estados en los que se encuentra una
(sub)solucin
4. Definir una funcin solucin para determinar si una tupla es solucin
5. Definir una funcin de poda Bk (X1, X2, . . . , Xk ) para eliminar ramas del rbol que puedan derivar
en soluciones poco deseables o indeseadas
Implementacin
2. En segundo lugar, slo hay que poner los tres casos en la siguiente estructura (pseudo cdigo):
// Rechazar
if reject case = true:
return false
// Aceptar la solucion
if accept case = true:
print output_list # Our solution
return true
// Paso navegar sobre las posibles soluciones
for each (n in input_list):
test = Backtracking(input_list.remove(n), outputlist.push(n))
if test = true:
return true
// No hay soluciones
return false
}
// Llamada Inicial
call Backtracking({some_input}, {})
Elementos de Programacin y Estructuras de Datos
Lic. Helder Octavio Fernandez Guzman
Ejemplo 1:
Considerando una lista de nmeros: {3, 4,1}, queremos ordenarlos usando Backtracking.
Aceptar se han tomado todos los valores de entrada! (= se han ordenado todos los nmeros)
Ejecutar el algoritmo:
Recoger 1 lista original {}, {3,4,1} de salida - Rechazar! sin ms opciones, ir hacia atrs
Recoger 1 lista original {4}, {3,1} de salida - Rechazar! sin ms opciones, ir hacia atrs
Recoger 3 lista original {1}, {4,3} de salida - Rechazar! intentar la siguiente opcin
Recoger 1 lista original {3}, {4,1} de salida - Rechazar! sin ms opciones, ir hacia atrs
Recoger 4 lista original {}, {1,3,4} de salida - Aceptar! Esta es nuestra solucin!