1. C R I S T I A N S A N C H E Z Q U I R O G A
J U A N S E B A S T I A N V E R N A Z A L O P E Z
Backtracking
2. Concepto
Es una estrategia para hallar soluciones a problemas
que satisfacen restricciones.
La idea de estos métodos se semeja a un recorrido en
profundidad dentro de un grafo dirigido.
El objetivo del recorrido es encontrar soluciones para
algún problema.
3. Creando soluciones
El fin del Backtracking es construir una solución a un problema
especifico.
Para esto->
De realizan soluciones parciales a medida que evoluciona el recorrido.
Las soluciones parciales limitan las regiones donde se puede encontrar
una solución completa.
El recorrido tendrá éxito si al proceder de esta forma encuentra una
solución. En esto el algoritmo puede detenerse o bien seguir buscando
soluciones alternativas.
4. Volviendo atras
El algoritmo se puede decir que no tuvo éxito si en
alguna etapa la solución parcial construida hasta el
momento no se puede completar.
En este punto el algoritmo vuelve atrás al igual que en
un recorrido de profundidad, eliminando sobre la
marcha los elementos que se hubieren añadido.
Al regresar a un nodo que tiene «vecinos» sin explorar
el algoritmo sigue el recorrido para encontrar una
solución.
5. Un enfoque
La técnica crea todas las posibles combinaciones de
elementos para obtener una solución. Su principal
virtud es que en la mayoría de las implementaciones se
puede evitar combinaciones, estableciendo funciones
de acotación reduciendo el tiempo de ejecución.
El backtracking esta muy relacionado con la búsqueda
combinatoria.
6. Diseño e implementación
La idea es encontrar la mejor combinación posible, por esto se
puede decir que es una búsqueda en profundidad, durante la
búsqueda:
Si se encuentra con una alternativa incorrecta la búsqueda
retrocede al punto anterior y toma la siguiente alternativa.
Cuando se terminan las posibilidades, se vuelve a la elección
anterior y se toma la siguiente opción. (hijo si se habla de un
árbol).
Si no hay mas alternativas la búsqueda falla. [se crea una
árbol implícito donde cada nodo es un estado de la solución].
Normalmente se implementa como un procedimiento
recursivo.
7. Generación de estados
Cuando se ha concebido el árbol de estados para un
problema, podemos resolver el problema generando
sistemáticamente sus estados , determinando cuáles de
éstos son estados solución y, finalmente, comprobando
qué estados solución son estados respuesta.
8. Generación de estados
Nodo vivo: Estado del problema que ya ha sido
generado pero del que aún no se han generado todos
sus hijos.
Nodo muerto: Estado del problema que ya ha sido
generado y, o bien se ha podado, o bien ya se han
generado todos sus descendientes.
E-nodo (nodo de expansión): Nodo vivo del que
actualmente se están generando sus descendientes.
9. Generación de estados
Para generar todos los estados de un problema, comenzamos
con un nodo raíz a partir del cual se generan otros nodos.
Al ir generando estados del problema, mantenemos una lista
de nodos vivos.
Se usan funciones de acotación para “matar” nodos vivos sin
tener que generar todos sus nodos hijos.
Existen distintas formas de generar los estados de un problema
(en función de cómo exploremos el árbol de estados).
Backtracking (en profundidad).
branch & bound (en anchura)
11. El laberinto
Un ejemplo que podemos tomar es el de encontrar la
salida en un laberinto.
¿Por qué podemos tomarlo como ejemplo?
Por que un laberinto puede comportarse como un
grafo, donde cada cruce puede ser un nodo donde
debemos tomar una decisión que conducen a otros
nodos.
12. Llegando a la meta con Backtracking
Si la posición actual está fuera del laberinto, devolver TRUE para
indicar que hemos encontrado una solución.
Si la posición actual está marcada, devolver FALSE para indicar que ya
habíamos estado aquí.
Marcar la posición actual.
Para cada una de las 4 direcciones posibles (N,S,E,O){
Si (en la dirección elegida no chocamos contra un muro) {
Moverse un paso en la dirección indicada
Intentar resolver el laberinto desde ahí recursivamente.
Si la llamada recursiva nos permite salir del laberinto,
devolver TRUE para indicar que ya hemos terminado.
}
}
Quitar la marca de la posición actual.
Devolver FALSE para indicar que ninguna de las 4 direcciones nos
permitió llegar a una solución desde la posición actual.