Está en la página 1de 3

Elementos de Programacin y Estructuras de Datos

Lic. Helder Octavio Fernandez Guzman

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.

La tcnica Backtracking es un mtodo de bsqueda de soluciones exhaustiva sobre grafos dirigidos


acclicos, el cual se acelera mediante poda de ramas poco prometedoras.

Esto es,

1. Se representan todas las posibilidades en un rbol


2. Se resuelve buscando la solucin por el rbol (de una determinada manera)
3. Hay zonas que se evitan por no contener soluciones (poda)
4. La solucin del problema se representa en una n-tupla (X1, X2, . . . , Xn) (no llenando
necesariamente todas las componentes)
5. Cada Xi se escoge de un conjunto de candidatos
6. A cada n-tupla se le llama estado
7. Se trata de buscar estados solucin del problema

Las condiciones de parada son:

cuando se consiga un estado solucin


cuando se consigan todos los estados solucin
Elementos de Programacin y Estructuras de Datos
Lic. Helder Octavio Fernandez Guzman

Diseo del Algoritmo de Backtracking


Para disear un algoritmo con la tcnica Backtracking, debemos seguir los siguientes pasos:

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

Una manera de implementar un algoritmo de Backtracking, sera la siguiente.

1. En primer lugar, tenemos que definir tres casos:


a. Rechazamos: Estamos en el camino equivocado este camino no nos puede llevar a la
solucin.
b. Aceptamos: Encontramos una solucin para el problema.
c. Paso: Estamos en algn punto entre la A a la B, continuamos con el siguiente paso.

2. En segundo lugar, slo hay que poner los tres casos en la siguiente estructura (pseudo cdigo):

function Backtracking (input_list, output_list)


{

// 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.

Primero, nuestros casos:

Rechazar si al final de la salida nos encontramos con dos nmeros no ordenados.

Aceptar se han tomado todos los valores de entrada! (= se han ordenado todos los nmeros)

Continuar tomamos un valor de la entrada y lo ponemos en la salida

Ejecutar el algoritmo:

Primera llamada: lista original {3,4,1}, {} de salida

Recoger 3 lista original {4,1}, {3} de salida - Continuar

Recoger 4 lista original {1}, {3,4} de salida - Continuar

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 4 lista original {3,1}, {4} de salida - Continuar

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 1 lista original {3,4}, la salida {1} - Continuar

Recoger 3 lista original {4}, la salida {1,3} - Continuar

Recoger 4 lista original {}, {1,3,4} de salida - Aceptar! Esta es nuestra solucin!