Documentos de Académico
Documentos de Profesional
Documentos de Cultura
M OTIVACI ON
T ERMINOLOGI A
La eleccion
Un aspecto esencial de los problemas que se enfrentan en Inteligencia Artificial es el de busqueda
de soluciones.
162
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.
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
165
el problema de busqueda
corresponde a un problema de optimizacion.
166
167
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 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
169
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
...
cruzar(1,0)
cruzar(2,0)
h3, 3, 0, 0, izqi
...
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).
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
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
173
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.
174
de los sucesores de s
los sucesores inmediatos de este.
A la generacion
del estado o del nodo s.
se le llama expansion
175
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);
}
176
de busqueda
El comportamiento de esta funcion
depende fuertemente de la
10
11
12
13
177
178
El algoritmo de busqueda
generica
sera planteado en P ROLOG mediante la
definicion
?- buscar(Frontera, Resultado, Objetivo, Mezclar, Sucesores).
Objetivo: debe unificar con el nombre de un predicado unario, que se satisfaga cuando su argumento sea un estado final de la busqueda.
179
180
181
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.
182
Bsqueda en Profundidad
de
Para realizar una busqueda
en profundidad, se requiere que la funcion
funcion:
mezcla_dfs(Frontera_inicial,
Suc_inmed, Frontera_final):append(Suc_inmed,
Frontera_inicial,
Frontera_final).
183
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
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
B USQUEDA
G EN E RICA
SIN
R EPETICI ON
DE
E STADOS
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);
}
188
Versin Prolog
diante la definicion
?- buscar_g(Abiertos, Cerrados, Resultado,
Objetivo, Mezclar_g, Sucesores).
189
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
191
192
Qu tanto mejoramos?
Veamos nuevamente el problema de los misioneros y los canbales.
objetivo y una funcion
193
del espacio de
La ineficiencia de nuestra respuesta se debe al gran tamano
busqueda,
pero principalmente a la ineficiencia del predicado append.
?- 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)
194
195