Código fuente de viajes
El cálculo de la ruta más corta se divide en cálculo estático de la ruta más corta y cálculo dinámico de la ruta más corta.
El algoritmo de ruta estática más corta calcula la ruta más corta sin cambiar el entorno externo. Existen principalmente el algoritmo de Dijkstra y el algoritmo A* (estrella A).
La ruta dinámica más corta es calcular la ruta más corta cuando el entorno externo cambia constantemente, es decir, la predicción no se puede calcular. Por ejemplo, en un juego donde los enemigos u obstáculos se mueven constantemente. Existe un algoritmo D* típico.
Este es el camino más corto de una red de carreteras aleatoria de 10.000 nodos implementada mediante el programa Drew.
Un ejemplo de cálculo de k caminos en una red de carreteras real: desde el nodo 5696 al nodo 3006, los tres caminos más rápidos, se puede observar que los caminos toman básicamente carreteras de circunvalación o carreteras principales. La línea negra es la primera, la línea azul es la segunda y la línea roja es la tercera. El coeficiente de restricción es 1,2. * * * Disfruta de algunos capítulos. La parte de cálculo de visualización se completa completamente con un programa desarrollado por el propio Drew.
Ver procedimiento de prueba del algoritmo K-path.
El algoritmo de Dijkstra encuentra el camino más corto;
El algoritmo de Dijkstra es un algoritmo típico de camino más corto, que se utiliza para calcular el camino más corto desde un nodo a todos los demás nodos. La característica principal es que se expande hacia afuera desde el punto inicial hasta el punto final. El algoritmo de Dijkstra puede obtener la solución óptima del camino más corto, pero debido a la gran cantidad de nodos atravesados, la eficiencia es baja.
El algoritmo de Dijkstra es un algoritmo de ruta más corta muy representativo. Se presenta en detalle como contenido básico en muchos cursos profesionales, como estructura de datos, teoría de grafos, investigación de operaciones, etc.
Dijkstra generalmente tiene dos métodos de expresión, uno es usar etiquetas permanentes y temporales, y el otro es usar tablas de apertura y cierre. Para ser coherente con el algoritmo A* y el algoritmo D* que se presentarán a continuación, Drew utiliza tablas abiertas y tablas cerradas aquí.
Proceso general:
Crear dos tablas, abrir y cerrar.
La tabla abierta guarda todos los nodos que se han generado pero no investigados, y la tabla cerrada registra los nodos que se han visitado.
1. Visite el punto no inspeccionado con el punto de partida más cercano en la red de carreteras y coloque el punto en el grupo abierto para su inspección.
2. Encuentre el punto más cercano al punto inicial de la lista abierta, busque todos los nodos secundarios del punto y coloque el punto en la lista cerrada.
3. Recorre los nodos secundarios de este punto. Encuentre la distancia entre estos nodos secundarios y el punto de partida y coloque los nodos secundarios en la tabla abierta.
4. Repetir los pasos 2, 3 y 3. Hasta que la mesa abierta esté vacía o se encuentre el punto objetivo.
Esta es una demostración del algoritmo de Dijkstra que busca el camino más corto en una red de carreteras aleatoria de 4000 nodos en el programa de sorteo. Los círculos negros representan puntos que han sido recorridos y calculados. En la figura, podemos ver que el algoritmo de Dijkstra se extiende desde el punto inicial hasta las capas circundantes y alcanza el punto objetivo después de calcular una gran cantidad de nodos. Por eso es lento e ineficiente.
Hay muchas maneras de mejorar la velocidad de búsqueda de Dijkstra. Hasta donde sabe Drew, los métodos comúnmente utilizados son el montón binario de la estructura de datos y la búsqueda simultánea de Dijkstra desde el punto inicial y el punto final.
Página web recomendada: u.edu.cn/assist/js04/ZJS045/ZJS04505/zjs045050a.htm.
Una breve introducción al algoritmo de Dijkstra, con visualización gráfica y código fuente descargar.
Algoritmo A* (A estrella): algoritmo heurístico.
El algoritmo A*(A-Star) es el método más eficaz para resolver el camino más corto en una red de carreteras estática.
La fórmula es: f(n)=g(n)+h(n),
donde f(n) es la función de evaluación del nodo n desde el punto inicial hasta el punto objetivo,
G(n) es el costo real desde el nodo inicial hasta el enésimo nodo en el espacio de estados,
H(n) es el mejor camino desde n al nodo objetivo Estimar el costo.
La clave para encontrar el camino más corto (solución óptima) radica en la selección de la función de evaluación h(n):
El valor estimado h (n) < = la distancia desde n al valor real del nodo objetivo. En este caso, hay muchos puntos para buscar, el rango de búsqueda es grande y la eficiencia es baja. Pero se puede obtener la solución óptima.
Si el valor estimado > el valor real, el número de puntos de búsqueda es pequeño, el rango de búsqueda es pequeño y la eficiencia es alta, pero no se puede garantizar la solución óptima.
Cuanto más se acerque el valor estimado al valor real, mejor será la función de evaluación obtenida.
Por ejemplo, para una red de carreteras geométrica, la distancia euclidiana (distancia en línea recta) entre dos nodos se puede tomar como valor estimado, es decir, f = g(n)+sqrt((dx -NX )*(dx-NX)+(dy-NY)*(dy-NY)); De esta forma, cuando el valor de G permanece sin cambios, la función de evaluación F estará más o menos limitada por el valor de evaluación H. Cuando el nodo está cerca del objetivo Cuando se alcanza el punto, el valor de H es relativamente pequeño y el valor de F también es relativamente pequeño, lo que puede garantizar la búsqueda del camino más corto hasta el punto final. Es significativamente mejor que el algoritmo de Dijstra en búsquedas no dirigidas.
Condiciones heurísticas
Optimista (debe ser menor o igual al coste real)
Lo más cercano posible al coste real
Proceso de búsqueda principal:
Cree dos tablas. La tabla abierta guarda todos los nodos que se han generado pero no investigados, y la tabla cerrada registra los nodos que se han visitado.
Atraviesa cada nodo del nodo actual, coloca n nodos en CERRAR, toma el nodo secundario x de n nodos, --> calcula el valor estimado de x->
Y (¡Abierto! = vacío)
{
Obtenga el nodo n con el valor mínimo estimado f de la tabla abierta;
Si (n nodo = = objetivo nodo) break
Otros
{
Si(X en OPEN) compara los valores estimados f de dos X //Tenga en cuenta que son estimaciones de dos caminos diferentes al mismo valor de nodo.
si (el valor estimado de x es menor que el valor estimado de la tabla abierta)
Actualizar el valor estimado en la tabla abierta //Obtener el valor estimado del mínimo; camino.
si (X en CLOSE) compara los valores estimados de las dos X // Note que son los valores estimados de dos caminos diferentes para el mismo nodo.
si (el valor estimado de x es menor que el valor estimado de la tabla CLOSE)
Actualice el valor estimado en la tabla de liquidación; coloque el nodo X en OPEN // para Obtenga la estimación del valor mínimo de la ruta.
Si (X no está en ambos)
Encuentra la estimación de x;
E inserta x en la tabla abierta //Aún no ordenado
p>
}
Insertar n nodos en la tabla cerrada;
Ordenar los nodos en la tabla abierta según el valor estimado // De hecho, es para comparar; los nodos en la tabla abierta El tamaño del nodo F se determina a partir del nodo con el camino más corto hacia abajo.
}