Algoritmos de búsqueda en grafos

Algoritmos de búsqueda en grafos

Los algoritmos de búsqueda en grafos nacen por la necesidad de crear un mecanismo de navegación autónoma, bien sea de robots, coches, o personajes en un videojuego. Algunos de los mas conocidos son A*, LPA*, o D*.

Contenido

Descripción

Un grafo, representa un conjunto de nodos unidos en una red. Si dos nodos están unidos, al viajar de uno a otro se considerara sucesor el nodo al que nos movemos, y predecesor el nodo del que venimos. Además, normalmente existirá un coste vinculado al desplazamiento entre nodos. Un algoritmo de búsqueda tratará, de encontrar un camino optimo entre dos nodos como por ejemplo un camino que minimice el coste de desplazamiento, o el numero de pasos a realizar. La principal diferencia entre los algoritmos es la información que guardan a cerca del grafo. Algunos de ellos no guardan información alguna, simplemente expanden la búsqueda desde el nodo inicial, hasta que se llega al nodo final, otros guardan el coste de viajar desde el origen hasta ese nodo, o incluso una estimación de lo prometedor que es un nodo para conducir el camino a su objetivo. La expansión de la búsqueda se realiza en forma de árbol. Partiendo del nodo inicial, se extenderá la búsqueda a sus nodos vecinos, de cada uno de estos nodos vecinos, a sus respectivos nodos vecinos, y así hasta que uno de los nodos a los que se expande la búsqueda es el nodo objetivo. En esta página se desarrollará un algoritmo de búsqueda lo suficientemente general para trabajar en la mayoría de los grafos, y que da paso a otros métodos de búsqueda más complejos.

Notación

El algoritmo consta de dos listas, Abierta, y Cerrada. En la lista Abierta se guardan los nodos que aun no se han expandido para la búsqueda, que en otras palabras, serian las hojas de un árbol. En la lista Cerrada, se guardan los nodos que ya se han procesado y expandido, estos nodos se guardan porque la expansión de la búsqueda podría intentar volver a pasar por uno de esos nodos y de estar almacenados, se tiene constancia de los nodos que ya se han procesado. Además, cada nodo, almacenará información a cerca de quien es su nodo predecesor.

Ejemplo de algoritmo simple

Pseudocódigo de búsqueda


{\color{BlueViolet} Busqueda \; en \; grafo()}


{}


{\color{Blue} Crear\; \color{Sepia}dos\; listas\; vacias,\; \color{OliveGreen} Abiertos\; \color{Sepia}y\;\color{OliveGreen} Cerrados}


{\color{Blue} Meter\; \color{Sepia} el\; nodo\; origen\; \color{OliveGreen} O\; \color{Sepia} en\; la\; lista\; \color{OliveGreen} Abiertos}


{\color{Blue}Repetir}


{\color{Sepia}Si\; \color{OliveGreen}(Abiertos\; esta\; vacia)\; \color{Sepia}entonces}

{\color{Red}Devolver\; error}

{\color{Sepia}Seleccionar\; el\; primer\; nodo,\; \color{OliveGreen}N\;\color{Sepia} de\; \color{OliveGreen}Abiertos\;\color{Sepia} y\; ponerlo\; en\; \color{OliveGreen}Cerrados}

{\color{Sepia}Si\; \color{OliveGreen}(N == Destino)\; \color{Sepia}entonces}

{\color{Magenta}Devolver\; N}

