Вы находитесь на странице: 1из 34

MOTIVACION´

Y TERMINOLOG´IA

Búsqueda

Cuando un agente inteligente actua´ en el mundo se ve enfrentado a una multiplicidad de alternativas, dentro de las cuales debe elegir.M OTIVACION ´ Y T ERMINOLOG ´ IA Búsqueda La eleccion´ que se realice dependera´ de

La eleccion´de alternativas, dentro de las cuales debe elegir. que se realice dependera´ de las consecuencias de

que se realice dependera´ de las consecuencias de la eleccion.´

Un aspecto esencial de los problemas que se enfrentan en Inteligencia Arti-realice dependera´ de las consecuencias de la eleccion.´ ficial es el de busqueda´ de soluciones. Los

ficial es el de busqueda´

de soluciones.

Los problemas de busqueda´Arti- ficial es el de busqueda´ de soluciones. estan´ siembre relacionados con problemas de para expre-

estan´

siembre relacionados con problemas de

para expre-

representacion.´

sar lo que estamos buscando, como evoluciona el mundo, etc.

Es necesario tener lenguajes de representacion´

Jorge Baier Aranda, PUC

162

El Problema de los Misioneros y Caníbales

Usaremos el problema de los Misioneros y Can´ıbales para mostrar que´ ele- mentos necesitaremos en un problema de busqueda.´El Problema de los Misioneros y Caníbales En este conocido problema hay tres can´ıbales, tres misioneros,

En este conocido problema hay tres can´ıbales, tres misioneros, un r´ıo y un bote. Los can´ıbales, los misioneros y el bote se encuentran en una rivera del r´ıo. Los seis sujetos deben cruzar el r´ıo, 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´ can´ıbales que misioneros en algun lado del r´ıo algun´ momento.

Otros problema clasicos´que misioneros en algun lado del r´ıo algun´ momento. de busqueda´ son: • El coloreo de

de busqueda´

son:

El coloreo de un mapa con cuatro colores.

Planificacion´ de tareas (scheduling).

Problemas de planificacion´ 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

Terminología Para analizar los problemas de busqueda´ log´ıa: Estado: Dado un problema, un estado es

Terminología

Para analizar los problemas de busqueda´ log´ıa:

Estado: Dado un problema, un estado es una configuracion´ asociado al problema que se esta´ analizando.

usaremos la siguiente termino-

del dominio

Por ejemplo, en el caso de los misioneros y can´ıbales, un estado esta´ dado por la posicion´ de los misioneros, de los can´ıbales 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: Can´ıbales en la rivera izquierda. Mi: Misioneros en la rivera izquierda. Cd: Can´ıbales en la rivera derecha. Md: Misioneros en la rivera derecha.

B: Indica en que´ lado del r´ıo se encuentra el bote. Los valores posibles

seran´

izq y der.

Jorge Baier Aranda, PUC

164

Estado Inicial: Dado un problema de busqueda,´ que se toman como de partida.

existe uno o mas´

estados

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 definicion´ 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´ finales. As´ı:

final(estado(0,0,3,3,der)).

Establece que el estado final es uno en el cual todos los misioneros y can´ıbales estan´ al lado derecho del r´ıo.

Optima: En muchos casos se necesita encontrar un estado ´opti-

mo. Es decir, que sea un estado objetivo, pero que ademas´

final/1 para identificar estados

Solucion´

sea mejor, en

algun´

el problema de busqueda´

sentido, que todas los estados objetivos alternativos. En este caso,

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 can´ıbales, pode- mos 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

ejecutar la accion´

Podemos escribir este predicado de la siguiente manera:

resulta(E1,cruzar(C,M),E2):-

A sobre el estado E.

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

Jorge Baier Aranda, PUC

C+M=<2,

C+M>=1.

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´

estado inicial.

En nuestro ejemplo, podemos definir el predicado en espaciobusqueda/1

de alguna secuencia de operadores a algun´

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´ siguiente manera:

de la

?-

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 Búsqueda para el PMC

La siguiente figura muestra parcialmente el arbol´ de busqueda´ que resulta en el ejemplo de los misioneros y los can´ıbales.Espacio de Búsqueda para el PMC En el arbol,´ solo´ se incluyen los estados que resultan

En el arbol,´resulta en el ejemplo de los misioneros y los can´ıbales. solo´ se incluyen los estados que

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)
3, 3, 0, 0, izq
cruzar(1,0)
cruzar(1,1)
cruzar(2,0)
2, 3, 1, 0, der cruzar(1,0) cruzar(0,1)
2, 3, 1, 0, der
cruzar(1,0)
cruzar(0,1)

3, 3, 0, 0, izq

Jorge Baier Aranda, PUC

2, 3, 1, 0, izq

.

.

.

2, 2, 1, 1, der

cruzar(1,1)

