¿Cuáles son las ventajas y desventajas de la búsqueda A * y el algoritmo de Dijkstra? ¿Cuándo se debe usar cada uno?

El algoritmo de Dijkstra encuentra la ruta más corta de una sola fuente a todos los destinos accesibles en un gráfico. No permite bordes negativos: consulte Algoritmo de Bellman-Ford. Se ejecuta en tiempo asintótico O (| E | lg (| V |)). Utiliza el siguiente bucle invariante para calcular la ruta más corta:

[matemáticas] d [v] = d [u] + w (u, v) \ qquad \ qquad \ forall (u, v) \ en E [/ math]

Algoritmos | Coursera

A * El algoritmo de búsqueda, por otro lado, utiliza una función heurística para guiar la búsqueda. Es decir:

[matemáticas] f (n) = g (n) + h (n) [/ matemáticas]

donde g (n) es la distancia desde el origen hasta el nodo ny h (n) es una heurística para estimar la distancia desde el nodo n hasta el destino

Piense en g (n) yh (n) como dos fuerzas en direcciones opuestas. Si la búsqueda es demasiado profunda en un camino donde la función heurística no tiene mucho que prometer, entonces g (n) la retira para relajar caminos más prometedores.

La función heurística podría ser la distancia euclidiana, la distancia de Manhattan, la distancia de Chebyshev, la distancia del taxi … etc. Una buena función heurística es monótona (admisible), es decir, la distancia estimada es siempre menor o igual a la distancia real:

[matemáticas] h (x) \ leq d (x, y) + h (y) [/ matemáticas]

La complejidad del tiempo depende de la función heurística y se encuentra exponencial [matemática] O (b ^ {d}) [/ matemática] donde b es el factor de ramificación yd es la distancia desde la fuente hasta el destino.

A * y los algoritmos de búsqueda heurística ayudan en los casos en que el problema en cuestión es NP-Completo. Es decir, no sabemos si la conjetura [matemática] P = NP [/ matemática] o [matemática] P \ neq NP [/ matemática] . También ayuda en general a los motores de inteligencia artificial como ajedrez, sudoku, etc. Ya que es bastante imposible ejecutar DFS, BFS o Dijkstra en todo el gráfico del juego. Por ejemplo, el árbol del juego de ajedrez tiene un límite inferior de [matemáticas] 10 ^ {120} [/ matemáticas].

Algoritmos | Coursera

Este libro es muy simple y cubre el tema:

Inteligencia artificial: estructuras y estrategias para la resolución de problemas complejos (6ª edición): George F. Luger: 9780321545893: Amazon.com: Libros

Del algoritmo de Dijkstra – Wikipedia: “El algoritmo A * es una generalización del algoritmo de Dijkstra que reduce el tamaño del subgrafo que debe explorarse, si hay información adicional disponible que proporcione un límite inferior en la” distancia “al objetivo. “

Ambos algoritmos funcionan manteniendo en la memoria un conjunto de nodos “fronterizos” para los cuales conocemos la longitud del camino más corto hacia ellos, y extendiendo rutas potenciales hacia el destino a través de cada uno de estos nodos fronterizos al determinar si son parte del proceso más rápido. ruta a cualquiera de sus nodos vecinos (que luego se convierten en nodos fronterizos).

La diferencia es el orden en que se exploran estos nodos fronterizos. En el algoritmo de Dijkstra, se explora primero el nodo de frontera con la distancia más corta desde la fuente. En A *, determinamos el orden por un límite inferior en la longitud total de la ruta, que incluye la distancia desde la fuente, a lo que se agrega un límite inferior en la distancia que aún no se ha recorrido. Por ejemplo, si piensa en buscar una ruta en un mapa, entonces el límite inferior de la distancia desde un punto hasta el destino podría ser la distancia a medida que el cuervo vuela.

Entonces, en la práctica, A * suele ser más adecuado cuando tienes un límite inferior decente en la distancia restante.