{\color{Gray}//Recuerda\; que\; estev es\; un\; algoritmo\; de\; busqueda\; en\; un\; grafo}

{\color{Gray}//Para\; obtener\; el\; camino\; que\; une\; el\; nodo\; origen\; y \;destino\; se\; utilizara\; otro\; algoritmo}

{\color{Blue}Expandir\; \color{OliveGreen}(N)\;\color{Sepia} obteniendo\; un\; conjunto\; de\; sucesores\;}

{\color{Sepia}Para\; cada\; (S \in \{\color{Blue}Sucesores\color{OliveGreen}(N)\color{Sepia}\})}

{\color{Sepia}Si\; (\color{OliveGreen}S \color{Sepia} \notin \color{OliveGreen}Abierta \color{Sepia}\; y \;\color{OliveGreen}S \color{Sepia} \notin \color{OliveGreen}Cerrada)\; \color{Sepia}entonces}

{\color{Blue}Guardar\; \color{OliveGreen}N\; \color{Sepia}como\; el\; predecesor\; de\; \color{OliveGreen}S}

{\color{Blue}Meter\; \color{OliveGreen}S\; \color{Sepia} en\; la\; lista\; \color{OliveGreen}Abiertos}


{\color{Blue}Hasta\; \color{Sepia}que\; el\; nodo\; destino\; se\; haya\; encontrado}

Explicación del algoritmo

Primero se crean dos listas que almacenarán nodos, la lista Abiertos, que contiene los nodos que se tienen que expandir, y la lista Cerrados que contiene los que ya han sido expandidos. El nodo de origen, llamado O en este caso, se mete en la lista de Abiertos para ser expandido. En este punto, se inicia la propagación de la busqueda, se crea un bucle que acabará en dos posibles ocasiones: Cuando la lista Abiertos este vacía, o cuando se encuentre el nodo destino. El bucle consiste en varios pasos: Primero se obtiene el primer nodo de la lista Abiertos. El nodo a coger el arbitrario, en otros algoritmos se cogería un nodo que cumpliera ciertas propiedades, pero no es lo que se busca aquí. Si esta lista esta vacía, quiere decir que no quedan mas candidatos para la expansión, y aun asi no se encontró el destino, el algoritmo ha fallado. Por otra parte, si el nodo que cojimos de la lista Abiertos es el destino, el algoritmo habrá acabado, ya que hemos encontrado el destino. El camino entre el origen y el destino es un conjunto de nodos que se obtendrán guardando cada predecesor del nodo destino. En otro caso, se seguira expandiendo la lista, obteniendo una lista de sucesores del nodo actual, y guardando en la lista Abiertos, aquellos nodos que no estuvieran antes en una lista, o con otras palabras, aquellos nodos a los que aun no se había llegado. De esta forma, el algoritmo acabará encontrando el destino, o recorriendo todo el mapa.

Efectividad

Animacion busqueda en grafo
Nota: La animación tiene un fallo, ya que el camino debería de haber empezado en dirección norte en vez de en dirección oeste. Esto ha pasado porque no se metió el cuadro destino en la lista abierta en el momento oportuno (se metio dos turnos mas tarde). El algoritmo trata de llegar desde el cuadro verde (el origen), hasta el cuadro rojo (el destino). La zona negra es un nodo por el que no puede pasar. Siguiendo el algoritmo, el nodo inicial se ira expandiendo, pasando a estar el nodo actual en la lista Cerrados (color violeta) y metiendo otros nodos en la lista de Abiertos (color azul). Además cada nodo almacenará quien es su predecesor, que está simbolizado con las muescas en los bordes de los cuadrados. Una vez que la expansión alcanza el nodo destino, se genera un camino siguiendo la cadena de predecesores.

Como se aprecia, la expansión se realiza sin orientación alguna, a lo largo y ancho del espacio. Esto aumentará considerablemente el tiempo de computación, ya que se procesan muchos mas nodos que si la expansión estuviera orientada en la dirección del destino. Otro factor a tener en cuenta es que a pesar de haber alcanzado el nodo destino, el algoritmo no finaliza hasta que lo procesa, o en otras palabras, hasta que pasa a ser el primer nodo de la lista Abiertos. Estas dos taras, están relacionadas con la prioridad de busqueda, y en algoritmos más avanzados se corrige mediante el uso de estimadores heurísticos como la distancia manhattan, o la distancia euclídea. Usando estos estimadores el algoritmo procesará primero los nodos de la lista abierta que tengan una menor distancia al origen, evitando así expansiones innecesarias.

Otra desventaja importante del algoritmo, es que no tiene capacidad para resolver cambios inesperados en el mapa. Una vez calculada la ruta, si un obstaculo se interpone en el camino obtenido no se hará absolutamente nada por evitarlo. Esto se resuelve en algoritmos como D*, que si tienen en cuenta estas variaciones.

Referencias

Programa en Java que ilustra el uso de algoritmos de busqueda.

Código fuente de ese mismo programa.


Wikimedia foundation. 2010.

Игры ⚽ Нужно сделать НИР?

Mira otros diccionarios:

  • Búsqueda en profundidad — Saltar a navegación, búsqueda Para otros usos de este término, véase Búsqueda. Una Búsqueda en profundidad (en inglés DFS o Depth First Search) es un algoritmo que permite recorrer todos los nodos de un grafo o árbol de manera ordenada, pero no… …   Wikipedia Español

  • Búsqueda en anchura — Saltar a navegación, búsqueda Para otros usos de este término, véase Búsqueda. En Ciencias de la Computación, Búsqueda en anchura (en inglés BFS Breadth First Search) es un algoritmo para recorrer o buscar elementos en un grafo (usado… …   Wikipedia Español

  • Algoritmo de búsqueda A* — Ejemplo de aplicación del algoritmo A*. El algoritmo de búsqueda A* (pronunciado A asterisco o A estrella ) se clasifica dentro de los algoritmos de búsqueda en grafos. Presentado por primera vez en 1968 por Peter E. Hart, Nils J. Nilsson y… …   Wikipedia Español

  • Teoría de grafos — Diagrama de un grafo con 6 vértices y 7 aristas. En matemáticas y en ciencias de la computación, la teoría de grafos (también llamada teoría de las gráficas) estudia las propiedades de los grafos (también llamadas gráficas). Un grafo es un… …   Wikipedia Español

  • OpenStreetMap — Información general URL http://www.openstreetmap.org …   Wikipedia Español

  • Árbol (informática) — Este artículo o sección necesita referencias que aparezcan en una publicación acreditada, como revistas especializadas, monografías, prensa diaria o páginas de Internet fidedignas. Puedes añadirlas así o avisar …   Wikipedia Español

  • Base de datos química — Saltar a navegación, búsqueda Una base de datos química es una base de datos específicamente diseñada para almacenar información química. Esta información puede incluir fórmulas, estructuras químicas y cristalinas, espectros, reacciones químicas …   Wikipedia Español

  • Algoritmo de Dijkstra — Ejecución del algoritmo de Dijkstra Tipo Algoritmo de búsqueda Problema que resuelve Problema del camino más corto …   Wikipedia Español

  • Ciencias de la computación — Las ciencias de la computación son aquellas que abarcan el de las bases teóricas de la información y la computación, así como su aplicación en sistemas computacionales.[1] [2] [3] Existen diversos campos o disciplinas dentro de las Ciencias de la …   Wikipedia Español

  • Algoritmo de Bellman-Ford — El algoritmo de Bellman Ford (algoritmo de Bell End Ford), genera el camino más corto en un Grafo dirigido ponderado (en el que el peso de alguna de las aristas puede ser negativo). El algoritmo de Dijkstra resuelve este mismo problema en un… …   Wikipedia Español

Compartir el artículo y extractos

Link directo
Do a right-click on the link above
and select “Copy Link”