Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
162
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.
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.
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 .
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).
167
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.
168
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
169
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
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
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.
173
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.
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); }
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
178
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.
180
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
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.
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).
Donde aqu se observa que los nodos se buscan en el orden DFS, como era de esperarse.
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).
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
186
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.
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).
Esta regla chequea si el primer nodo abierto ya ha sido explorado, en cuyo caso, se ignora.
189
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
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).
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).
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).
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)
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.
195