Páginas

viernes, 6 de septiembre de 2019

LISTAS RELACIONADAS CON LAS MATEMÁTICAS - ALGORITMOS


La búsqueda bidireccional es un algoritmo de búsqueda de gráficos que encuentra una ruta más corta desde un vértice inicial hasta un vértice objetivo en un gráfico dirigido . Ejecuta dos búsquedas simultáneas: una hacia adelante desde el estado inicial y otra hacia atrás desde la meta, deteniéndose cuando los dos se encuentran. La razón de este enfoque es que en muchos casos es más rápido: por ejemplo, en un modelo simplificado de complejidad del problema de búsqueda en el que ambas búsquedas expanden un árbol con el factor de ramificación b , y la distancia desde el inicio hasta el objetivo es d , cada uno de los dos búsquedas tiene complejidad O ( d / 2 ) (enNotación O grande ), y la suma de estos dos tiempos de búsqueda es mucho menor que la complejidad O ( d ) que resultaría de una sola búsqueda desde el principio hasta el objetivo.
Andrew Goldberg y otros explicaron las condiciones correctas de terminación para la versión bidireccional del algoritmo de Dijkstra . [1]
Al igual que en la búsqueda A * , la búsqueda bidireccional puede guiarse por una estimación heurística de la distancia restante a la meta (en el árbol hacia adelante) o desde el principio (en el árbol hacia atrás).
Ira Pohl ( 1971 ) fue el primero en diseñar e implementar un algoritmo de búsqueda heurística bidireccional. Los árboles de búsqueda que emanan desde el inicio y los nodos de objetivos no se encontraron en el medio del espacio de la solución. El algoritmo BHFFA solucionó este defecto Champeaux (1977).
Una solución encontrada por el algoritmo unidireccional A * que utiliza una heurística admisible tiene una longitud de ruta más corta; la misma propiedad es válida para la versión heurística bidireccional BHFFA2 descrita en de Champeaux (1983). BHFFA2 tiene, entre otras, condiciones de terminación más cuidadosas que BHFFA.

Descripción editar ]

Una búsqueda heurística bidireccional es una búsqueda de espacio de estado de algún estado a otro estado , buscando desde  a  y de  a simultaneamente. Devuelve una lista válida de operadores que, si se aplican a nos dará .
Si bien puede parecer que los operadores tienen que ser invertibles para la búsqueda inversa, solo es necesario poder encontrar, dado cualquier nodo , el conjunto de nodos principales de  tal que existe algún operador válido de cada uno de los nodos principales para Esto a menudo se ha comparado con una calle de sentido único en el dominio de búsqueda de ruta: no es necesario poder descender en ambas direcciones, pero es necesario cuando se está parado al final de la calle para determinar el comienzo de la calle. como una posible ruta
De manera similar, para aquellos bordes que tienen arcos inversos (es decir, arcos que van en ambas direcciones) no es necesario que cada dirección tenga el mismo costo. La búsqueda inversa siempre utilizará el costo inverso (es decir, el costo del arco en la dirección hacia adelante). Más formalmente, si es un nodo con padre , entonces , definido como el costo de  a (Auer Kaindl 2004)

Terminología y notación editar ]

 
el factor de ramificación de un árbol de búsqueda
 
el costo asociado con mudarse del nodo  al nodo 
 
el costo desde la raíz hasta el nodo 
 
La estimación heurística de la distancia entre el nodo  y el gol
 
el estado inicial
 
el estado del objetivo (a veces , no debe confundirse con la función)
 
La dirección de búsqueda actual. Por convención, es igual a 1 para la dirección hacia adelante y 2 para la dirección hacia atrás (Kwa 1989)
 
la dirección de búsqueda opuesta (es decir )
 
el árbol de búsqueda en dirección d. Si, la raíz es , Si , la raíz es 
 
las hojas de  (a veces denominado Es de este conjunto que se elige un nodo para la expansión. En la búsqueda bidireccional, a veces se les llama 'fronteras' o 'frentes de onda' de búsqueda, en referencia a cómo aparecen cuando una búsqueda se representa gráficamente. En esta metáfora, una 'colisión' ocurre cuando, durante la fase de expansión, se encuentra que un nodo de un frente de onda tiene sucesores en el frente de onda opuesto.
 
los nodos no hoja de Este conjunto contiene los nodos ya visitados por la búsqueda

Enfoques para la búsqueda heurística bidireccional editar ]

