Algoritmo de Dijkstra
De Wikipedia, la enciclopedia libre
Algoritmo de Dijkstra , concebido por el holands equipo cientfico Dijkstra Edsger en 1956 y publicado en 1959,
[ 1 ] [ 2 ] es un algoritmo de bsqueda grfico que resuelve la sola fuente ms corta problema de ruta para un grfico
con negativos borde costes de ruta, produciendo un camino ms corto rbol . Este algoritmo se utiliza a menudo en
enrutamiento y como una subrutina en otros algoritmos de grafos.
Algoritmo de Dijkstra
Para una fuente dada vrtice (nodo) en el grfico, el algoritmo encuentra el camino con menor coste (es decir, la ruta
ms corta) entre dicho vrtice y cada otro vrtice. Tambin se puede utilizar para encontrar los costos de las
trayectorias ms cortas desde un solo vrtice a un destino nico vrtice deteniendo el algoritmo una vez que el camino
ms corto para el vrtice destino ha sido determinado. Por ejemplo, si los vrtices de la grfica representan ciudades
y los costes de borde trazado representan conducir distancias entre pares de ciudades conectadas por un camino
directo, el algoritmo de Dijkstra se puede utilizar para encontrar la ruta ms corta entre una ciudad y todas las dems
ciudades. Como resultado, la trayectoria ms corta primero se utiliza ampliamente en la red protocolos de
enrutamiento , ms notablemente IS-IS y OSPF (Open Shortest primera trayectoria).
Algoritmo original de Dijkstra no utiliza una cola de prioridad min y se ejecuta en
. La idea de este
algoritmo tambin se da en ( Leyzorek et al. 1957 ). La implementacin basada en una cola de prioridad minimplementado por un montn de Fibonacci y funcionando en
se debe a ( Fredman y
Tarjan 1984 ). Esto es asintticamente ms rpido de lo conocido de una sola fuente algoritmo de ruta ms corta para
arbitrarias grafos dirigidos con pesos no negativos sin lmites.
Bsqueda algoritmo
Estructura de los
datos
Grfico
Contenido
1 Algoritmo
2 Descripcin
3 Pseudocdigo
4 Tiempo de funcionamiento
5 problemas y algoritmos relacionados
6 perspectiva de la programacin dinmica
7 Vase tambin
8 Notas
9 Referencias
10 Enlaces externos
Algoritmo
Deje que el nodo en el que estamos empezando llamarse el nodo inicial . Deje que la distancia del nodo Y la distancia desde el
nodo inicial al algoritmo de Dijkstra Y. asignar algunos valores de la distancia inicial y trataremos de mejorar paso a paso.
1. Asignar a cada nodo un valor de distancia tentativa: la puso a cero para nuestro nodo inicial hasta el infinito y para todos los
dems nodos.
2. Marcar todos los nodos no visitados. Establecer el nodo inicial como actual. Crear un conjunto de los nodos no visitados
llamado el conjunto no visitado integrado por todos los nodos excepto el nodo inicial.
3. Para el nodo actual, considere todos sus vecinos no visitados y calcular sus tentativas distancias. Por ejemplo, si el nodo
actual A est marcada con una distancia provisional de 6, y el borde de conexin con un vecino B tiene una longitud de 2,
entonces la distancia de A a B (a travs de A) ser del 6 2 = 8. Si esta distancia es menor que la distancia previamente
grabada provisional de B, a continuacin, sobrescribir esa distancia. A pesar de que un vecino ha sido examinada, no se
marca como "visitado" en este momento, y sigue siendo en el conjunto no visitados .
4. Cuando terminemos teniendo en cuenta todos los vecinos del nodo actual, marque el nodo actual como visitado y retrela del
conjunto no visitados . Un nodo visitado nunca volver a comprobarse, su distancia registrada ahora es final y mnimo.
5. Si el nodo de destino ha sido marcado visitados (al planear una ruta entre dos nodos especficos) o si la distancia ms
pequea tentativo entre los nodos en el conjunto no visitado es infinito (cuando se planea un recorrido completo), y luego
se detiene. El algoritmo ha terminado.
6. Establecer el nodo no visitado marcado con la distancia ms pequea tentativa como el prximo "nodo actual" y vuelva al
paso 3.
Descripcin
Nota: Para facilitar la comprensin, esta discusin utiliza los trminos cruce , carretera y mapa - sin embargo, estos
trminos son formalmente vrtice , borde y grfico , respectivamente.
Suponga que quiere encontrar el camino ms corto entre dos intersecciones en un mapa de la ciudad, un punto de partida y un
destino. El orden es conceptualmente simple: para empezar, marque la distancia a cada interseccin en el mapa con el infinito. Esto
se hace no se interprete que hay una distancia infinita, pero observar que esa interseccin an no ha sido visitado ; algunas
variantes de este mtodo simplemente dejar la interseccin sin marcar. Ahora, en cada iteracin, seleccionar una corriente de interseccin. Para la primera iteracin de la
interseccin actual ser el punto de partida y la distancia a la misma (etiqueta de la interseccin) ser cero. Para las iteraciones subsiguientes (despus de la primera) de la
interseccin actual ser el ms cercano a la interseccin unvisited punto de partida-esto ser fcil de encontrar.
Desde la interseccin actual, actualizar la distancia para cada interseccin unvisited que est directamente conectado a l. Esto se realiza mediante la determinacin de la
suma de la distancia entre una interseccin no visitados y el valor de la interseccin actual, y volver a etiquetar la interseccin no visitados con este valor si es inferior a su
en.wikipedia.org/wiki/Dijkstra's_algorithm
1/4
01/11/12
valor actual. En efecto, la interseccin se vuelve a etiquetar si la ruta de acceso a l a travs de la interseccin actual es ms corto que los caminos conocidos previamente.
Para facilitar la identificacin camino ms corto, a lpiz, marque el camino con una flecha que apunta a la interseccin relabeled si label / reetiquetado, y borrar todos los
otros que apuntan a la misma. Despus de haber actualizado las distancias a cada interseccin vecina , marque la interseccin actual como visitado y seleccione la
interseccin no visitados con menor distancia (desde el punto de partida) - o bajo la etiqueta como la interseccin actual. Los nodos marcados como visitados son
etiquetados con el camino ms corto desde el punto de partida para ello y no se volver a examinar o devuelto a.
Contine con este proceso de actualizacin de las intersecciones vecinas con las distancias ms cortas, entonces marca la interseccin actual como visitado y pasar a la
interseccin ms cercana no visitados hasta que haya marcado el destino como visitado. Una vez que haya marcado el destino como visitado (como es el caso con
cualquier interseccin visitado) que haya determinado el camino ms corto para que, desde el punto de partida, y puede trazar su camino de regreso, siguiendo las flechas
en sentido inverso.
Cabe destacar el hecho de que este algoritmo no hace ningn intento para dirigir "exploracin" hacia el destino como uno podra esperar. Ms bien, la nica consideracin
en la determinacin de la siguiente "actual" interseccin es la distancia desde el punto de partida. En cierto sentido, este algoritmo "se expande" desde el punto de partida,
teniendo en cuenta iterativa cada nodo que est ms cerca en trminos de distancia del camino ms corto hasta llegar al destino. Cuando se entiende de esta manera, est
claro cmo el algoritmo encuentra necesariamente el camino ms corto, sin embargo, tambin puede revelar una de las debilidades del algoritmo: su relativa lentitud en
algunas topologas.
Pseudocdigo
En el siguiente algoritmo, el cdigo u: = vrtice en Q ms pequea con dist [], las bsquedas de la vrtice uen el conjunto de vrtices Qque tiene al menos el
dist [ u ]valor. Vrtice que se retira del conjunto Qy devuelto al usuario. dist_between ( u , v )calcula la longitud entre los dos vecinos-nodos uy v. La
variable alten las lneas 20 y 22 es la longitud del camino desde el nodo raz hasta el nodo vecino vsi fuera a ir a travs de u. Si esta ruta es ms corta que la ruta ms
corta corriente registrado por v, la ruta actual se sustituye con este altcamino. La anteriormatriz se rellena con un puntero a la "next-hop" nodo en el grfico de origen
para obtener la ruta ms corta a la fuente.
Una
funcin Dijkstra ( grfico , fuente ):
/ / Initializations
2
para cada vrtice v en grfico :
3 dist [ v ]: = infinito;
funcin a distancia / en / desconocido de
4
/ / fuente para v
5 anterior [ v ]: = indefinido;
/ / siguiente nodo en la ruta ptima
6
/ / de fuente
7
8 dist [ fuente ]: = 0;
/ / Distancia desde la fuente a
9
Q : = el conjunto de todos los nodos del grfico ;
/ / Todos los nodos en el grfico son
10
/ / sin optimizar - por lo tanto estn en Q
11
, mientras que Q no es vaco:
/ / El bucle principal
12
u : = vrtice en Q con menor distancia en dist [];
/ / Start nodo en el primer caso
13 eliminar u de Q ;
14
si dist [ u ] = infinito:
15
descanso ;
/ / todos los vrtices restantes son
16
/ / inaccesible desde el cdigo fuente
17
/ / v donde an no ha sido
18
para cada vecino v de u :
19 retirados de Q.
alt : = dist [ u ] + dist_between ( u , v );
20
/ / Relax (u, v, a)
21
si alt <dist [ v ]:
22 dist [ v ]: = alt ;
23 anterior [ v ]: = u ;
/ / v Reordenar en la cola de
24-key disminucin v en Q ;
25
retorno dist;
Ahora secuencia Ses la lista de vrtices que constituyen una de las rutas ms cortas desde origena destino, o la secuencia vaca si no existe camino.
Un problema ms general sera la de encontrar todos los caminos ms cortos entre origeny destino(puede haber varios diferentes de la misma longitud). Entonces, en
lugar de almacenar nicamente un solo nodo en cada entrada anterior []queremos almacenar todos los nodos que satisfacen la condicin de relajacin. Por ejemplo, si
ambos Ry fuenteconectarse a dianay dos de ellos se encuentran en diferentes caminos ms cortos a travs de destino(ya que el coste del borde es la misma en
ambos casos), entonces podramos aadir tanto ry fuentepara anterior [ objetivo ]. Cuando el algoritmo termina, anterior []estructura de datos en realidad
se describir un grfico que es un subconjunto del grfico original con algunos bordes eliminados. Su propiedad clave ser que si el algoritmo se ejecuta con algn nodo de
partida, a continuacin, cada camino desde el nodo a cualquier otro nodo en el grfico de nuevo ser el camino ms corto entre los nodos en el grfico original, y todos los
caminos de esa longitud de el grfico original estar presente en la nueva grfica. Luego, para encontrar realmente todos estos caminos cortos entre dos nodos dados
usaramos un algoritmo de localizacin del surco en el grfico de nuevo, como la bsqueda en profundidad.
Tiempo de funcionamiento
Un lmite superior del tiempo de ejecucin de algoritmo de Dijkstra en un grfico con bordes
notacin de orden O .
y vrtices
en.wikipedia.org/wiki/Dijkstra's_algorithm
usando la
es
2/4
01/11/12
Para los grafos dispersos , es decir, los grficos con mucho menos de
los bordes, el algoritmo de Dijkstra se puede implementar de manera ms eficiente
mediante el almacenamiento de la grfica en forma de listas de adyacencia y utilizando una pila binaria , el emparejamiento montn , o montn de Fibonacci como una cola
de prioridad para aplicar extraer mnimo eficiente. Con un montn binario, el algoritmo requiere
tiempo (que est dominada por
, suponiendo que el grafo es conexo). Para evitar la O (| V |) consulta en disminucin-key paso en un montn binario vainilla, es necesario mantener un
ndice suplementario asignacin de cada vrtice al ndice del montn (y mantenerlo al da como colas de prioridad cambios), por lo que es tener slo
el
tiempo en su lugar. El heap de Fibonacci mejora esto
.
Tenga en cuenta que para los grficos acclicos dirigidos , es posible encontrar caminos ms cortos desde un vrtice de inicio dado en el tiempo lineal, mediante el
procesamiento de los vrtices en un orden topolgico, y el clculo de la longitud de la trayectoria para cada vrtice a la longitud mnima obtenida a travs de cualquiera de
sus bordes entrantes. [ 3 ]
al
es una parfrasis de Bellman famoso Principio de optimalidad en el contexto del problema del camino ms corto.
Vase tambin
Euclidiana camino ms corto
Rellenar
Larga trayectoria problema
Notas
1. ^ Dijkstra, Edsger, Thomas J. Misa, Editor (2010-08). "Una entrevista con Edsger W. Dijkstra." Communications of the ACM 53 (8): 41-47. doi : 10.1145/1787234.1787249
(http://dx.doi.org/10.1145%2F1787234.1787249) . "Cul es el camino ms corto para viajar a Rotterdam Groningen? Es el algoritmo de la ruta ms corta que he diseado en
unos 20 minutos. Una maana fui de compras con mi novia joven y cansado, se sent en la terraza de un caf a beber una taza de caf y me qued pensando si podra hacer
esto, y luego dise el algoritmo de la ruta ms corta. "
2. ^ Dijkstra 1959
3. ^ http://www.boost.org/doc/libs/1_44_0/libs/graph/doc/dag_shortest_paths.html
4. ^ Sniedovich, M. (2006). "algoritmo de Dijkstra revisited: la conexin de programacin dinmica" (http://matwbn.icm.edu.pl/ksiazki/cc/cc35/cc3536.pdf) ( PDF ). Journal of
Control y Ciberntica 35 (3): 599-620 . . http://matwbn.icm.edu.pl/ksiazki/cc/cc35/cc3536.pdf Versin en lnea del peridico con mdulos interactivos computacionales.
(http://www.ifors.ms.unimelb.edu.au/tutorial/dijkstra_new/index.html)
5. ^ . Denardo, EV (2003) Programacin Dinmica: Modelos y Aplicaciones . Mineola, NY: Dover Publications . ISBN 978-0-486-42810-9 .
6. ^ . Sniedovich, M. (2010) Programacin Dinmica: Fundamentos y Principios . Francis & Taylor . ISBN 978-0-8247-4099-3 .
7. ^ Dijkstra 1959 , p. 270
Referencias
Dijkstra, EW (1959). "Una nota sobre dos problemas en relacin con los grficos" (http://www-m3.ma.tum.de/twiki/pub/MN0506/WebHome/dijkstra.pdf) .
Numerische Mathematik 1 :. 269-271 doi : 10.1007/BF01386390 (http://dx.doi.org/10.1007%2FBF01386390) . http://wwwm3.ma.tum.de/twiki/pub/MN0506/WebHome/dijkstra.pdf .
en.wikipedia.org/wiki/Dijkstra's_algorithm
3/4
01/11/12
Cormen, Thomas H. ; Leiserson, Charles E. , Rivest, Ronald L. ; Stein, Clifford (2001). "Artculo 24.3: algoritmo de Dijkstra." Introduccin a los Algoritmos
(Segunda ed.). MIT Press y McGraw-Hill . pp 595-601. ISBN 0-262-03293-7 .
Fredman, Michael Lawrence ; Tarjan, Robert E. . (1984) "montones de Fibonacci y sus usos en la mejora de los algoritmos de optimizacin de redes"
(http://www.computer.org/portal/web/csdl/doi/10.1109/SFCS.1984.715934) . Simposio 25a anual sobre Fundamentos de Ciencias de la Computacin ( IEEE
): 338-346. doi : 10.1109/SFCS.1984.715934 (http://dx.doi.org/10.1109%2FSFCS.1984.715934) .
http://www.computer.org/portal/web/csdl/doi/10.1109/SFCS.1984.715934 .
Fredman, Michael Lawrence ; Tarjan, Robert E. (1987). "montones de Fibonacci y sus usos en la mejora de los algoritmos de optimizacin de redes"
(http://portal.acm.org/citation.cfm?id=28874) . Revista de la Asociacin de Maquinaria de Computacin 34 (3): 596-615. doi : 10.1145/28869.28874
(http://dx.doi.org/10.1145%2F28869.28874) . http://portal.acm.org/citation.cfm?id=28874 .
Zhan, F. Benjamin; medioda, Charles E. (febrero de 1998). "Shortest Path Algoritmos: una evaluacin con Real Networks Road". Transporte Ciencia 32 (1):. 6573 doi : 10.1287/trsc.32.1.65 (http://dx.doi.org/10.1287%2Ftrsc.32.1.65) .
Leyzorek, M.; Gray, RS; Johnson, AA; Ladew, WC; Meaker, Jr., SR; Petry, RM; Seitz, RN (1957). Investigacin de Tcnicas Modelo - Primer informe anual
- 06 de junio 1956 - 1 de julio 1957 - Un Estudio de Tcnicas de modelo para los sistemas de comunicacin . Cleveland, Ohio: Case Institute of Technology.
Enlaces externos
Entrevista de historia oral con Edsger W. Dijkstra (http://purl.umn.edu/107247) , Charles Babbage Instituto de la Universidad de Minnesota, Minneapolis.
Algoritmo de Dijkstra en C # (http://www.codeproject.com/KB/recipes/ShortestPathCalculation.aspx)
Prioridad rpida implementacin de la cola del algoritmo de Dijkstra en C # (http://www.codeproject.com/KB/recipes/FastHeapDijkstra.aspx)
Applet de Carla Laffra de Pace University (http://www.dgp.toronto.edu/people/JamesStewart/270/9798s/Laffra/DijkstraApplet.html)
Animacin del algoritmo de Dijkstra (http://www.cs.sunysb.edu/~skiena/combinatorica/animations/dijkstra.html)
Visualizacin del Algoritmo de Dijkstra (http://students.ceid.upatras.gr/~papagel/english/java_docs/minDijk.htm)
Problema del camino ms corto: Algoritmo de Dijkstra (http://www-b2.is.tokushima-u.ac.jp/~ikeda/suuri/dijkstra/Dijkstra.shtml)
Applet de Dijkstra Algoritmo (http://www.unf.edu/~wkloster/foundations/DijkstraApplet/DijkstraApplet.htm)
Open Source Java paquete de grficos con la aplicacin del algoritmo de Dijkstra (http://code.google.com/p/annas/)
Haskell implementacin del algoritmo de Dijkstra (http://bonsaicode.wordpress.com/2011/01/04/programming-praxis-dijkstras-algorithm/) sobre Bonsai cdigo
Java Implementacin del algoritmo de Dijkstra (http://algowiki.net/wiki/index.php?title=Dijkstra's_algorithm) en AlgoWiki
QuickGraph, Estructuras de Datos y Algoritmos grficas de. NET (http://quickgraph.codeplex.com/)
Implementacin en Boost C + + biblioteca (http://www.boost.org/doc/libs/1_43_0/libs/graph/doc/dijkstra_shortest_paths.html)
Implementacin en T-SQL (http://hansolav.net/sql/graphs.html)
Una biblioteca de Java para la ruta de bsqueda con el algoritmo de Dijkstra y el ejemplo de subprograma (http://www.stackframe.com/software/PathFinder)
Un programa de MATLAB para el algoritmo de Dijkstra (http://www.mathworks.com/matlabcentral/fileexchange/20025-advanced-dijkstras-minimum-pathalgorithm)
Obtenido de " 27s_algorithm% http://en.wikipedia.org/w/index.php?title=Dijkstra & oldid = 520802894 "
Categoras :1959 en la informtica Algoritmos de grafos Algoritmos de bsqueda Los algoritmos de enrutamiento Optimizacin combinatoria
Esta pgina fue modificada por ltima vez el 31 de octubre de 2012 a las 21:08.
El texto est disponible bajo la Licencia Creative Commons Reconocimiento-Compartir bajo la misma licencia , condiciones adicionales pueden aplicar. Ver
Trminos de uso para ms detalles.
Wikipedia es una marca registrada de la Wikimedia Foundation, Inc. , una organizacin sin fines de lucro.
en.wikipedia.org/wiki/Dijkstra's_algorithm
4/4