Está en la página 1de 34

Bsqueda

M OTIVACI ON

T ERMINOLOGI A

Cuando un agente inteligente actua


en el mundo se ve enfrentado a una
multiplicidad de alternativas, dentro de las cuales debe elegir.
que se realice dependera de las consecuencias de la eleccion.

La eleccion
Un aspecto esencial de los problemas que se enfrentan en Inteligencia Artificial es el de busqueda
de soluciones.

siembre relacionados con problemas de


Los problemas de busqueda
estan

Es necesario tener lenguajes de representacion


para exprerepresentacion.
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 que elementos necesitaremos en un problema de busqueda.

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
a dos personas a la vez.
deben cruzar el ro, pero el bote permite trasladar a lo mas
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 mas
canbales que misioneros en algun lado del ro algun
momento.

Otros problema clasicos


de busqueda
son:

El coloreo de un mapa con cuatro colores.


de tareas (scheduling).
Planificacion
de rutas (vendedor viajero).
Problemas de planificacion
de robots.
Navegacion

Encontrar una estrategia para elegir la proxima


jugada en un juego con
adversarios.

Jorge Baier Aranda, PUC

163

Terminologa
Para analizar los problemas de busqueda
usaremos la siguiente termino
loga:
del dominio
Estado: Dado un problema, un estado es una configuracion
asociado al problema que se esta analizando.
Por ejemplo, en el caso de los misioneros y canbales, un estado esta dado
de los misioneros, de los canbales y del bote.
por la posicion

como
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 que lado del ro se encuentra el bote. Los valores posibles
izq y der.
seran
Jorge Baier Aranda, PUC

164

estados
Estado Inicial: Dado un problema de busqueda,
existe uno o mas

que se toman como de partida.


En nuestro ejemplo, el estado inicial se representa por estado(3,3,0,0,izq).
de Estados Objetivos: Para un problema de busqueda
Descripcion
pue
al problema de
den haber varios estados que representen una solucion
busqueda.

de un predicado o funEstos estados son descritos mediante la definicion


que, dado un estado, retorna verdadero si el estado es un estado
cion
objetivo y falso en otro caso.

Jorge Baier Aranda, PUC

165

final/1 para identificar estados


En el ejemplo, podemos utilizar la funcion
finales. As:
final(estado(0,0,3,3,der)).

Establece que el estado final es uno en el cual todos los misioneros y


al lado derecho del ro.
canbales estan
Optima: En muchos casos se necesita encontrar un estado optiSolucion
sea mejor, en
mo. Es decir, que sea un estado objetivo, pero que ademas
algun
sentido, que todas los estados objetivos alternativos. En este caso,

el problema de busqueda
corresponde a un problema de optimizacion.

que, dado un estado, entrega otro


Operador: Un operador es una funcion
estado. Por ejemplo, en el caso de los misioneros y de los canbales, podemos definir 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


A sobre el estado E.
ejecutar la accion
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 define 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 s0 que se


obtiene al aplicar el operador al estado s se le llama sucesor inmediato de
se dice que el estado s0 es generado por el operador a partir
s. Tambien
del estado s.
En nuestro ejemplo, podemos encontrar los sucesores de un estado utilizando 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 Busqueda:

El espacio de busqueda
esta formado por el o los

estados iniciales, junto con todos aquellos estados que se pueden obtener
de alguna secuencia de operadores a algun
de la aplicacion
estado inicial.
En nuestro ejemplo, podemos definir el predicado en espaciobusqueda/1
para definir el espacio de busqueda
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 buqueda
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 figura muestra parcialmente el arbol


de busqueda
que resulta

en el ejemplo de los misioneros y los canbales.

se incluyen los estados que resultan de ejecutar acciones


En el arbol,
solo
que son posibles y que resultan en estados seguros.
h3, 3, 0, 0, izqi
cruzar(1,0)

h2, 3, 1, 0, deri

cruzar(2,0)

cruzar(1,1)

h2, 2, 1, 1, deri

h1, 3, 2, 0, deri
cruzar(1,0)

cruzar(0,1)

cruzar(1,0)

h2, 3, 1, 0, izqi

cruzar(1,1)
cruzar(1,0)

h3, 3, 0, 0, izqi

h2, 3, 1, 0, izqi
...

Jorge Baier Aranda, PUC

cruzar(1,0)

cruzar(2,0)

h3, 3, 0, 0, izqi
...

h2, 2, 1, 1, deri h1, 3, 2, 0, deri h0, 3, 3, 0, deri


...

170

Solucionando el Problema
Para este problema podemos redefinir el predicado en espaciobusqueda de
manera de almacenar la secuencia de acciones que generan los estados del
espacio de busqueda.

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


mediante la ejecucion
de las acciones en L.
busqueda
y se llega a el

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

podemos hacer la siguiente consulta:


Para encontrar una solucion,
?- 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 general.
derlo a un caso mas

Jorge Baier Aranda, PUC

173

Un Algoritmo de Bsqueda Genrico


del algoritmo de busqueda
Para la presentacion
utilizaremos la siguiente

convencion:
Estado: Es un tipo de datos, utilizado para representar los estados de un
problema de busqueda.

lista estados: Es un tipo de datos que corresponde a una lista cuyos elementos son estados.
estados iniciales: Es una constante de tipo lista estados que contiene
los estados iniciales del problema de busqueda.

que recibe como argumento un estado y retores objetivo: Es una funcion


si el estado que recibe es un estado objetivo. El
na verdadero si y solo
chequear un estado especfico se conoce como explorar ese estado.