Los algoritmos bidireccionales se pueden dividir en tres categorías: de adelante hacia adelante, de adelante hacia atrás (o de adelante hacia atrás) y la búsqueda de perímetro (Kaindl Kainz 1997). Estos difieren según la función utilizada para calcular la heurística.

De adelante hacia atrás editar ]

Los algoritmos de adelante hacia atrás calculan el  valor de un nodo  mediante el uso de la estimación heurística entre  y la raíz del árbol de búsqueda opuesto,  o .
Front-to-Back es la más investigada de las tres categorías. El mejor algoritmo actual (al menos en el dominio de los quince rompecabezas ) es el algoritmo BiMAX-BS * F, creado por Auer y Kaindl (Auer, Kaindl 2004).

De frente a frente editar ]

Los algoritmos de frente a frente calculan el valor h de un nodo n utilizando la estimación heurística entre ny un subconjunto deEl ejemplo canónico es el BHFFA ( Algoritmo heurístico bidireccional de frente a frente ), [2] donde la función h se define como el mínimo de todas las estimaciones heurísticas entre el nodo actual y los nodos en el frente opuesto. O, formalmente:
dónde devuelve una estimación heurística admisible (es decir, no sobreestimando) de la distancia entre los nodos n y o .
Front-to-Front sufre de ser excesivamente exigente desde el punto de vista informático. Cada vez que un nodo n se coloca en la lista abierta, suEl valor debe ser calculado. Esto implica calcular una estimación heurística de n para cada nodo en el conjunto OPEN opuesto , como se describió anteriormente. Los conjuntos ABIERTOS aumentan de tamaño exponencialmente para todos los dominios con b > 1 .









Breadth-first search ( BFS ) es un algoritmo para atravesar o buscar estructuras de datos de árbol o gráfico . Comienza en la raíz del árbol (o algún nodo arbitrario de un gráfico, a veces denominado "clave de búsqueda" [1] ), y explora todos los nodos vecinos en la profundidad actual antes de pasar a los nodos en el siguiente nivel de profundidad
Utiliza la estrategia opuesta como búsqueda de profundidad primero , que explora los nodos de mayor profundidad primero antes de verse obligado a retroceder y expandir nodos menos profundos.
BFS y su aplicación para encontrar componentes conectados de gráficos fueron inventados en 1945 por Konrad Zuse , en su (rechazado) Ph.D. tesis sobre el lenguaje de programación Plankalkül , pero esto no fue publicado hasta 1972. [2] Fue reinventado en 1959 por Edward F. Moore , quien lo utilizó para encontrar el camino más corto fuera de un laberinto, [3] [4] y más tarde desarrollado por CY Lee en un algoritmo de enrutamiento de cables (publicado en 1961).

Búsqueda de amplitud
Orden en que se expanden los nodos
Orden en el que se expanden los nodos
ClaseAlgoritmo de búsqueda
Estructura de datosGrafico
El peor de los casos
La peor complejidad del espacio


Pseudocódigo

Entrada : un gráfico Graph y una raíz de vértice inicial de Graph
Salida : estado del objetivo. Los enlaces principales trazan la ruta más corta de regreso a la raíz
1   procedimiento BFS ( G , start_v ):
2 deja que Q sea ​​una cola
3 etiqueta start_v como se descubrió
4       Q .enqueue ( start_v )
5       mientras  Q no está vacío
6           v = Q .dequeue ()
7           si  v es el objetivo:
8               devuelve  v 
9           para todos los bordes de v a w  en  G. adyacentes Bordes ( v ) do 
10              si  w no está etiquetado como descubierto:
11 etiqueta w como descubierta
12                  w .parent = v 
13                  Q .enqueue ( w ) 

Más detalles

