Documente Academic
Documente Profesional
Documente Cultură
resulta(E1,cruzar(C,M),E2):-
posible(cruzar(C,M),E1),
E1 = estado(Ci,Mi,Cd,Md,der),
Cip is Ci+C,
Mip is Mi+M,
Cdp is Cd-C,
Mdp is Md-M,
E2 = estado(Cip,Mip,Cdp,Mdp,izq).
Yes
h3, 3, 0, 0, izqi
en_espaciobusqueda2(estado(3,3,0,0,izq),[]).
en_espaciobusqueda2(E,L) :-
en_espaciobusqueda2(Ep,Lp),
accion(A),
resulta(Ep,A,E),
seguro(E),
append(Lp,[A],L).
?- en_espaciobusqueda2(E,L).
E = estado(3, 3, 0, 0, izq)
L = [] ;
E = estado(2, 2, 1, 1, der)
L = [cruzar(1, 1)] ;
E = estado(1, 3, 2, 0, der)
L = [cruzar(2, 0)] ;
E = estado(3, 3, 0, 0, izq)
L = [cruzar(1, 0), cruzar(1, 0)]
Yes
?- en_espaciobusqueda2(E,L),final(E).
E = estado(0, 0, 3, 3, der)
L = [cruzar(1, 1), cruzar(0, 1), cruzar(2, 0), cruzar(1, 0),
cruzar(0, 2), cruzar(1, 1), cruzar(0, 2), cruzar(1, 0),
cruzar(2, 0), cruzar(0, 1), cruzar(1, 1)] ;
...
Yes
lista estados: Es un tipo de datos que corresponde a una lista cuyos ele-
mentos son estados.
mezclar: Es una función que recibe dos listas de estados; retorna como re-
sultado la lista que resulta de mezclar ambas listas.
sucesores: Es una función que recibe un estado s y retorna una lista con
los sucesores inmediatos de éste. A la generación de los sucesores de s
se le llama expansión del estado o del nodo s.
Aux = elija_estado(L);
while (not es_objetivo(Aux)) {
L = mezclar(eliminar(Aux,L),sucesores(Aux));
Aux = elija_estado(L);
}
retornar(Aux);
}
2 3 4
5 6 7 8 9 10 11 12 13
En los ejemplos siguientes, haremos uso del árbol de la figura 10, para ello,
definiremos:
mezcla_dfs(Frontera_inicial,
Suc_inmed, Frontera_final):-
append(Suc_inmed,
Frontera_inicial,
Frontera_final).
?- buscar([1],Res,obj,mezcla_dfs,suces).
1 - 2 - 5 - 6 - 7 - 3 - 8 - 9 - 10 - 4 - 11 - 12 - 13 -
Res = 13 ?
No
mezcla_bfs(Frontera_inicial,
Suc_inmed, Frontera_final):-
append(Frontera_inicial,
Suc_inmed,
Frontera_final).
?- buscar([1],Res,obj,mezcla_bfs,suces).
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 -
Res = 13 ;
No
Aquı́ se observa que los nodos se buscan en el orden BFS . Nótese, que lo
mismo se obtiene si uno escribe:
No
Cerrados: Es una lista de estados que han sido explorados, pero que no
han sido exitosos (no satisfacen la función objetivo).
Aux = car(abiertos);
while (not es_objetivo(Aux)) {
if not member(Aux,cerrados) {
cerrados = cons(Aux,cerrados);
abiertos = mezcla_g(cdr(abiertos),
cerrados,sucesores(Aux));
}
Aux = car(abiertos);
retornar(Aux);
}
Este nuevo algoritmo de búsqueda genérico elimina las deficiencias que ocu-
rren cuando existen diversas formas de llegar a un mismo estado.
mezcla_dfs(Abiertos, Cerrados,
Nuevos_estados, Nuevos_abiertos):-
menos(Nuevos_estados, Cerrados, N2),
append(N2,Abiertos,N3),
list_to_set(N3,Nuevos_abiertos).
menos([],_,[]).
menos(N,[],N).
menos([L|Ls],N,[L|Lr]):- \+member(L,N),!,
menos(Ls,N,Lr).
menos([_|Ls],N,Lr):- menos(Ls,N,Lr).
mezcla_bfs(Abiertos, Cerrados,
Nuevos_estados, Nuevos_abiertos):-
menos(Nuevos_estados, Cerrados, N2),
append(Abiertos,N2,N3),
list_to_set(N3,Nuevos_abiertos).
final(estado(0,0,3,3,der)).
sucesores(E,L) :-
findall(Ep,sucesor(E,Ep),L).
time(buscar([estado(3,3,0,0,izq)],X,final,
mezcla_bfs,sucesores)).
?- time(en_espaciobusqueda(estado(0,0,3,3,der))).
% 5,718,368 inferences in 8.05 seconds (710356 Lips)
Yes
?- time(buscar_g([estado(3,3,0,0,izq)],[],X,final,
mezcla_g_bfs,sucesores)).
% 2,846 inferences in 0.01 seconds (284600 Lips)
X = estado(0, 0, 3, 3, der)
?- time(en_espaciobusqueda(estado(0,0,5,5,der))).
% 65,545,149 inferences in 76.82 seconds (853230 Lips)
Yes
?- time(buscar_g([estado(5,5,0,0,izq)],[],X,final,
mezcla_g_bfs,sucesores)).
% 8,553 inferences in 0.01 seconds (855300 Lips)
X = estado(0, 0, 5, 5, der)