Introducción a la Inteligencia Artificial Curso 2010–2011 Tema 6: Búsqueda sin información Miguel A. Gutiérrez Naranjo Dpto. de Ciencias de la Computación e Inteligencia Artificial Universidad de Sevilla IIA 2010–11 Búsqueda sin información 1 Estrategias de búsqueda ⊲ Una estrategia se define por el orden de expansión de los nodos ⊲ Para cada estrategia, el tiempo y el espacio se mide por: b máximo factor de ramificación de la búsqueda (El factor de ramificación de un nodo es el número de sus sucesores). d profundidad de la solución de menor coste m máxima profundidad del espacio de estados (que puede ser infinita) IIA 2010–11 Búsqueda sin información 2 Estrategias de búsqueda ⊲ Podemos evaluar las estrategias por las siguientes caracterı́sticas: Completitud: Si existe solución, ¿siempre se encuentra? Complejidad en tiempo: Número de nodos generados o expandidos. Complejidad en espacio: Máximo número de nodos almacenados (en memoria) Optimalidad: ¿Encuentra siempre una solución de las de menor coste? IIA 2010–11 Búsqueda sin información 3 Estrategias de búsqueda ⊲ Podemos evaluar las estrategias por las siguientes caracterı́sticas: Completitud: Si existe solución, ¿siempre se encuentra? Complejidad en tiempo: Número de nodos generados o expandidos. Complejidad en espacio: Máximo número de nodos almacenados (en memoria) Optimalidad: ¿Encuentra siempre una solución de las de menor coste? IIA 2010–11 Búsqueda sin información 4 Estrategias de búsqueda ⊲ Podemos evaluar las estrategias por las siguientes caracterı́sticas: Completitud: Si existe solución, ¿siempre se encuentra? Complejidad en tiempo: Número de nodos generados o expandidos. Complejidad en espacio: Máximo número de nodos almacenados (en memoria) Optimalidad: ¿Encuentra siempre una solución de las de menor coste? IIA 2010–11 Búsqueda sin información 5 Estrategias de búsqueda ⊲ Podemos evaluar las estrategias por las siguientes caracterı́sticas: Completitud: Si existe solución, ¿siempre se encuentra? Complejidad en tiempo: Número de nodos generados o expandidos. Complejidad en espacio: Máximo número de nodos almacenados (en memoria) Optimalidad: ¿Encuentra siempre una solución de las de menor coste? IIA 2010–11 Búsqueda sin información 6 Estrategias de búsqueda ⊲ Podemos evaluar las estrategias por las siguientes caracterı́sticas: Completitud: Si existe solución, ¿siempre se encuentra? Complejidad en tiempo: Número de nodos generados o expandidos. Complejidad en espacio: Máximo número de nodos almacenados (en memoria) Optimalidad: ¿Encuentra siempre una solución de las de menor coste? IIA 2010–11 Búsqueda sin información 7 Búsqueda en anchura ⊲ Trata la frontera como una cola ⊲ Selecciona siempre el primer elemento que se añadió a la cola ⊲ Si la frontera es [p1,p2, ...pr ] Selecciona p1. Sus sucesores se añaden al final de la cola, después de pr . El siguiente nodo elegido es p2. IIA 2010–11 Búsqueda sin información 8 Búsqueda en anchura 1 2 3 4 8 9 10 6 11 7 12 13 14 16 ☞ 15 5 ☞ ☞ IIA 2010–11 Búsqueda sin información 9 Búsqueda en anchura ⊲ ⊲ ⊲ ⊲ Si el factor de ramificación de todos los nodos es finito, la búsqueda en anchura encuentra una solución (si existe). Además encuentra el camino con menos arcos. La complejidad en tiempo es exponencial en la longitud del camino: bn, con b el factor de ramificación y n la longitud del camino. La complejidad en espacio es también exponencial en la longitud del camino: bn. IIA 2010–11 Búsqueda sin información 10 Búsqueda en profundidad ⊲ La búsqueda en profundidad trata la frontera como una pila. ⊲ Siempre se selecciona el último elemento añadido a la frontera. ⊲ Si la frontera es [p1,p2, ...pr ] Selecciona p1. Sus sucesores se añaden al principio de la cola, antes de p2. p2 se selecciona cuando todos los sucesores de p1 hayan sido explorados. IIA 2010–11 Búsqueda sin información 11 Búsqueda en profundidad 1 2 3 4 6 12 7 8 9 14 15 16 10 11 ☞ 5 13 ☞ IIA 2010–11 Búsqueda sin información 12 Búsqueda en profundidad ⊲ ⊲ La búsqueda en profundidad no garantiza que se encuentre la solución si el árbol tiene ramas infinitas La complejidad en espacio es lineal en el tamaño del camno que se está explorando. IIA 2010–11 Búsqueda sin información 13 Implementación ⊲ ⊲ Sistema genérico de búsqueda: busqueda(M,S) se verifica si M es el sistema de búsqueda y S es la lista de nodos explorados busqueda(M,S):estado_inicial(E), busqueda(M,[E],S). ⊲ estado inicial(E) depende del problema, no del sistema de búsqueda. IIA 2010–11 Búsqueda sin información 14 Implementación busqueda(_,F,[N]) :write(’Frontera: ’), write(F), nl, selecciona(N,F,_), estado_final(N), nl, write(’Estado final encontrado: ’), write(N). busqueda(M,F,[N|P]) :selecciona(N,F,F1), sucesores(N,NN), nueva_frontera(M,NN,F1,F2), busqueda(M,F2,P). IIA 2010–11 Búsqueda sin información 15 Implementación ⊲ write(T) escribe en pantalla T. ⊲ nl ( new line) salta a la lı́nea siguiente. ⊲ selecciona(E,F,NF) se verifica si E es un elemento de la lista F y NF es la lista resultante después de eliminar E. Si tomamos el primer elemento lo definimos ası́: selecciona(N,[N|F],F). ⊲ estado final(E) depende del problema, no del sistema de búsqueda. IIA 2010–11 Búsqueda sin información 16 Implementación ⊲ sucesores(N,NN) devuelve la lista NN de sucesores de N. Esta lista de sucesores depende del problema, no del sistema de búsqueda. Lo podemos definir ası́: sucesores(N,NN):- findall(M,sucesor(N,M),NN). ⊲ ⊲ . . . donde findall(M,G,L) se verifica si L es la lista de todos los M que verifican la propiedad G. nueva frontera(M,NN,F1,F2) se verifica si F2 es la nueva frontera obtenida al añadirle a la frontera F1 los nuevos nodos NN según la estrategia de búsqueda M. IIA 2010–11 Búsqueda sin información 17 Implementación ⊲ ⊲ Por tanto, desde el punto de vista de la implementación, la búsqueda en anchra y búsqueda en profundidad sólo se diferencian en la definición de nueva frontera(M,NN,F1,F2) Para búsqueda en anchura: nueva_frontera(anchura,NN,F1,F2):- !, append(F1,NN,F2). ⊲ Para búsqueda en profundidad: nueva_frontera(profundidad,NN,F1,F2):- !, append(NN,F1,F2). IIA 2010–11 Búsqueda sin información 18 Ciclos ⊲ En los problemas de espacios de estados es probable que podamos volver a un estado a b ⊲ c ¿Qué ocurre en este caso con las estrategias de búsqueda en profundidad y en anchura? IIA 2010–11 Búsqueda sin información 19 Ciclos a Si hay ciclos, tenemos ramas infinitas c b La búsqueda en profundidad puede no encontrar soluciones a b c La búsqueda en anchura puede explorar varias veces el mismo nodo IIA 2010–11 Búsqueda sin información 20 Búsqueda con ciclos ⊲ ⊲ ⊲ . La idea básica es guardar el camino desde el nodo inicial al nodo considerado. De este modo podremos evitar los ciclos Al finalizar la búsqueda obtenemos el camino que nos lleva desde el nodo inicial al nodo final busca_camino(M,Camino):estado_inicial(E), busca_camino(M,[[E]],Camino). ⊲ busca camino(M,Camino) se verifica si M es una estrategia de búsqueda y Camino es una solución. IIA 2010–11 Búsqueda sin información 21 Búsqueda con ciclos busca_camino(_,F,C) :write(’Frontera: ’), write(F), nl, selecciona([N|Caux],F,_), estado_final(N), reverse([N|Caux],C), write(’Estado final encontrado: ’), write(N), nl, write(’Camino encontrado: ’), write(C). busca_camino(M,F,C) :selecciona(N,F,F1), sucesores_2(N,NN), nueva_frontera(M,NN,F1,F2), busca_camino(M,F2,C). IIA 2010–11 Búsqueda sin información 22 Búsqueda con ciclos ⊲ Auxliares: sucesores_2([N|C],M):findall([Nuevo_nodo,N|C], ((sucesor(N,Nuevo_nodo), not(member(Nuevo_nodo,[N|C])))), M). selecciona(N,[N|F],F). ⊲ diferencia(NN,F1,Nodos) se verifica si Nodos es la lista formada por los elementos de NN que no están en F1. diferencia([],_,[]). diferencia([X|L1],L2,L3):- member(X,L2), !, diferencia(L1,L2,L3). diferencia([X|L1],L2,[X|L3]):- diferencia(L1,L2,L3). IIA 2010–11 Búsqueda sin información 23 Búsqueda con ciclos ⊲ ⊲ Por tanto, desde el punto de vista de la implementación, la búsqueda en anchra y búsqueda en profundidad con ciclos sólo se diferencian en la definición de nueva frontera(M,NN,F1,F2) Para búsqueda en anchura: nueva_frontera(anchura_con_ciclos,NN,F1,F2):!, diferencia(NN,F1,Nodos), append(F1,Nodos,F2). ⊲ Para búsqueda en profundidad: nueva_frontera(profundidad_con_ciclos,NN,F1,F2):!, diferencia(NN,F1,Nodos), append(Nodos,F1,F2). IIA 2010–11 Búsqueda sin información 24 Búsqueda con menor coste ⊲ ⊲ ⊲ ⊲ Si el coste de cada transición no es constante, a menudo nos interes encontrar soluciones que minimicen el coste total. Por ejemplo, los costes pueden ser distancias o recursos que queremos minimizar. Si todas las transiciones tienen el mismo coste, la búsqueda en anchura nos da una solución de coste mı́nimo. En la búsqueda de menor coste en lugar de expandir el camino con el menor número de pasos, expandimos el camino con menor coste. IIA 2010–11 Búsqueda sin información 25 Búsqueda con menor coste ⊲ La frontera está formada por pares de la forma C-[En,..., E1] donde [En,..., E1] es una lista de nodos con E1 el estado inicial y C es el coste del camino hasta En. busca_con_coste(M,Camino,Coste):estado_inicial(E), busca_con_coste(M,[0-[E]],Camino,Coste). IIA 2010–11 Búsqueda sin información 26 Búsqueda con menor coste busca_con_coste(_,F,C,Coste) :write(’Frontera: ’), write(F), nl, selecciona(Coste-[N|Caux],F,_), estado_final(N), reverse([N|Caux],C), write(’Estado final encontrado: ’), write(N), nl, write(’Camino encontrado: ’), write(C),nl, write(’Coste: ’), write(Coste). busca_con_coste(M,F,C,Coste) :selecciona(N,F,F1), sucesores_3(N,NN), nueva_frontera(M,NN,F1,F2), busca_con_coste(M,F2,C,Coste). IIA 2010–11 Búsqueda sin información 27 Búsqueda con menor coste ⊲ Auxliares % sucesor(Origen,Destino,Coste) sucesores_3(Coste1-[N|C],M):findall(Coste-[Nuevo_nodo,N|C], ((sucesor(N,Nuevo_nodo,CNN), not(member(Nuevo_nodo,[N|C])), Coste is Coste1 + CNN)), M). selecciona(N,[N|F],F). IIA 2010–11 Búsqueda sin información 28 Búsqueda con menor coste ⊲ En este caso ordenamos la nueva frontera por coste: nueva_frontera(menor_coste,NN,F1,F3):!, append(NN,F1,F2), sort(F2,F3). ⊲ sort(L1,L2) se verifica si L2 es la lista formada a partir de L1 ordenando sus elementos y eliminando duplicados. IIA 2010–11 Búsqueda sin información 29 Bibiliografı́a ⊲ ⊲ ⊲ Bratko, I. Prolog, Programming for Artificial Intelligence, Third Edition, Addison Wesley 2001. Russell, S. y Norvig, P. Artificial Intelligence: A Modern Approach Prentice Hall International, 1995. Poole, D., Mackworth, A. y Goebel, R. Computational Intelligence A Logical Approach. Oxford University Press, New York, 1998. IIA 2010–11 Búsqueda sin información 30