Esta implementación no recursiva es similar a la implementación no recursiva de la búsqueda en profundidad , pero difiere de ella de dos maneras:
  1. utiliza una cola (Primero en entrar, primero en salir) en lugar de una pila y
  2. comprueba si se ha descubierto un vértice antes de ponerlo en cola en lugar de retrasar esta comprobación hasta que el vértice se retire de la cola.
La cola Q contiene la frontera a lo largo de la cual el algoritmo está buscando actualmente.
Los nodos se pueden etiquetar como descubiertos almacenándolos en un conjunto o mediante un atributo en cada nodo, dependiendo de la implementación.
Tenga en cuenta que la palabra nodo es generalmente intercambiable con la palabra vértice .
El atributo padre de cada nodo es útil para acceder a los nodos en una ruta más corta, por ejemplo, retrocediendo desde el nodo de destino hasta el nodo inicial, una vez que se ha ejecutado el BFS y se han establecido los nodos predecesores.
La búsqueda de amplitud produce un llamado primer árbol de amplitud . Puede ver cómo se ve un primer árbol de ancho en el siguiente ejemplo.

Ejemplo

El siguiente es un ejemplo del primer árbol de amplitud obtenido al ejecutar un BFS en ciudades alemanas a partir de Frankfurt :

Un mapa de ejemplo del sur de Alemania con algunas conexiones entre ciudades

El primer árbol de amplitud obtenido al ejecutar BFS en el mapa dado y comenzar en Frankfurt

Análisis

Complejidad de tiempo y espacio

La complejidad del tiempo se puede expresar como , ya que cada vértice y cada borde se explorarán en el peor de los casos.  es el número de vértices y es el número de aristas en el gráfico. Tenga en cuenta que puede variar entre  y , dependiendo de cuán escaso sea el gráfico de entrada. [6]
Cuando el número de vértices en el gráfico se conoce con anticipación, y se utilizan estructuras de datos adicionales para determinar qué vértices ya se han agregado a la cola, la complejidad del espacio se puede expresar como , dónde es la cardinalidad del conjunto de vértices. Esto se suma al espacio requerido para el gráfico en sí mismo, que puede variar según la representación gráfica utilizada por una implementación del algoritmo.
Cuando se trabaja con gráficos que son demasiado grandes para almacenar explícitamente (o infinito), es más práctico describir la complejidad de la búsqueda de amplitud primero en diferentes términos: para encontrar los nodos que están a la distancia d del nodo de inicio (medido en número de los recorridos de borde), BFS toma O ( d + 1 ) tiempo y memoria, donde b es el " factor de ramificación " del gráfico (el grado de salida promedio). [7] : 81

Lo completo

En el análisis de algoritmos, se supone que la entrada a la búsqueda de amplitud es un gráfico finito, representado explícitamente como una lista de adyacencia o una representación similar. Sin embargo, en la aplicación de métodos de recorrido de gráficos en inteligencia artificial, la entrada puede ser una representación implícita de un gráfico infinito. En este contexto, un método de búsqueda se describe como completo si se garantiza que encontrará un estado objetivo si existe. La búsqueda de amplitud es completa, pero la búsqueda de profundidad no lo es. Cuando se aplica a gráficos infinitos representados implícitamente, la búsqueda por amplitud finalmente encontrará el estado objetivo, pero la búsqueda por profundidad puede perderse en partes del gráfico que no tienen estado objetivo y nunca regresan. [8]

Pedido BFS

Se dice que una enumeración de los vértices de un gráfico es un pedido de BFS si es el posible resultado de la aplicación de BFS a este gráfico.
Dejar  ser un gráfico con vértices Recordar que es el conjunto de vecinos de por ser una lista de elementos distintos de , para , dejar  ser el menos  tal que  es vecino de , si tal  existe y ser  de otra manera.
Dejar  ser una enumeración de los vértices de La enumeración se dice que es un pedido BFS (con fuente ) si, para todos  es el vértice  tal que es mínimo Equivalentemente es un pedido BFS si, para todos  con existe un vecino  de  tal que .

Aplicaciones

La búsqueda de amplitud puede usarse para resolver muchos problemas en la teoría de grafos, por ejemplo:

No hay comentarios:

Publicar un comentario