Documentos de Académico
Documentos de Profesional
Documentos de Cultura
La bsqueda con retroceso, o backtracking, es una estrategia tentativa. El procedimiento lleva la cuenta de las reglas aplicadas. Si en el transcurso de la bsqueda se llega a un punto muerto, puede olvidar o "deshacer" la ltima regla aplicada y probar una nueva alternativa. Esto permite, en principio, explorar todos los caminos de un grafo a partir de un nodo inicial, siempre que sea finito y se compruebe la aparicin de ciclos.
El procedimiento RETROCESO recibe un estado inicial y devuelve: bien el camino de estados que lleva a un estado objetivo; o bien 'FRACASO' si no pudo encontrarse ningn camino solucin.
Aunque la idea de base es sencilla, pueden considerarse distintas implementaciones de la bsqueda con retroceso concretamente analizaremos dos versiones:
La primera, que denominaremos backtrack, es una versin recursiva en la que la secuencia de nodos examinados se guarda en los entornos de las sucesivas llamadas recursivas.
La segunda, que denominaremos retroceso, es una versin recursiva por la cola que manipula explcitamente una estructura de datos donde se guarda explcitamente el camino que se est examinando.
A) PROCEDIMIENTO BACKTRACK
El procedimiento BACKTRACK recibe un estado e intenta encontrar un camino solucin partiendo de l. Para ello genera un nico sucesor y realiza una llamada recursiva. Si esta fracasa, se genera otro sucesor y se vuelve a realizar una llamada recursiva. Si las llamadas correspondientes a todos los sucesores fracasan, entonces se termina devolviendo FRACASO. Si en algn momento se encuentra un estado final, se termina con xito, y la secuencia de retornos de las distintas llamadas construyen una lista con el camino solucin.
PROCEDIMIENTO BACKTRACK
backtrack(E)
Si finalp(E)
entonces devolver (cons(E, NIL)); en otro caso, Para cada regla R aplicable a E
E2 aplicar-regla(R,E);
SOLUCION backtrack(E2); Si SOLUCION <> FRACASO entonces devolver (cons(E,SOLUCION));
fin/para
devolver (FRACASO); fin backtrack;
B) PROCEDIMIENTO RETROCESO
El procedimiento RETROCESO realiza una exploracin similar a la de BACKTRACK. La diferencia est en la implementacin, que en el caso de RETROCESO responde a una funcin recursiva por la cola ms verstil, y que permite la comprobacin de ciclos. Para llevar la cuenta de los estados y reglas considerados, RETROCESO utiliza una lista de nodos. Cada nodo estar formado por dos elementos: un estado;
una lista de las reglas aplicables a dicho estado y que an no han sido probadas.
Supondremos definidas las operaciones: hacer-nodo(E, LR), que recibe un estado E y una lista de reglas LR y devuelve un nodo. estado(N), que recibe un nodo N y devuelve el estado asociado. lista-reglas (N), que recibe un nodo N y devuelve la lista de reglas asociada.
Tambin supondremos que NIL denota la lista vaca, y que estn definidas las operaciones sobre listas: aadir(X,L), que recibe un elemento X y una lista L, y devuelve una nueva lista cuyo primer elemento es X, y a continuacin todos los de la lista L, es decir, en notacin Prolog, la lista [X|L]. cabeza(L), que recibe una lista L y devuelve su primer elemento. resto(L), que recibe una lista L y devuelve una lista igual que L tras eliminar su primer elemento. vaco(L), que recibe una lista L y devuelve 'cierto' si L es la lista vaca, y 'falso' en otro caso.
PROCEDIMIENTO RETROCESO
retroceso(E0); LR N reglas-aplicables(E0); hacer-nodo(E0, LR);
PROCEDIMIENTO RTR
rtr(CAMINO);
NODO
E LR R
cabeza (CAMINO);
estado (NODO); lista-reglas (NODO); cabeza (LR); vaco (CAMINO) : es-objetivo (E): vaco (LR): otro-caso: devolver ('FRACASO'); devolver (CAMINO); devolver (rtr (resto (CAMINO))); LR2 resto (LR);
segn:
NODO2
Las cuatro condiciones de la estructura 'segn' corresponden al fracaso, xito, retroceso y avance respectivamente. Las dos primeras suponen la terminacin de la bsqueda, mientras que las restantes la continan.
Ntese que cuando se prueba una regla de un nodo, la lista de reglas correspondiente debe ser actualizada. Ntese tambin que 'rtr' es una funcin recursiva por la cola.
La funcin 'avanzar (E,R, CAM)' recibe un estado E, una regla R aplicable a E, y un camino CAM, y devuelve un camino igual que CAM, pero que adems tiene a la cabeza el estado resultante de aplicar R a E.
Segn la naturaleza del problema que se pretenda resolver puede realizarse o no la comprobacin de ciclos. Si los ciclos son imposibles, entonces comprobarlos es una prdida de tiempo. Si los ciclos son posibles, no comprobarlos puede ser nefasto. Veamos versiones para ambas posibilidades:
devolver (aadir (NODO, CAMINO)); AVANZAR(E,R,CAMINO) E2 aplicar (R, E); devolver(CAMINO); reglas-aplicables (E2); ;versin que s comprueba ciclos
donde la funcin 'repetido(E,CAMINO)' devuelve: 'cierto' si el estado de algn nodo del CAMINO es igual a E; o 'falso' en otro caso.
EJEMPLO:
Sea el grafo de la figura. El estado inicial es el etiquetado como E1, y el final el etiquetado como E4. Supongamos que las reglas se prueban siempre en el orden creciente (R1, R2, R3, R4, R5, R6). En este grafo (un rbol, en realidad) no se presentan ciclos, por lo que puede utilizarse sin peligro la primera versin de 'avanzar'.
E es E1
LR es (R1, R2, R3) R es R1 E1 (R1, R2, R3)
y donde: NODO es
E es E2
LR es ( ) R no toma valor E2 ( )
Como E4 es el estado final, la bsqueda termina con xito devolviendo el camino resultante.