El algoritmo de Dijkstra se ejecuta en un gráfico ponderado, comenzando con un nodo inicial y objetivo. Similar a A *, Dijkstra tiene un conjunto visitado y valores de distancia para determinar a qué nodo ir a continuación. Aquí tenemos una función de costo f (x) = g (x) donde nos enfocamos en encontrar el valor de costo real desde el origen hasta cada nodo. Dijkstra no tiene heurística y en cada paso elige bordes con el menor costo, tiende a “cubrir” más de su gráfico. Debido a eso, Dijkstra podría ser más útil que A *. Un buen ejemplo es cuando tiene varios nodos de destino candidatos, pero no sabe cuál es el más cercano. Una búsqueda * tiene dos funciones de costo f (x) = g (x) + h (x) donde g (x) es lo mismo que Dijkstra y h (x) es el costo aproximado del nodo x al nodo objetivo. A * solo expande un nodo si parece prometedor. Esencialmente, A * es una variación informada de Dijkstra. Al usar la mejor primera búsqueda, elige con avidez qué vértice explorar a continuación. A * es completo y óptimo si se trata de una heurística admisible. La diferencia clave entre Dijkstra y A * es que A * se enfoca para alcanzar el nodo objetivo desde el nodo actual, no para alcanzar cualquier otro nodo.

El algoritmo de Dijkstra no presta atención a la dirección en la que va, esto puede hacer que explorar vértices ni siquiera estén cerca del vértice objetivo, por lo que aumenta el tiempo para encontrar el camino más corto. A * es solo una optimización de Dijkstra para una fuente específica y para un objetivo específico. A * utiliza heurística, que resulta ser una estimación de cuán lejos estamos del vértice objetivo, esta heurística es lo que le da a A * su poder real porque tener un sentido de direccionalidad de exploración podría aumentar dramáticamente el tiempo para encontrar el más corto camino.

Y con respecto a dónde usar cuál, creo que es bastante obvio por el comportamiento del algoritmo en sí.

Espero que esto tenga sentido.

More Interesting

¿Cuáles son los algoritmos básicos de aprendizaje automático que todo principiante debe saber antes de comenzar el aprendizaje automático?

Cómo llegar a la lógica para construir un método de impresión inversa que imprima los nodos en una lista vinculada usando un enfoque recursivo usando Java

¿Qué libro debo elegir para aprender algoritmos y estructuras de datos? Ver la descripción.

¿Algún algoritmo de aprendizaje profundo quedará obsoleto algún día con los algoritmos tradicionales? ¿O los algoritmos de aprendizaje profundo solo son adecuados para problemas específicos?

¿Cuáles son los mejores algoritmos de clasificación para DBMS?

¿Qué algoritmo se puede usar para la predicción de pasajes aéreos?

¿Cuál es la mejor manera de crear una estructura de datos basada en valores clave en C ++ que admita memoria compartida entre procesos usando C ++ 11?

¿Cuál es el mejor algoritmo para elegir para la tarea de aprendizaje automático de agrupar una base de datos de listados de casas con sus propiedades (algunos de los cuales son binarios y otros son numéricos y preferiblemente con la primera imagen)?

¿Qué algoritmos existen para la reconstrucción de un conjunto de vectores de un diccionario de cardinalidad más pequeña?

¿Qué es particionar en chispa, por qué lo necesitamos?

¿Es el algoritmo y la metodología para corregir automáticamente las palabras mal escritas en las consultas de búsqueda de Google una "salsa secreta" o está abierto?

¿Cómo combina ACM ICPC invertir en diversidad y mantener alta la barra de entrada?

Si F2L se resuelve mejor de forma intuitiva, ¿por qué cada tutorial incluye algoritmos para todos los casos de F2L?

Cómo hacer un algoritmo de filtrado basado en contenido de Python

Entre la ordenación rápida, la ordenación por inserción y la ordenación en montón, ¿cuál es la mejor para clasificar datos y por qué?