Está en la página 1de 34

Bsqueda

MOTIVACI ON Y TERMINOLOGIA
Cuando un agente inteligente act ua en el mundo se ve enfrentado a una
multiplicidad de alternativas, dentro de las cuales debe elegir.
La elecci on que se realice depender a de las consecuencias de la elecci on.
Un aspecto esencial de los problemas que se enfrentan en Inteligencia Arti-
cial es el de b usqueda de soluciones.
Los problemas de b usqueda est an siembre relacionados con problemas de
representaci on. Es necesario tener lenguajes de representaci on para expre-
sar lo que estamos buscando, como evoluciona el mundo, etc.
Jorge Baier Aranda, PUC 162
El Problema de los Misioneros y Canbales
Usaremos el problema de los Misioneros y Canbales para mostrar qu e ele-
mentos necesitaremos en un problema de b usqueda.
En este conocido problema hay tres canbales, tres misioneros, un ro y un bote. Los
canbales, los misioneros y el bote se encuentran en una rivera del ro. Los seis sujetos
deben cruzar el ro, pero el bote permite trasladar a lo m as a dos personas a la vez.
Se debe encontrar una secuencia de movimientos de personas en el bote que permita
cruzar a los seis individuos de manera segura. No se debe permitir que hayan m as
canbales que misioneros en algun lado del ro alg un momento.
Otros problema cl asicos de b usqueda son:
El coloreo de un mapa con cuatro colores.
Planicaci on de tareas (scheduling).
Problemas de planicaci on de rutas (vendedor viajero).
Navegaci on de robots.
Encontrar una estrategia para elegir la pr oxima jugada en un juego con
adversarios.
Jorge Baier Aranda, PUC 163
Terminologa
Para analizar los problemas de b usqueda usaremos la siguiente termino-
loga:
Estado: Dado un problema, un estado es una conguraci on del dominio
asociado al problema que se est a analizando.
Por ejemplo, en el caso de los misioneros y canbales, un estado est a dado
por la posici on de los misioneros, de los canbales y del bote.
c omo es un estado para el problema de coloreo de mapas?
El estado del problema lo representaremos con un functor
estado(Ci,Mi,Cd,Md,B)
donde los argumentos corresponden a:
Ci: Canbales en la rivera izquierda.
Mi: Misioneros en la rivera izquierda.
Cd: Canbales en la rivera derecha.
Md: Misioneros en la rivera derecha.
B: Indica en qu e lado del ro se encuentra el bote. Los valores posibles
ser an izq y der.
Jorge Baier Aranda, PUC 164
Estado Inicial: Dado un problema de b usqueda, existe uno o m as estados
que se toman como de partida.
En nuestro ejemplo, el estado inicial se representa por estado(3,3,0,0,izq).
Descripci on de Estados Objetivos: Para un problema de b usqueda pue-
den haber varios estados que representen una soluci on al problema de
b usqueda.
Estos estados son descritos mediante la denici on de un predicado o fun-
ci on que, dado un estado, retorna verdadero si el estado es un estado
objetivo y falso en otro caso.
Jorge Baier Aranda, PUC 165
En el ejemplo, podemos utilizar la funci on final/1 para identicar estados
nales. As:
final(estado(0,0,3,3,der)).
Establece que el estado nal es uno en el cual todos los misioneros y
canbales est an al lado derecho del ro.
Soluci on Optima: En muchos casos se necesita encontrar un estado opti-
mo. Es decir, que sea un estado objetivo, pero que adem as sea mejor, en
alg un sentido, que todas los estados objetivos alternativos. En este caso,
el problema de b usqueda corresponde a un problema de optimizaci on.
Operador: Un operador es una funci on que, dado un estado, entrega otro
estado. Por ejemplo, en el caso de los misioneros y de los canbales, pode-
mos denir el operador de cruce resulta/3 que recibe un estado y genera
un estado sucesor .
Jorge Baier Aranda, PUC 166
El predicado resulta(E,A,Er) cuando Er es el estado que se genera al
ejecutar la acci on A sobre el estado E.
Podemos escribir este predicado de la siguiente manera:
resulta(E1,cruzar(C,M),E2):-
posible(cruzar(C,M),E1),
E1 = estado(Ci,Mi,Cd,Md,izq),
Cip is Ci-C,
Mip is Mi-M,
Cdp is Cd+C,
Mdp is Md+M,
E2 = estado(Cip,Mip,Cdp,Mdp,der).
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).
Jorge Baier Aranda, PUC 167
Donde posible/2 se dene de la siguiente manera:
posible(cruzar(C,M),estado(Ci,Mi,_,_,izq)):-
C=<Ci, M=<Mi.
posible(cruzar(C,M),estado(_,_,Cd,Md,der)):-
C=<Cd, M=<Md.
Sucesor Inmediato: Dado un estado s y un operador, el estado s

