Está en la página 1de 34

Bsqueda

M OTIVACI ON
Y

T ERMINOLOGA I

Cuando un agente inteligente actua en el mundo se ve enfrentado a una multiplicidad de alternativas, dentro de las cuales debe elegir. La eleccion que se realice dependera de las consecuencias de la eleccion. Un aspecto esencial de los problemas que se enfrentan en Inteligencia Articial es el de busqueda de soluciones. Los problemas de busqueda estan siembre relacionados con problemas de representacion. Es necesario tener lenguajes de representacion para expresar 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 ele mentos 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 deben cruzar el ro, pero el bote permite trasladar a lo mas 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 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. Planicacion de tareas (scheduling). Problemas de planicacion de rutas (vendedor viajero). Navegacion de robots. 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: Estado: Dado un problema, un estado es una conguracion del dominio asociado al problema que se esta analizando. Por ejemplo, en el caso de los misioneros y canbales, un estado esta dado por la posicion de los misioneros, de los canbales y del bote. 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 seran izq y der.
Jorge Baier Aranda, PUC 164

Estado Inicial: Dado un problema de busqueda, existe uno o mas estados que se toman como de partida. En nuestro ejemplo, el estado inicial se representa por estado(3,3,0,0,izq). Descripcion de Estados Objetivos: Para un problema de busqueda pue den haber varios estados que representen una solucion al problema de busqueda. Estos estados son descritos mediante la denicion de un predicado o fun cion 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 funcion 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 estan al lado derecho del ro. Solucion Optima: En muchos casos se necesita encontrar un estado ptio mo. Es decir, que sea un estado objetivo, pero que ademas sea mejor, en algun sentido, que todas los estados objetivos alternativos. En este caso, el problema de busqueda corresponde a un problema de optimizacion. Operador: Un operador es una funcion 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 accion 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. Tambien 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 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 la aplicacion de alguna secuencia de operadores a algun estado inicial. En nuestro ejemplo, podemos denir el predicado en espaciobusqueda/1 para denir 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 gura muestra parcialmente el arbol de busqueda que resulta en el ejemplo de los misioneros y los canbales. En el arbol, solo se incluyen los estados que resultan de ejecutar acciones que son posibles y que resultan en estados seguros.
3, 3, 0, 0, izq
cruzar(1,0) cruzar(1,1) cruzar(2,0)

2, 3, 1, 0, der

2, 2, 1, 1, der

1, 3, 2, 0, der
cruzar(1,0)

cruzar(1,0)

cruzar(0,1)

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

2, 3, 1, 0, izq
cruzar(1,0) cruzar(2,0)

3, 3, 0, 0, izq
...

2, 3, 1, 0, izq

3, 3, 0, 0, izq 2, 2, 1, 1, der
...

1, 3, 2, 0, der ...

0, 3, 3, 0, der

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 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 busqueda y se llega a el mediante la ejecucion 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 solucion, 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 mas general.

Jorge Baier Aranda, PUC

173

Un Algoritmo de Bsqueda Genrico


Para la presentacion del algoritmo de busqueda 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. es objetivo: Es una funcion que recibe como argumento un estado y retor na verdadero si y solo 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 funcion 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 funcion que recibe dos listas de estados; retorna como resultado la lista que resulta de mezclar ambas listas. sucesores: Es una funcion que recibe un estado s y retorna una lista con los sucesores inmediatos de este. A la generacion de los sucesores de s se le llama expansion 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 funcion elija estado. Tampoco deniremos como la funcion mezclar mezcla los estados de las listas que recibe como argumentos. Funcin buscar(lista estados_iniciales, o boolean funcin es_objetivo, o lista_estados funcin mezclar(lista_estados, o lista_estados) lista_estados funcin sucesores(lista_estados)); o { 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 funcion de busqueda depende fuertemente de la forma en que se denan las funciones mezclar y elija estado. Para ejemplicar este comportamiento, utilizaremos el espacio de busqueda ilustrado por el arbol de la siguiente gura:.
1

10

11

12

13

Figura 10: Un arbol de busqueda Supongamos que deseamos explorar este arbol de busqueda utilizando el algoritmo generico descrito anteriormente. Supongamos, ademas, que nues tra funcion objetivo retorna falso para todos los nodos, excepto para el nodo con numero 13.
Jorge Baier Aranda, PUC 177

A continuacion estudiaremos las distintas formas de explorar este espacio de busqueda.

Jorge Baier Aranda, PUC

178

Bsqueda Genrica en Prolog


El algoritmo de busqueda generica sera planteado en P ROLOG mediante la denicion del predicado buscar/5. La invocacion:
?- 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 estan en la frontera 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 unicara con algun estado que satisfaga el objetivo de la busqueda. Objetivo: debe unicar con el nombre de un predicado unario, que se satisfaga cuando su argumento sea un estado nal de la busqueda.
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 aparecen 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 que nodo es un nodo objeti vo (con la funcion obj/1), y que nodos son sucesores de un nodo dado (con la funcion suces/2. En el predicado obj/1, se realizan escrituras con el n de que P ROLOG escriba la secuencia de nodos que explora.

Jorge Baier Aranda, PUC

182

Bsqueda en Profundidad
Para realizar una busqueda en profundidad, se requiere que la funcion de mezcla realice un append de la lista de nuevos sucesores del nodo que se esta considerando, con la frontera inicial. Para ello, denimos 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 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 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 han sido exitosos (no satisfacen la funcion objetivo). mezcla g: Es una funcion que recibe tres argumentos, la lista de estados 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

Funcin buscar_gen(lista abiertos, o lista cerrados, boolean funcin es_objetivo, o lista_estados funcin mezcla_g(lista_estados, o lista_estados) lista_estados funcin sucesores(lista_estados)); o { 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 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 busqueda generica sera planteado en P ROLOG me diante la denicion del predicado buscar g/6. La invocacion:
?- 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, 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 busqueda 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 esta 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 busqueda 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 funcion objetivo y una funcion 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 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

La ineciencia de nuestra respuesta se debe al gran tamano del espacio de busqueda, 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 implementacion eciente de listas, sera posible que buscar tuviera una eciencia similar a en espaciobusqueda. Sin embargo, si usa mos busqueda sin repeticion 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 version 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 aun mas 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 representacion eciente para listas, podramos obtener tiem pos aun mejores.

Jorge Baier Aranda, PUC

195

También podría gustarte