lunes, 10 de febrero de 2014

"Método de ir hacia atrás" (Backtracking)






Los algoritmos de vuelta atrás o retroceso (backtracking en inglés) se basan en recorrer el espacio completo de las soluciones posibles al problema planteado. Esta técnica es la aplicación directa del método de búsqueda conocido como primero en profundidad. Típicamente, los algoritmos de vuelta atrás no realizan ningún tipo de optimización y recorren el árbol de soluciones completo. Sin embargo, es posible aplicarles una poda para no descender en aquellas ramas que, de antemano, se sabe que no conducen a una solución. Una mejora de los algoritmos de vuelta atrás son los algoritmos de Ramificación y poda.



Si bien este tipo de algoritmos son por lo general ineficientes, en ocasiones es el único camino posible. Además, pueden considerarse otros métodos algorítmicos, como los algoritmos voraces o la programación dinámica, como optimizaciones de este método.



El algoritmo básico de vuelta atrás es el siguiente: 

  1. Tomar una opción de entre las posibles 
  2. Para cada elección, considerar toda opción posible recursivamente
  3. Devolver la mejor solución encontrada.

Esta metodología es lo suficientemente genérica como para ser aplicada en la mayoría de problemas. Por el contrario, incluso teniendo cuidado en la implementación, es muy probable que un algoritmo de vuelta atrás sea de tiempo exponencial y no polinómico. Además, el análisis de estos algoritmos puede resultar bastante complejo.





Backtracking

Método General



  • El backtracking (método de retroceso ó vuelta atrás) es una técnica general de resolución de problemas, aplicable tanto a problemas de optimización, juegos y otros tipos. 
  • El backtracking realiza una búsqueda exhaustiva y sistemática en el espacio de soluciones. Por ello, suele resultar ineficiente. 
  • La solución de un problema de backtracking se puede expresar como una tupla (x1, x2, .... xn), satisfaciendo unas restricciones P(x1, x2, ..., xn) y tal vez optimizando una cierta función objetivo. 
  • En cada momento, el algoritmo se encontrará en un cierto nivel k, con una solución parcial (x1, ..., xk). Si se puede añadir un nuevo elemento a la solución xk+1, se genera y se avanza al nivel k+1. 
  • Si no, se prueban otros valores de xk. 
  • Si no existe ningún valor posible por probar, entonces se retrocede al nivel anterior k-1. 
  • Se sigue hasta que la solución parcial sea una solución completa del problema, o hasta que no queden más posibilidades. 
  • El resultado es equivalente a hacer un recorrido en profundidad en el árbol de soluciones. Sin embargo, este árbol es implícito, no se almacena en ningún lugar. 
  • Ejemplo. Dado un conjunto de números enteros {13, 11, 7}, encontrar si existe algún subconjunto cuya suma sea exactamente 20. 
  • Posibilidad 1) En cada nivel i decidir si el elemento i está o no en la solución. Representación de la solución: (x1, x2, x3), donde xi= (0, 1). 
  • Cada nodo representa un paso del algoritmo, una solución parcial en cada momento dado. El árbol indica un orden de ejecución (recorrido en profundidad) pero no se almacena en ningún lugar. 
  • Una solución es un nodo hoja con valor de suma 20. 
  • Posible mejora: En cada nodo llevamos el valor de la suma hasta ese punto. Si el valor es mayor que 20 retroceder al nivel anterior.



 Caracterización de los Problemas

  •  Se trata generalmente de problemas de optimización, con o sin restricciones. 
  • La solución es expresable en forma de secuencia de decisiones. 
  • Existe una función denominada factible que permite averiguar si una secuencia de decisiones, la solución en curso actual,  viola o no las restricciones.
  • Existe una función, denominada solución, que permite determinar si una secuencia de decisiones factible es solución al problema planteado.

Método de Resolución



Vuelta Atrás es un esquema que de forma sistemática y organizada, genera y recorre un espacio que contiene todas las posibles secuencias de decisiones.
 

Este espacio se denomina el espacio de búsqueda del problema, el espacio de soluciones.



Primera implicación: Si existe solución, seguro que la encuentra.





El Espacio De Búsqueda – EB



Dimensiones:



·             La altura del espacio: hay k decisiones que tomar para formar una solución.

·         La anchura del espacio: cada decisión tiene asociado un dominio formado por j valores distintos.



Topología:



Habitualmente el espacio de búsqueda es un árbol, aunque puede ser un grafo, como en el caso de los grafos de juego.



Terminología:

·        

                Todos los nodos que forman parte de cualquier camino que va desde la raíz del EB a cualquier nodo del EB representan una secuencia de decisiones.

                

                  Una secuencia de decisiones es factible si no viola las restricciones.



      Una secuencia de decisiones es prolongable si es posible añadir más decisiones a la secuencia y no prolongable en caso contrario.

 

·               Que una secuencia sea no prolongable equivale a que el último nodo de la secuencia es una hoja del EB.

·         Para muchos problemas se tiene que una solución es cualquier secuencia de decisiones factible y no prolongable Þ sólo cuando se está en una hoja se tiene una solución.

·          

       En otros casos el concepto de solución es más amplio y cualquier secuencia factible, prolongable o no prolongable, se considera solución.

·         La secuencia de decisiones factible formada por los nodos en el camino que va desde la raíz a v se denomina solución en curso, y v es el nodo en curso



Topología

             

             Habitualmente el espacio de búsqueda es un árbol, aunque puede ser un grafo, como en el caso de los grafos de juego.



           Es  por  ello que  asemeja a un recorrido en profundidad dentro de un grafo dirigido. El grafo en cuestión suele ser un árbol, o por lo menos no contiene ciclos. Sea cual sea su estructura, existe sólo implícitamente. El objetivo del recorrido es encontrar soluciones para algún 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 solución completa.



            El recorrido tiene éxito si, procediendo de esta forma, se puede definir por completo una solución. En este caso el algoritmo puede bien detenerse (si lo único que se necesita es una solución 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 solución parcial construida hasta el momento no se puede completar. 





Ejemplo  de  la topología  de la  Vuelta  Atrás

  



En tal caso, el recorrido vuelve atrás exactamente igual que en un recorrido en profundidad, eliminando sobre la marcha los elementos que se hubieran añadido en cada fase. Cuando vuelve a un nodo que tiene uno o más vecinos sin explorar, prosigue el recorrido de una solución.



 
Ejemplo de un Algoritmo de Blaktracking

  



proc Backtracking (↕X[1 . . . i ]: TSolución, ↑ok: B)
                        variables L: ListaComponentes
                        inicio
                           si EsSolución (X) entonces
                              ok   CIERTO
                           de lo contrario
                              ok   FALSO
                              L=Candidatos (X)
                              mientras ¬ok ^ ¬Vacía (L) hacer
                                 X[i + 1]   Cabeza (L); L   Resto (L)
                                 Backtracking (X, ok)
                              fin mientras
                            fin si
                        fin
 


Codigo Suministrado por  http://es.wikipedia.org

 
Video de Interes: