Backtracking

Anuncio
Backtracking
Algoritmos y Programación II
Idea
Existen muchos problemas que se plantean como la
búsqueda de una combinación de componentes o toma
de decisiones que satisfagan ciertas condiciones, para
llegar a la solución.
– Si tenemos N elementos y cada elemento puede ser configurado
de m maneras, nos encontramos con mN combinaciones a
probar hasta que encontremos una que nos satisfaga.
– Si mN es muy elevado, tenemos un problema.
Idea
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.
Backtracking (método de
retroceso ó vuelta atrás)
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.
Backtracking (método de
retroceso ó vuelta atrás)
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.
Backtracking (método de
retroceso ó vuelta atrás)
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.
Backtracking (método de
retroceso ó vuelta atrás)
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.
Backtracking (método de
retroceso ó vuelta atrás)
Ejemplo. Dado un conjunto de números enteros {4, 2, 1,
7}, encontrar si existe algún subconjunto cuya suma
sea exactamente 7.
Esquemas de Backtracking
Existen tres tipos de problemas a resolver utilizando la
técnica de Backtracking:
– Búsqueda de una solución
– Búsqueda de todas las soluciones
– Búsqueda de la solución óptima
Búsqueda de todas las soluciones
proc buscar_todas_las_soluciones (paso : T);
begin
inicializar_alternativas;
repeat
obtener_siguiente_alternativa;
if es_alternativa_válida then
almacenar_paso;
if es_solución then
procesar_solución
else
buscar_todas_las_soluciones (nuevo_paso)
endif;
borrar_paso
endif;
until no_más_alternativas;
end;
Preguntas…
Descargar