3, 3, 0, 0, izq

1, 3, 2, 0, der

cruzar(1,0)

2, 3, 1, 0, izq

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

cruzar(1,0)

cruzar(2,0)

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

.

.

.

.

.

.

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 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 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,

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

cruzar(2, 0), cruzar(1, 0), cruzar(2, 0)] Yes Esto funciona en nuestro ejemplo particular, pero

Yes

Esto funciona en nuestro ejemplo particular, pero desear´ıamos poder exten-

derlo a un caso mas´

general.

Jorge Baier Aranda, PUC

173

Un Algoritmo de Búsqueda Genérico

Un Algoritmo de Búsqueda Genérico Para la presentacion´ convencion:´ Estado: Es un tipo de datos, utilizado

Para la presentacion´ convencion:´

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

utilizaremos la siguiente

del algoritmo de busqueda´

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 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 espec´ıfico 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 re-

sultado 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 definiremos la forma en que un estado es elegido por la

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

mezclar mez-

cla los estados de las listas que recibe como argumentos.

funcion´

elija

estado. Tampoco definiremos como´

la funcion´

Funci´on

buscar(lista

boolean

funci´on

estados_iniciales,

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

El comportamiento de esta funcion´de busqueda´ depende fuertemente de la forma en que se definan las funciones mezclar y

de busqueda´

depende fuertemente de la

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

Para ejemplificar este comportamiento, utilizaremos el espacio de busqueda´en que se definan las funciones mezclar y elija estado . ilustrado por el arbol´ de

ilustrado por el arbol´

de la siguiente figura:.

1 3 4 2 5 6 7 8 9 10 11 12 13
1
3
4
2
5
6
7
8
9
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 . 13.

Jorge Baier Aranda, PUC

177

A continuacion´ de busqueda.´ Jorge Baier Aranda, PUC estudiaremos las distintas formas de explorar este

A continuacion´ de busqueda.´

Jorge Baier Aranda, PUC

estudiaremos las distintas formas de explorar este espacio

178

Búsqueda Genérica en Prolog

Búsqueda Genérica en Prolog El algoritmo de busqueda´ generica´ sera´ planteado en P ROLOG mediante la

El algoritmo de busqueda´

generica´

sera´ planteado en PROLOG mediante la

definicion´

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 unificara´ con algun´ estado que satisfaga el objetivo de la busqueda.´

Objetivo: debe unificar con el nombre de un predicado unario, que se satis- faga 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 apare- cen 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=

call(X).

[Objetivo,

Resultado],

buscar([Estado|Frontera_inicial],

Resultado,

_):-

 

Objetivo,

Mezclar,

Sucesores):-

X=

[Sucesores,

Estado,

Suc_inmed],

call(X),

 

Y=

[Mezclar,

Frontera_inicial,

call(X),   Y= [Mezclar, Frontera_inicial, Suc_inmed, call(Y), Nueva_frontera], buscar(Nueva_frontera,

Suc_inmed,

call(Y),

Nueva_frontera],

buscar(Nueva_frontera,

Resultado,

Objetivo,

Mezclar,

Sucesores).

En los ejemplos siguientes, haremos uso del arbol´ definiremos:

obj(X):-

suces(1,[2,3,4]).

suces(2,[5,6,7]).

suces(3,[8,9,10]).

suces(4,[11,12,13]).

write(X),

write(’

Jorge Baier Aranda, PUC

-

’),

X=13.

de la figura 10, para ello,

181

suces(X,[]):- X>=5, X=<13. Las definiciones anteriores permiten determinar que´ nodo es un nodo objeti- vo

suces(X,[]):-

X>=5,

X=<13.

Las definiciones 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 fin de que PROLOG escriba la secuencia de nodos que explora.

Jorge Baier Aranda, PUC

182

Búsqueda en Profundidad de mezcla realice un append de la lista de nuevos sucesores del

Búsqueda en Profundidad

de

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

Para realizar una busqueda´

en profundidad, se requiere que la 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

Donde aqu´ı se observa que los nodos se buscan en el orden DFS, como era de esperarse.

Jorge Baier Aranda, PUC

184

Búsqueda en Amplitud

Como vimos anteriormente, la busqueda´Búsqueda en Amplitud en amplitud o BFS resulta si uno realiza la mezcla en la forma

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:append(Frontera_inicial, Suc_inmed, Frontera_final). ?- buscar([1],Res,obj,mezcla_bfs,suces). 1 - 2 -

?-

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 . Notese,´ mismo se obtiene si uno escribe: BFS. Notese,´ mismo se obtiene si uno escribe:

Jorge Baier Aranda, PUC

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 Búsqueda Genérico

BUSQUEDA´

GENERICA´

SIN REPETICION´

DE ESTADOS

Utilizaremos la siguiente terminolog´ıa:B USQUEDA ´ G ENERICA ´ SIN R EPETICION ´ DE E STADOS Abiertos: Es una

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. 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. 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);

 
} Aux = car(abiertos);   retornar(Aux); } Este nuevo algoritmo de busqueda´

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

