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…