Algoritmo de ruta más corta del entorno VC
Obtenido de:/space/html/07/14107_itemid_400760.html
Introducción al algoritmo
El algoritmo de Dijkstra fue desarrollado por un Científico informático holandés descubierto por Ezig Dijkstra. Este algoritmo resuelve el problema del camino más corto en gráficos dirigidos.
Por ejemplo, si los vértices del gráfico representan ciudades y los pesos de los bordes representan la distancia recorrida por los automóviles entre ciudades, entonces puede utilizar el algoritmo de Dijkstra para encontrar el camino más corto en el gráfico dirigido. El algoritmo de Dijkstra se puede utilizar para encontrar el camino más corto entre dos ciudades.
La entrada al algoritmo de Dijkstra consta de un gráfico dirigido ponderado G y un vértice fuente S en G. Cada arista del gráfico es un par ordenado de elementos que consta de dos vértices. (Tomamos el conjunto de todas las aristas de E, y el peso de la arista está definido por la función de peso w: E → [0, ∞]. Por lo tanto, w(u, v) es el valor del costo no negativo (costo ) entre el vértice u y el vértice v ). El costo del camino entre dos puntos cualesquiera es la suma de los costos de todos los bordes en el camino. Dado que hay vértices s y t en V, el algoritmo de Dijkstra puede encontrar el camino de menor costo. s a t (es decir, el camino más corto) Se puede encontrar el camino más corto desde el vértice s a cualquier otro vértice en el gráfico.
Descripción del algoritmo
El algoritmo funciona manteniendo for. cada vértice v es el camino más corto desde s hasta el encontrado hasta ahora. El camino más corto de v. Inicialmente, el valor de la longitud del camino del punto de origen s se asigna a 0 (d[s] = 0), y la longitud del camino de todos. otros vértices se establecen en infinito, lo que significa que no conocemos ningún camino que conduzca a estos vértices. El camino a un vértice (d[v] = ∞ para todos los vértices v en V excepto s). el camino más corto de s a v se almacena en d[v], o si no existe ningún camino. La operación básica del algoritmo de Dijstra es la expansión de bordes: si existe un borde de u a v, entonces el camino más corto de s a Infinito. Puedes extender el camino de s a v agregando el borde (u, v) a la cola. La longitud de este camino es d[u] w(u, v) si este valor es menor que el d[v] actualmente conocido. ] valor, podemos reemplazar el valor d[v] actual con el nuevo valor. La operación continúa hasta que todos los d[v] representen el costo del camino más corto de s a v. El algoritmo está organizado de tal manera que cuando d. [v] no es el camino más corto de s a v, no es el camino más corto. El algoritmo está organizado de tal manera que cuando d[u] alcanza el valor final, el borde (u, v) no se expande más. más de una vez.
El algoritmo mantiene dos conjuntos de vértices S y Q. El conjunto S retiene todos los vértices existentes. Se sabe que el valor de d[v] es el valor de la ruta más corta y el conjunto. Q retiene todos los demás vértices. El conjunto S está inicialmente vacío y un vértice se mueve de Q a S en cada paso. El vértice seleccionado es d[ en Q. u] El vértice con el valor más pequeño cuando el vértice u se mueve de Q a. S, el algoritmo expande cada borde exterior (u, v)
Pseudocódigo
En el siguiente algoritmo, u:=Extract_Min(Q) buscará el vértice u con el. valor d[u] más pequeño en el conjunto de vértices Q.
función Dijkstra(G, w, s)
//Inicialización
Para cada vértice v {
< en V[G] p> d[v] := infinitoanterior[v] := indefinido
d[s ] := 0
}
S:= conjunto vacío
Q:= conjunto de todos los vértices
mientras Q no es un conjunto vacío { // cuerpo del algoritmo de Dijstra
u := Extract_Min(Q)
S := S unión {u}
para cada arista (u, v) que sale de u
si d[v ] gt ; d[u] w(u, v) // expandir borde (u, v)
d[v] := d[u] w(u, v)
anterior[v] := u
}
Si solo buscamos el camino más corto entre s y t, entonces podemos agregar una condición en la línea 9 que satisfaga Terminar el programa si tu=t.
Ahora podemos iterar para encontrar el camino más corto de s a t
1 S := secuencia vacía
2 u := t
3 mientras se define u
4 Inserta u al principio de S
5 u := anterior[u]
Ahora la secuencia S es de s a t El conjunto de vértices del camino más corto.
Complejidad del tiempo
Podemos expresar el tiempo de ejecución del algoritmo de Dijkstra en notación O grande como una función del número de aristas my el número de vértices n.
La implementación más simple del algoritmo de Dijkstra es almacenar el conjunto Q de todos los vértices en una lista o matriz enlazada, por lo que la operación de buscar el elemento más pequeño en Q (Extract-Min(Q)) solo requiere una búsqueda lineal de Q todos los elementos en . En este caso, el tiempo de ejecución del algoritmo es O(n2).
Para gráficos dispersos con menos de n2 aristas, podemos implementar el algoritmo de Dijkstra de manera más eficiente mediante el uso de listas de adyacencia. Además, también es necesario utilizar un montón binario o un montón de Fibonacci como cola de prioridad para encontrar el vértice mínimo (Extract-Min). Cuando se utiliza un montón binario, el algoritmo se ejecuta en tiempo O((m n) log n), mientras que se utiliza un montón de Fibonacci, el rendimiento mejora ligeramente y el algoritmo se ejecuta en tiempo O(m n log n).
Problemas y algoritmos relacionados
El algoritmo se puede ampliar realizando algunas modificaciones al algoritmo de Dijkstra. Por ejemplo, a veces es necesario enumerar algunas rutas subcortas en función de la ruta más corta. Puede hacer esto calculando primero la ruta más corta en el gráfico original, luego eliminando un borde de la ruta del gráfico y volviendo a calcular la ruta más corta en el subgrafo restante. Para cada borde en la ruta más corta original, podemos encontrar el camino más corto al subgrafo después de eliminar ese borde y ordenar estos caminos en una secuencia de los segundos caminos más cortos en el gráfico original.
El algoritmo OSPF (Open Shortest Path First) es la implementación específica del algoritmo de Dijkstra en el enrutamiento de red.
A diferencia del algoritmo de Dijkstra, el algoritmo de Bellman-Ford se puede utilizar en gráficos con bordes de costo negativos siempre que no haya ciclos en el gráfico con costo total negativo que sean alcanzables desde las fuentes.
Un problema relacionado con el problema del camino más corto es el problema del viajante, que requiere encontrar el camino más corto que pase por todos los vértices exactamente una vez y finalmente regrese a la fuente. En otras palabras, a diferencia del problema del camino más corto, es poco probable que el problema del viajante tenga un algoritmo de tiempo polinomial.
Si existe información conocida que se puede utilizar para estimar la distancia desde un punto a un punto objetivo, se puede utilizar el algoritmo A* para reducir la búsqueda del camino más corto.
Además, el algoritmo utilizado para resolver el problema de la ruta más corta se denomina "algoritmo de la ruta más corta", a veces también denominado "algoritmo de la ruta". Los algoritmos de ruta más utilizados son:
Algoritmo de Dijkstra
Algoritmo A*
Algoritmo SPFA
Algoritmo Bellman-Ford
Algoritmo Floyd-Warshall
Algoritmo Johnson
El llamado problema del camino más corto de una sola fuente es el siguiente: dado el gráfico G = (V, E), Espero encontrar el camino desde la fuente dada. El camino más corto desde el nodo S∈V hasta cada nodo en V.
En primer lugar, podemos descubrir el hecho de que si P es el camino más corto de vs a vj en G, y vi es un punto en P, entonces el camino de vs a vi a lo largo de P es de The camino más corto de vs a vi.