Jorge Baier Aranda, PUC

174

que recibe una lista y un estado. Entrega como


eliminar: Es una funcion
resultado la misma lista a la cual se le ha eliminado el estado que recibe
como argumento.
que recibe dos listas de estados; retorna como remezclar: Es una funcion
sultado la lista que resulta de mezclar ambas listas.
que recibe un estado s y retorna una lista con
sucesores: Es una funcion

de los sucesores de s
los sucesores inmediatos de este.
A la generacion
del estado o del nodo s.
se le llama expansion

Jorge Baier Aranda, PUC

175

Por el momento, no definiremos la forma en que un estado es elegido por la


elija estado. Tampoco definiremos como

mezclar mezfuncion
la funcion
cla los estados de las listas que recibe como argumentos.
Funci
on buscar(lista estados_iniciales,
boolean funci
on es_objetivo,
lista_estados funci
on mezclar(lista_estados,
lista_estados)
lista_estados funci
on 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

de busqueda
El comportamiento de esta funcion
depende fuertemente de la

forma en que se definan las funciones mezclar y elija estado.


Para ejemplificar este comportamiento, utilizaremos el espacio de busqueda

ilustrado por el arbol


de la siguiente figura:.
1

10

11

12

13

Figura 10: Un arbol


de busqueda

Supongamos que deseamos explorar este arbol


de busqueda
utilizando el

que nuesalgoritmo generico


descrito anteriormente. Supongamos, ademas,
objetivo retorna falso para todos los nodos, excepto para el nodo
tra funcion
con numero
13.

Jorge Baier Aranda, PUC

177

estudiaremos las distintas formas de explorar este espacio


A continuacion
de busqueda.

Jorge Baier Aranda, PUC

178

Bsqueda Genrica en Prolog

El algoritmo de busqueda
generica
sera planteado en P ROLOG mediante la

del predicado buscar/5. La invocacion:

definicion
?- buscar(Frontera, Resultado, Objetivo, Mezclar, Sucesores).

es un predicado que recibe el nombre de otros predicados como argumento.


Los argumentos corresponden a:
en la frontera
Frontera: debe corresponder a la lista de estados que estan
de busqueda.
En el primer llamado a buscar/5, esta lista debera ser igual

a la lista de estados iniciales.


Resultado: al satisfacerse el predicado, esta variable unificara con algun

estado que satisfaga el objetivo de la busqueda.

Objetivo: debe unificar con el nombre de un predicado unario, que se satisfaga cuando su argumento sea un estado final de la busqueda.

Jorge Baier Aranda, PUC

179

Mezclar: debe unificar 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 aparecen en las dos primeras. Por ejemplo, el predicado puede ser append/3.
Sucesores: debe unificar 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 figura 10, para ello,
definiremos:
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 definiciones anteriores permiten determinar que nodo es un nodo objeti obj/1), y que nodos son sucesores de un nodo dado (con
vo (con la funcion
suces/2. En el predicado obj/1, se realizan escrituras con el fin
la funcion
de que P ROLOG escriba la secuencia de nodos que explora.

Jorge Baier Aranda, PUC

182

Bsqueda en Profundidad
de
Para realizar una busqueda
en profundidad, se requiere que la funcion

mezcla realice un append de la lista de nuevos sucesores del nodo que se


esta considerando, con la frontera inicial. Para ello, definimos la siguiente

funcion:
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 busqueda
en amplitud o BFS resulta si uno

realiza la mezcla en la forma inversa a la realizada en DFS. As, podemos


definir:
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


mismo se obtiene si uno escribe:
Jorge Baier Aranda, PUC

BFS .

Notese,
que lo

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
G EN E RICA

SIN

R EPETICI ON

DE

E STADOS

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
objetivo).
han sido exitosos (no satisfacen la funcion
que recibe tres argumentos, la lista de estados
mezcla g: Es una funcion
abiertos, la lista de estados cerrados y una lista de estados nuevos. Retorna 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

Funci
on buscar_gen(lista abiertos,
lista cerrados,
boolean funci
on es_objetivo,
lista_estados funci
on mezcla_g(lista_estados,
lista_estados)
lista_estados funci
on 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 busqueda


generico
elimina las deficiencias que ocu
rren cuando existen diversas formas de llegar a un mismo estado.

Jorge Baier Aranda, PUC

188

Versin Prolog

El nuevo algoritmo de busqueda


generica
sera planteado en P ROLOG me
del predicado buscar g/6. La invocacion:

diante la definicion
?- 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 solucion,


entonces la busqueda
termina. En otro caso, debemos reemplazar el primer

elemento de esta lista por sus sucesores. Para esto, definimos 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 busqueda
en profundidad, definiremos 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 esta predefinido en SWI-Prolog.


menos queda definido 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 busqueda


en amplitud, definiremos 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.
objetivo y una funcion

En este esquema, es necesario definir una funcion


sucesores, las que se definen 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 P ROLOG:


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

del espacio de
La ineficiencia de nuestra respuesta se debe al gran tamano
busqueda,
pero principalmente a la ineficiencia 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

eficiente de listas, sera posible que buscar


Utilizando una implementacion
tuviera una eficiencia similar a en espaciobusqueda. Sin embargo, si usa de estados:
mos busqueda
sin repeticion

?- 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)

modificada del problema de los misioneros


Consideremos ahora una version
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.
abismantes:
En este caso, los resultados son aun
mas
?- 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)

eficiente para listas, podramos obtener tiemSi usamos una representacion


pos aun
mejores.

Jorge Baier Aranda, PUC

195

También podría gustarte