métodos de búsqueda

 

Métodos de búsqueda.

Primero en anchura (breadthfirst).

Búsqueda primero en anchura

·         Principio: expandir el nodo menos profundo que no

haya sido expandido

·         La frontera es una cola FIFO, i.e. nuevos sucesores van al final

 

 

 

 

 

 

 

 

 

Algoritmo:

1.- Crear una lista con un solo elemento consistente en una

trayectoria o camino de longitud cero: el nodo raíz

2. Hasta que el primer camino de la lista llegue al nodo objetivo o se llegue a la lista vacía hacer

a. Extraer el primer camino de la lista

b. Expandir el nodo final de este camino a todos los vecinos del nodo terminal.

c. Eliminar los ciclos de los caminos expandidos.

d. Insertar estos nuevos caminos al Final de la lista.

3. FIN Hasta

4. Si se halla el nodo meta notifique el éxito, si no el fracaso

 

 

 

 

 

Si el conjunto open se maneja como una lista FIFO, es decir, como una cola, siempre se estará visitando primero los primeros estados en ser generados. El recorrido del espacio de estados se hace por niveles de profundidad.

 

procedure Búsqueda_en_amplitud {

   open ()[estado_inicial]

   closed () {}

   while (open no está vacía) {

     remover el primer estado X de la lista open

     if (X es un estado objetivo) return éxito

     else {

       generar el conjunto de sucesores del estado X

       agregar el estado X al conjunto closed

       eliminar sucesores que ya están en open o en closed

       agregar el resto de los sucesores al final de open

     }

   }

   return fracaso

 }

 

Si el factor de ramificación es B y la profundidad a la cual se encuentra el estado objetivo más cercano es n, este algoritmo tiene una complejidad en tiempo y espacio de O(Bn). Contrariamente a la búsqueda en profundidad, la búsqueda en amplitud garantiza encontrar el camino más corto.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Primero en profundidad (depthfirst).

 

·         Principio: expandir el nodo más profundo que no haya sido expandido

·         La frontera es una cola LIFO, i.e. nuevos sucesores van al inicio

 

 

 

 

 

 

 

 

 

 

 

Algoritmo:

1.-Crear una lista con un solo elemento consistente en una trayectoria de longitud cero: el nodo raíz

2. Hasta que el primer camino de la lista llegue al nodo objetivo o

se llegue a la lista vacía HACER

a. Extraer el primer camino de la lista

b. Expandir el nodo final de este camino.

c. Eliminar los ciclos de los caminos expandidos.

d. Insertar estos nuevos caminos al INICIO de la lista

FIN Hasta

1. Si la lista está vacía, entonces NO hay solución; Si no el primer

camino de la lista es la solución

 

 

 

 

Si el conjunto open se maneja como una lista LIFO, es decir, como un stack, siempre se estará visitando primero los últimos estados en ser generados. Esto significa que si A genera B y C, y B genera D, antes de visitar C se visita D, que está más alejado de la raiz A, o sea más profundo en el árbol de búsqueda. El algoritmo tiene en este caso la tendencia de profundizar la búsqueda en una rama antes de explorar ramas alternativas.

procedure Búsqueda_en_profundidad {

   open () [estado_inicial]

   closed () {}

   while (open no está vacía) {

     remover el primer estado X de la lista open

     if (X es un estado objetivo) return éxito

     else {

       generar el conjunto de sucesores del estado X

       agregar el estado X al conjunto closed

       eliminar sucesores que ya están en open o en closed

       agregar el resto de los sucesores al principio de open

     }

   }

   return fracaso

 }

Considerando que la cantidad promedio de sucesores de los nodos visitados es B (llamado en inglés el branching factor y en castellano el factor de ramificación), y suponiendo que la profundidad máxima alcanzada es n, este algoritmo tiene una complejidad en tiempo de O(Bn) y, si no se considera el conjunto closed, una complejidad en espacio de O(B × n). En vez de usar el conjunto closed, el control de ciclos se puede hacer descartando aquellos estados que aparecen en el camino generado hasta el momento (basta que cada estado generado tenga un puntero a su padre).

El mayor problema de este algoritmo es que puede "perderse" en una rama sin encontrar la solución. Además, si se encuentra una solución no se puede garantizar que sea el camino más corto.

 

 

bibliografía

 

 

http://inteligenciaartificial-isc.blogspot.com/p/unidad-2.html

 

https://www.uv.mx/personal/edbenitez/files/2010/09/CursoIA10-II-2.pdf

 

 

 

Comentarios

Entradas más populares de este blog

tipos de problemas que se resuelven con las técnicas de búsqueda

ejemplos de situaciones actuales de cada una de las áreas que comprenden la IA