que se
obtiene al aplicar el operador al estado s se le llama sucesor inmediato de
s. Tambi en se dice que el estado s

es generado por el operador a partir


del estado s.
En nuestro ejemplo, podemos encontrar los sucesores de un estado utili-
zando los siguientes predicados:
sucesor(E1,E2) :- accion(A),
resulta(E1,A,E2),
seguro(E2).
accion(cruzar(C,M)):- (C=0 ; C=1 ; C=2),
(M=0 ; M=1 ; M=2),
C+M=<2, C+M>=1.
Jorge Baier Aranda, PUC 168
seguro(estado(Ci,Mi,Cd,Md,_)):- (Ci=<Mi; Mi=0),
(Cd=<Md; Md=0).
Espacio de B usqueda: El espacio de b usqueda est a formado por el o los
estados iniciales, junto con todos aquellos estados que se pueden obtener
de la aplicaci on de alguna secuencia de operadores a alg un estado inicial.
En nuestro ejemplo, podemos denir el predicado en espaciobusqueda/1
para denir el espacio de b usqueda de la siguiente manera:
en_espaciobusqueda(estado(3,3,0,0,izq)).
en_espaciobusqueda(E) :- en_espaciobusqueda(Ep),
sucesor(Ep,E).
As, es posible consultar por los estados en el espacio de b uqueda de la
siguiente manera:
?- en_espaciobusqueda(E).
E = estado(3, 3, 0, 0, izq) ;
E = estado(2, 3, 1, 0, der) ;
E = estado(2, 2, 1, 1, der)
Yes
Jorge Baier Aranda, PUC 169
Espacio de Bsqueda para el PMC
La siguiente gura muestra parcialmente el arbol de b usqueda que resulta
en el ejemplo de los misioneros y los canbales.
En el arbol, s olo se incluyen los estados que resultan de ejecutar acciones
que son posibles y que resultan en estados seguros.
3, 3, 0, 0, izq
2, 3, 1, 0, der
3, 3, 0, 0, izq 2, 3, 1, 0, izq 3, 3, 0, 0, izq
1, 3, 2, 0, der 2, 2, 1, 1, der
cruzar(2,0) cruzar(1,0)
cruzar(0,1) cruzar(1,1)
2, 3, 1, 0, izq
2, 2, 1, 1, der 1, 3, 2, 0, der 0, 3, 3, 0, der
cruzar(1,0) cruzar(2,0)
cruzar(1,1)
cruzar(1,0)
. . . . . .
. . .
cruzar(1,0)
cruzar(1,0)
Jorge Baier Aranda, PUC 170
Solucionando el Problema
Para este problema podemos redenir el predicado en espaciobusqueda de
manera de almacenar la secuencia de acciones que generan los estados del
espacio de b usqueda.
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).
As, en espaciobusqueda2(E,L) se satisface si E pertenece al espacio de
b usqueda y se llega a el mediante la ejecuci on de las acciones en L.
De esta manera,
?- en_espaciobusqueda2(E,L).
E = estado(3, 3, 0, 0, izq)
L = [] ;
Jorge Baier Aranda, PUC 171
E = estado(2, 3, 1, 0, der)
L = [cruzar(1, 0)] ;
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
Para encontrar una soluci on, podemos hacer la siguiente consulta:
?- 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)] ;
...
Jorge Baier Aranda, PUC 172
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(1, 0), cruzar(2, 0)]
Yes
Esto funciona en nuestro ejemplo particular, pero desearamos poder exten-
derlo a un caso m as general.
Jorge Baier Aranda, PUC 173
Un Algoritmo de Bsqueda Genrico
Para la presentaci on del algoritmo de b usqueda utilizaremos la siguiente
convenci on:
Estado: Es un tipo de datos, utilizado para representar los estados de un
problema de b usqueda.
lista estados: Es un tipo de datos que corresponde a una lista cuyos ele-
mentos son estados.
estados iniciales: Es una constante de tipo lista estados que contiene
los estados iniciales del problema de b usqueda.
es objetivo: Es una funci on que recibe como argumento un estado y retor-
na verdadero si y s olo si el estado que recibe es un estado objetivo. El
chequear un estado especco se conoce como explorar ese estado.
Jorge Baier Aranda, PUC 174
eliminar: Es una funci on que recibe una lista y un estado. Entrega como
resultado la misma lista a la cual se le ha eliminado el estado que recibe
como argumento.
mezclar: Es una funci on que recibe dos listas de estados; retorna como re-
sultado la lista que resulta de mezclar ambas listas.
sucesores: Es una funci on que recibe un estado s y retorna una lista con
los sucesores inmediatos de este. A la generaci on de los sucesores de s
se le llama expansi on del estado o del nodo s.
Jorge Baier Aranda, PUC 175
Por el momento, no deniremos la forma en que un estado es elegido por la
funci on elija estado. Tampoco deniremos c omo la funci on mezclar mez-
cla los estados de las listas que recibe como argumentos.
Funcion buscar(lista estados_iniciales,
boolean funcion es_objetivo,
lista_estados funcion mezclar(lista_estados,
lista_estados)
lista_estados funcion sucesores(lista_estados));
{
L = estados_iniciales;
Aux = elija_estado(L);
while (not es_objetivo(Aux)) {
L = mezclar(eliminar(Aux,L),sucesores(Aux));
Aux = elija_estado(L);
}
retornar(Aux);
}
Jorge Baier Aranda, PUC 176
El comportamiento de esta funci on de b usqueda depende fuertemente de la
forma en que se denan las funciones mezclar y elija estado.
Para ejemplicar este comportamiento, utilizaremos el espacio de b usqueda
ilustrado por el arbol de la siguiente gura:.
2
5 6 7
3 4
8 9 10 11 12
1
13
Figura 10: Un arbol de b usqueda
Supongamos que deseamos explorar este arbol de b usqueda utilizando el
algoritmo gen erico descrito anteriormente. Supongamos, adem as, que nues-
tra funci on objetivo retorna falso para todos los nodos, excepto para el nodo
con n umero 13.
Jorge Baier Aranda, PUC 177
A continuaci on estudiaremos las distintas formas de explorar este espacio
de b usqueda.
Jorge Baier Aranda, PUC 178
Bsqueda Genrica en Prolog
El algoritmo de b usqueda gen erica ser a planteado en PROLOG mediante la
denici on del predicado buscar/5. La invocaci on:
?- buscar(Frontera, Resultado, Objetivo, Mezclar, Sucesores).
es un predicado que recibe el nombre de otros predicados como argumento.
Los argumentos corresponden a:
Frontera: debe corresponder a la lista de estados que est an en la frontera
de b usqueda. En el primer llamado a buscar/5, esta lista deber a ser igual
a la lista de estados iniciales.
Resultado: al satisfacerse el predicado, esta variable unicar a con alg un
estado que satisfaga el objetivo de la b usqueda.
Objetivo: debe unicar con el nombre de un predicado unario, que se satis-
faga cuando su argumento sea un estado nal de la b usqueda.
Jorge Baier Aranda, PUC 179
Mezclar: debe unicar con el nombre de un predicado ternario. Los primeros
dos argumentos de este predicado deben ser listas de estados. El tercer
argumento debe ser una lista con una mezcla de los estados que apare-
cen en las dos primeras. Por ejemplo, el predicado puede ser append/3.
Sucesores: debe unicar con el nombre de un predicado binario. Su primer
argumento debe ser un estado, el segundo argumento es una lista con los
estados que son sucesores inmediatos del primer estado.
Jorge Baier Aranda, PUC 180
Las reglas para buscar/5 son:
buscar([Resultado|_], Resultado, Objetivo, _, _):-
X=..[Objetivo, Resultado],
call(X).
buscar([Estado|Frontera_inicial], Resultado,
Objetivo, Mezclar, Sucesores):-
X=.. [Sucesores, Estado, Suc_inmed],
call(X),
Y=.. [Mezclar, Frontera_inicial,
Suc_inmed, Nueva_frontera],
call(Y),
buscar(Nueva_frontera, Resultado,
Objetivo, Mezclar, Sucesores).
En los ejemplos siguientes, haremos uso del arbol de la gura 10, para ello,
deniremos:
obj(X):- write(X), write( - ), X=13.
suces(1,[2,3,4]).
suces(2,[5,6,7]).
suces(3,[8,9,10]).
suces(4,[11,12,13]).
Jorge Baier Aranda, PUC 181
suces(X,[]):- X>=5, X=<13.
Las deniciones anteriores permiten determinar qu e nodo es un nodo objeti-
vo (con la funci on obj/1), y qu e nodos son sucesores de un nodo dado (con
la funci on suces/2. En el predicado obj/1, se realizan escrituras con el n
de que PROLOG escriba la secuencia de nodos que explora.
Jorge Baier Aranda, PUC 182
Bsqueda en Profundidad
Para realizar una b usqueda en profundidad, se requiere que la funci on de
mezcla realice un append de la lista de nuevos sucesores del nodo que se
est a considerando, con la frontera inicial. Para ello, denimos la siguiente
funci on:
mezcla_dfs(Frontera_inicial,
Suc_inmed, Frontera_final):-
append(Suc_inmed,
Frontera_inicial,
Frontera_final).
De este modo, el resultado que se obtiene es el siguiente:
?- buscar([1],Res,obj,mezcla_dfs,suces).
1 - 2 - 5 - 6 - 7 - 3 - 8 - 9 - 10 - 4 - 11 - 12 - 13 -
Res = 13 ?
No
Jorge Baier Aranda, PUC 183
Donde aqu se observa que los nodos se buscan en el orden DFS, como era
de esperarse.
Jorge Baier Aranda, PUC 184
Bsqueda en Amplitud
Como vimos anteriormente, la b usqueda en amplitud o BFS resulta si uno
realiza la mezcla en la forma inversa a la realizada en DFS. As, podemos
denir:
mezcla_bfs(Frontera_inicial,
Suc_inmed, Frontera_final):-
append(Frontera_inicial,
Suc_inmed,
Frontera_final).
De este modo, el resultado que se obtiene es el siguiente:
?- 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 otese, que lo
mismo se obtiene si uno escribe:
Jorge Baier Aranda, PUC 185
?- buscar([1],Res,obj,append,suces).
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 -
Res = 13 ;
No
Jorge Baier Aranda, PUC 186
Mejoras al Algoritmo de Bsqueda Genrico
B USQUEDA GEN ERICA SIN REPETICI ON DE ESTADOS
Utilizaremos la siguiente terminologa:
Abiertos: Es una lista de estados que no han sido explorados.
Cerrados: Es una lista de estados que han sido explorados, pero que no
han sido exitosos (no satisfacen la funci on objetivo).
mezcla g: Es una funci on que recibe tres argumentos, la lista de estados
abiertos, la lista de estados cerrados y una lista de estados nuevos. Retor-
na como resultado una nueva lista con los estados abiertos y los estados
nuevos que no aparezcan la lista de cerrados.
El algoritmo buscar gen utiliza las listas de nodos (o estados) abiertos y
nodos cerrados.
Jorge Baier Aranda, PUC 187
Funcion buscar_gen(lista abiertos,
lista cerrados,
boolean funcion es_objetivo,
lista_estados funcion mezcla_g(lista_estados,
lista_estados)
lista_estados funcion sucesores(lista_estados));
{
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 usqueda gen erico elimina las deciencias que ocu-
rren cuando existen diversas formas de llegar a un mismo estado.
Jorge Baier Aranda, PUC 188
Versin Prolog
El nuevo algoritmo de b usqueda gen erica ser a planteado en PROLOG me-
diante la denici on del predicado buscar g/6. La invocaci on:
?- buscar_g(Abiertos, Cerrados, Resultado,
Objetivo, Mezclar_g, Sucesores).
La primera regla para buscar g/6 es:
buscar_g([R|Abiertos], Cerrados, Resultado,
Objetivo, Mezclar_g, Sucesores):-
member(R,Cerrados),
buscar_g(Abiertos, Cerrados, Resultado,
Objetivo, Mezclar_g, Sucesores).
Esta regla chequea si el primer nodo abierto ya ha sido explorado, en cuyo
caso, se ignora.
Jorge Baier Aranda, PUC 189
La segunda regla es:
buscar_g([Resultado|_], _, Resultado, Objetivo, _, _):-
X=..[Objetivo, Resultado],
call(X).
Es decir, si el primer elemento de la lista de estados abiertos es una soluci on,
entonces la b usqueda termina. En otro caso, debemos reemplazar el primer
elemento de esta lista por sus sucesores. Para esto, denimos la regla:
buscar_g([Estado|Otros_abiertos], Cerrados, Resultado,
Objetivo, Mezclar_g, Sucesores):-
write([Estado|Otros_abiertos]),
write(Cerrados),nl,
X=.. [Sucesores, Estado, Nuevos_sucesores],
call(X),
Nuevos_Cerrados = [Estado | Cerrados],
Y=.. [Mezclar_g, Otros_abiertos, Nuevos_Cerrados,
Nuevos_sucesores, Nuevos_Abiertos],
call(Y),
buscar_g(Nuevos_Abiertos, Nuevos_Cerrados,
Resultado, Objetivo,
Mezclar_g, Sucesores).
Jorge Baier Aranda, PUC 190
Bsqueda en Profundidad y en Amplitud
Para poder utilizar una b usqueda en profundidad, deniremos el predicado
mezcla dfs/4 como sigue:
mezcla_dfs(Abiertos, Cerrados,
Nuevos_estados, Nuevos_abiertos):-
menos(Nuevos_estados, Cerrados, N2),
append(N2,Abiertos,N3),
list_to_set(N3,Nuevos_abiertos).
Donde el predicado list to set/2 est a predenido en SWI-Prolog.
menos queda denido como:
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).
Jorge Baier Aranda, PUC 191
Por otra parte, para poder utilizar una b usqueda en amplitud, deniremos el
predicado mezcla bfs/4 como sigue:
mezcla_bfs(Abiertos, Cerrados,
Nuevos_estados, Nuevos_abiertos):-
menos(Nuevos_estados, Cerrados, N2),
append(Abiertos,N2,N3),
list_to_set(N3,Nuevos_abiertos).
Jorge Baier Aranda, PUC 192
Qu tanto mejoramos?
Veamos nuevamente el problema de los misioneros y los canbales.
En este esquema, es necesario denir una funci on objetivo y una funci on
sucesores, las que se denen de la siguiente manera:
final(estado(0,0,3,3,der)).
sucesores(E,L) :-
findall(Ep,sucesor(E,Ep),L).
Al hacer la siguiente consulta PROLOG:
time(buscar([estado(3,3,0,0,izq)],X,final,
mezcla_bfs,sucesores)).
Se obtiene la siguiente respuesta:
% 388,193,575 inferences in 2240.13 seconds (173291 Lips)
ERROR: Out of global stack
Jorge Baier Aranda, PUC 193
La ineciencia de nuestra respuesta se debe al gran tama no del espacio de
b usqueda, pero principalmente a la ineciencia del predicado append.
Si utilizamos nuestro antiguo en espaciobusqueda/1, el cual recorre el arbol
al estilo BFS, obtenemos lo siguiente...
?- time(en_espaciobusqueda(estado(0,0,3,3,der))).
% 5,718,368 inferences in 8.05 seconds (710356 Lips)
Yes
Utilizando una implementaci on eciente de listas, sera posible que buscar
tuviera una eciencia similar a en espaciobusqueda. Sin embargo, si usa-
mos b usqueda sin repetici on de estados:
?- 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)
Consideremos ahora una versi on modicada del problema de los misioneros
Jorge Baier Aranda, PUC 194
y canbales. En este problema hay 5 canbales y 5 misioneros. El objetivo es
el mismo: los canbales y misioneros deben cruzar el ro, pero ahora la balsa
tiene capacidad para 3 pasajeros.
En este caso, los resultados son a un m as abismantes:
?- 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)
Si usamos una representaci on eciente para listas, podramos obtener tiem-
pos a un mejores.
Jorge Baier Aranda, PUC 195

También podría gustarte