Versión Prolog

El nuevo algoritmo de busqueda´Versión Prolog generica´ sera´ planteado en P ROLOG me- diante la definicion´ del predicado buscar g/6

generica´

sera´ planteado en PROLOG me-

diante la definicion´

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],

Objetivo,

Cerrados,

Mezclar_g,

Resultado,

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.member(R,Cerrados), buscar_g(Abiertos, Cerrados, Resultado, Objetivo, Mezclar_g, Sucesores). Jorge Baier Aranda, PUC 189

Jorge Baier Aranda, PUC

189

La segunda regla es:

buscar_g([Resultado|_],

_,

Resultado,

Objetivo,

X=

call(X).

[Objetivo,

Resultado],

_,

_):-

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],

Mezclar_g,

Objetivo,

Cerrados,

Sucesores):-

Resultado,

write([Estado|Otros_abiertos]),

write(Cerrados),nl,

X=

call(X),

Nuevos_Cerrados

Y=

[Sucesores,

Estado,

Nuevos_sucesores],

|

Cerrados],

=

[Estado

[Mezclar_g,

Otros_abiertos,

Nuevos_Cerrados,

Nuevos_sucesores,

Nuevos_Abiertos],

call(Y),

buscar_g(Nuevos_Abiertos,

Nuevos_Cerrados,

Resultado,

Mezclar_g,

Objetivo,

Sucesores).

Jorge Baier Aranda, PUC

190

Búsqueda en Profundidad y en Amplitud

Para poder utilizar una busqueda´Búsqueda en Profundidad y en Amplitud mezcla dfs/4 como sigue: en profundidad, definiremos el predicado

mezcla

dfs/4 como sigue:

en profundidad, definiremos el predicado

mezcla_dfs(Abiertos,

Cerrados,

Nuevos_estados,

Nuevos_abiertos):-

menos(Nuevos_estados,

append(N2,Abiertos,N3),

list_to_set(N3,Nuevos_abiertos).

Cerrados,

N2),

Donde el predicado list to set/2 esta´ predefinido en SWI-Prolog. 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´ predicado mezcla bfs/4 como sigue: mezcla_bfs(Abiertos, Cerrados,

Por otra parte, para poder utilizar una busqueda´ predicado mezcla bfs/4 como sigue:

mezcla_bfs(Abiertos,

Cerrados,

Nuevos_estados,

Nuevos_abiertos):-

menos(Nuevos_estados,

append(Abiertos,N2,N3),

Cerrados,

en amplitud, definiremos el

N2),

list_to_set(N3,Nuevos_abiertos).

Jorge Baier Aranda, PUC

192

¿Qué tanto mejoramos?

Veamos nuevamente el problema de los misioneros y los can´ıbales.¿Qué tanto mejoramos? En este esquema, es necesario definir una funcion´ objetivo y una funcion´ sucesores

En este esquema, es necesario definir una funcion´ objetivo y una funcion´ sucesores , las que se definen de la siguiente manera: objetivo y 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 PROLOG : ROLOG:

time(buscar([estado(3,3,0,0,izq)],X,final,

mezcla_bfs,sucesores)).

Se obtiene la siguiente respuesta:

%

ERROR:

388,193,575

of

Out

Jorge Baier Aranda, PUC

inferences

global

in

stack

2240.13

seconds

(173291

Lips)

193

La ineficiencia de nuestra respuesta se debe al gran tamano˜del espacio de busqueda,´ pero principalmente a la ineficiencia del predicado append . Si utilizamos

del espacio de

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

?-

% 5,718,368

time(en_espaciobusqueda(estado(0,0,3,3,der))).

inferences

in

8.05

seconds

(710356

Lips)

Yes

Utilizando una implementacion´inferences in 8.05 seconds (710356 Lips) Yes eficiente de listas, ser´ıa posible que buscar tuviera

eficiente de listas, ser´ıa posible que buscar

tuviera una eficiencia 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´Lips) X = estado(0, 0, 3, 3, der) Jorge Baier Aranda, PUC modificada del problema de

Jorge Baier Aranda, PUC

modificada del problema de los misioneros

194

y can´ıbales. En este problema hay 5 can´ıbales y 5 misioneros. El objetivo es el mismo: los can´ıbales y misioneros deben cruzar el r´ıo, 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)

Lips) X = estado(0, 0, 5, 5, der) Si usamos una representacion´ pos aun´ mejores. Jorge

Si usamos una representacion´

pos aun´

mejores.

Jorge Baier Aranda, PUC

eficiente para listas, podr´ıamos obtener tiem-

195