fbpx
Wikipedia

Algoritmo de Dijkstra

El algoritmo de Dijkstra, también llamado algoritmo de caminos mínimos, es un algoritmo para la determinación del camino más corto, dado un vértice origen, hacia el resto de los vértices en un grafo que tiene pesos en cada arista. Su nombre alude a Edsger Dijkstra, científico de la computación de los Países Bajos que lo concibió en 1956 y lo publicó por primera vez en 1959.[1][2]

Algoritmo de Dijkstra

Ejecución del algoritmo de Dijkstra
Tipo Algoritmo de búsqueda
Problema que resuelve Problema del camino más corto
Estructura de datos Grafo
Creador Edsger Dijkstra
Fecha 1959
Clase de complejidad P
Tiempo de ejecución
Peor caso

La idea subyacente en este algoritmo consiste en ir explorando todos los caminos más cortos que parten del vértice origen y que llevan a todos los demás vértices; cuando se obtiene el camino más corto desde el vértice origen hasta el resto de los vértices que componen el grafo, el algoritmo se detiene. Se trata de una especialización de la búsqueda de costo uniforme y, como tal, no funciona en grafos con aristas de coste negativo (al elegir siempre el nodo con distancia menor, pueden quedar excluidos de la búsqueda nodos que en próximas iteraciones bajarían el costo general del camino al pasar por una arista con costo negativo).[cita requerida]

Una de sus aplicaciones más importantes reside en el campo de la telemática. Gracias a él, es posible resolver grafos con muchos nodos, lo que sería muy complicado resolver sin dicho algoritmo, encontrando así las rutas más cortas entre un origen y todos los destinos en una red.[cita requerida]

Algoritmo

Teniendo un grafo dirigido ponderado de   nodos no aislados, sea   el nodo inicial. Un vector   de tamaño   guardará al final del algoritmo las distancias desde   hasta el resto de los nodos.

  1. Inicializar todas las distancias en   con un valor infinito relativo, ya que son desconocidas al principio, exceptuando la de  , que se debe colocar en  , debido a que la distancia de   a   sería  .
  2. Sea   (Se toma   como nodo actual).
  3. Se recorren todos los nodos adyacentes de a, excepto los nodos marcados. Se les llamará nodos no marcados vi.
  4. Para el nodo actual, se calcula la distancia tentativa desde dicho nodo hasta sus vecinos con la siguiente fórmula: dt(vi) = Da + d(a,vi). Es decir, la distancia tentativa del nodo ‘vi’ es la distancia que actualmente tiene el nodo en el vector D más la distancia desde dicho nodo ‘a’ (el actual) hasta el nodo vi. Si la distancia tentativa es menor que la distancia almacenada en el vector, entonces se actualiza el vector con esta distancia tentativa. Es decir, si dt(vi) < Dvi → Dvi = dt(vi)
  5. Se marca como completo el nodo a.
  6. Se toma como próximo nodo actual el de menor valor en D (puede hacerse almacenando los valores en una cola de prioridad) y se regresa al paso 3, mientras existan nodos no marcados.

Una vez terminado al algoritmo,   estará completamente lleno.

Complejidad

Orden de complejidad del algoritmo:

O(|V|²+|A|) = O(|V|²), sin utilizar cola de prioridad, :O((|A|+|V|) log |V|) = O(|A| log |V|) utilizando cola de prioridad (por ejemplo, un montículo binario o un árbol binario balanceado). Por otro lado, si se utiliza un montículo de Fibonacci, sería O(|V| log |V|+|A|).

La complejidad computacional del algoritmo de Dijkstra se puede calcular contando las operaciones realizadas:

  • El algoritmo consiste en n-1 iteraciones, como máximo. En cada iteración, se añade un vértice al conjunto distinguido.
  • En cada iteración, se identifica el vértice con la menor etiqueta entre los que no están en Sk. El número de estas operaciones está acotado por n-1.
  • Además, se realizan una suma y una comparación para actualizar la etiqueta de cada uno de los vértices que no están en Sk.

Luego, en cada iteración se realizan a lo sumo 2(n-1) operaciones.

Entonces:

Teorema: El algoritmo de Dijkstra realiza O(n²) operaciones (sumas y comparaciones) para determinar la longitud del camino más corto entre dos vértices de un grafo ponderado simple, conexo y no dirigido con n vértices.

En general:

Tiempo de ejecución = O(|A|.𝑻_𝒅𝒌+|v|.𝑻_𝒅𝒎)
|A|: Número de aristas
𝑻_𝒅𝒌: Complejidad de disminuir clave
|V|: Número de vértices
𝑻_𝒅𝒎: Complejidad de extraer mínimo

Pseudocódigo

Estructura de datos auxiliar: Q = Estructura de datos cola de prioridad (se puede implementar con un montículo)

 DIJKSTRA (Grafo G, nodo_fuente s) para uV[G] hacer distancia[u] = INFINITO padre[u] = NULL visto[u] = false distancia[s] = 0 adicionar (cola, (s, distancia[s])) mientras que cola no es vacía hacer u = extraer_mínimo(cola) visto[u] = true para todos v ∈ adyacencia[u] hacer si ¬ visto[v] si distancia[v] > distancia[u] + peso (u, v) hacer distancia[v] = distancia[u] + peso (u, v) padre[v] = u adicionar(cola,(v, distancia[v])) 

Otra versión en pseudocódigo sin cola de prioridad

función Dijkstra (Grafo G, nodo_salida s) //Usaremos un vector para guardar las distancias del nodo salida al resto entero distancia[n] //Inicializamos el vector con distancias iniciales booleano visto[n] //vector de boleanos para controlar los vértices de los que ya tenemos la distancia mínima para cada w ∈ V[G] hacer Si (no existe arista entre s y w) entonces distancia[w] = Infinito //puedes marcar la casilla con un -1 por ejemplo Si_no distancia[w] = peso (s, w) fin si fin para distancia[s] = 0 visto[s] = cierto //n es el número de vértices que tiene el Grafo mientras que (no_estén_vistos_todos) hacer vértice = tomar_el_mínimo_del_vector distancia y que no esté visto; visto[vértice] = cierto; para cada w ∈ sucesores (G, vértice) hacer si distancia[w]>distancia[vértice]+peso (vértice, w) entonces distancia[w] = distancia[vértice]+peso (vértice, w) fin si fin para fin mientras fin función. 

Al final, tenemos en el vector distancia en cada posición la distancia mínima del vértice salida a otro vértice cualquiera.

Formulación del algoritmo Dijkstra

Para llevar a cabo la formulación de un modelo de red con el algoritmo Dijkstra es necesario saber de los nodos de inicio, de final y de transbordo de la red, posteriormente se analizan las etiquetas que se presentan en los arcos de la red, para así poder determinar la función objetivo del problema a formular.

En el siguiente ejemplo se presenta la formulación del modelo de Red de "Ejecución del algoritmo de Dijkstra"

Se formulan las variables de decisión denominadas Xij, que son variables binarias y determinan la activación del arco que conecta el nodo i con j.

En la red que "Ejecución del algoritmo de Dijkstra" las variables de decisión del problema son: X12,X13,X16,X23,X24,X36,X34,X65,X45.

Posteriormente se plantea la función objetivo que consiste en tomar la ruta que genere el menor valor de etiquetas de toda la red a través de arcos que conectan los nodos.

Función Objetivo= Minimizar 7*X12+9*X13+ 14*X16+10*X23+15*X24+2*X36+11*X34+9X65+6X45

Restricciones del problema. Para llevar a cabo el desarrollo de las restricciones del problema es necesario conocer el nodo de inicio, que en el caso de la red es el nodo 1, el nodo final que es el nodo 5 y los nodos de transbordo que son 2,3,4 y 6. Una vez identificados los nodos de la red se plantean las restricciones del problema

Restricciones del nodo inicial y final: También denominadas restricciones de oferta y demanda en algunos modelos de formulación. Estas restricciones le indican al modelo que solo debe tomar un arco que sale del nodo inicial y un arco que llega al nodo final, esto con el objetivo de garantizar que se cumplan las condiciones del algoritmo Dijkstra.

En el caso de la formulación del modelo las restricciones del nodo inicial y final son:

Nodo Inicial: X12 +X 13 +X16 = 1

Nodo Final: X65 + X45 = 1 .

Restricciones de nodos transbordo: Estas restricciones también denominadas restricciones de balance, tienen el objetivo de garantizar que todo el flujo que entra en el nodo de transbordo de igual manera debe salir, Estas restricciones se deben generar por cada uno de los nodos de transbordo de la red, en el caso del ejemplo, las restricciones de transbordo son:

Nodo 2: X12= X23 +X24

Nodo 3: X13+X23= X36+X34

Nodo 4 :X24+X34= X45

Nodo 6 :X16+X36 =X65

Restricciones de no negatividad: Con estas restricciones se garantiza que las variables del modelo no van a tomar valores negativos haciendo que el modelo de infectable.

Una vez planteadas todas las restricciones del modelo que garantice que se va a cumplir el algoritmo de Dijkstra en la red, se procede a resolver el modelo mediante algún software que permita obtener la solución óptima de dicho modelo.

Véase también

Referencias

  1. Frana, Phil (August 2010). «An Interview with Edsger W. Dijkstra». Communications of the ACM 53 (8): 41-47. doi:10.1145/1787234.1787249. 
  2. Dijkstra, E. W. (1959). «A note on two problems in connexion with graphs». Numerische Mathematik 1: 269-271. S2CID 123284777. doi:10.1007/BF01386390. 

Enlaces externos

  •   Wikimedia Commons alberga una galería multimedia sobre Algoritmo de Dijkstra.
  •   Wikilibros alberga un libro o manual sobre algoritmo de Dijkstra.
  • Presentación del algoritmo de Dijkstra
  • Video del algoritmo de Dijkstra
  • (en inglés)
  • Graph módulo Perl en CPAN
  • Bio::Coordinate::Graph módulo Perl en CPAN que implementa el algoritmo de Dijkstra
  • Algoritmo de Dijkstra en Javascript. Resolución en línea del algoritmo de Dijkstra.
  • Optimización del algoritmo del camino más corto entre todos los nodos de un grafo no dirigido. Comparación entre el algoritmo de Dijkstra y el de Floyd-Warshall, y método para optimizar el primero.
  • Distintas implementaciones del algoritmo en RosettaCode.org
  • Algoritmo de Dijkstra en PHP
  •   Datos: Q8548
  •   Multimedia: Dijkstra's algorithm

algoritmo, dijkstra, algoritmo, dijkstra, también, llamado, algoritmo, caminos, mínimos, algoritmo, para, determinación, camino, más, corto, dado, vértice, origen, hacia, resto, vértices, grafo, tiene, pesos, cada, arista, nombre, alude, edsger, dijkstra, cien. El algoritmo de Dijkstra tambien llamado algoritmo de caminos minimos es un algoritmo para la determinacion del camino mas corto dado un vertice origen hacia el resto de los vertices en un grafo que tiene pesos en cada arista Su nombre alude a Edsger Dijkstra cientifico de la computacion de los Paises Bajos que lo concibio en 1956 y lo publico por primera vez en 1959 1 2 Algoritmo de DijkstraEjecucion del algoritmo de DijkstraTipoAlgoritmo de busquedaProblema que resuelveProblema del camino mas cortoEstructura de datosGrafoCreadorEdsger DijkstraFecha1959Clase de complejidadPTiempo de ejecucionPeor casoO E V log V displaystyle O E V log V editar datos en Wikidata La idea subyacente en este algoritmo consiste en ir explorando todos los caminos mas cortos que parten del vertice origen y que llevan a todos los demas vertices cuando se obtiene el camino mas corto desde el vertice origen hasta el resto de los vertices que componen el grafo el algoritmo se detiene Se trata de una especializacion de la busqueda de costo uniforme y como tal no funciona en grafos con aristas de coste negativo al elegir siempre el nodo con distancia menor pueden quedar excluidos de la busqueda nodos que en proximas iteraciones bajarian el costo general del camino al pasar por una arista con costo negativo cita requerida Una de sus aplicaciones mas importantes reside en el campo de la telematica Gracias a el es posible resolver grafos con muchos nodos lo que seria muy complicado resolver sin dicho algoritmo encontrando asi las rutas mas cortas entre un origen y todos los destinos en una red cita requerida Indice 1 Algoritmo 2 Complejidad 3 Pseudocodigo 4 Otra version en pseudocodigo sin cola de prioridad 5 Formulacion del algoritmo Dijkstra 6 Vease tambien 7 Referencias 8 Enlaces externosAlgoritmo EditarTeniendo un grafo dirigido ponderado de N displaystyle N nodos no aislados sea x displaystyle x el nodo inicial Un vector D displaystyle D de tamano N displaystyle N guardara al final del algoritmo las distancias desde x displaystyle x hasta el resto de los nodos Inicializar todas las distancias en D displaystyle D con un valor infinito relativo ya que son desconocidas al principio exceptuando la de x displaystyle x que se debe colocar en 0 displaystyle 0 debido a que la distancia de x displaystyle x a x displaystyle x seria 0 displaystyle 0 Sea a x displaystyle a x Se toma a displaystyle a como nodo actual Se recorren todos los nodos adyacentes de a excepto los nodos marcados Se les llamara nodos no marcados vi Para el nodo actual se calcula la distancia tentativa desde dicho nodo hasta sus vecinos con la siguiente formula dt vi Da d a vi Es decir la distancia tentativa del nodo vi es la distancia que actualmente tiene el nodo en el vector D mas la distancia desde dicho nodo a el actual hasta el nodo vi Si la distancia tentativa es menor que la distancia almacenada en el vector entonces se actualiza el vector con esta distancia tentativa Es decir si dt vi lt Dvi Dvi dt vi Se marca como completo el nodo a Se toma como proximo nodo actual el de menor valor en D puede hacerse almacenando los valores en una cola de prioridad y se regresa al paso 3 mientras existan nodos no marcados Una vez terminado al algoritmo D displaystyle D estara completamente lleno Complejidad EditarOrden de complejidad del algoritmo O V A O V sin utilizar cola de prioridad O A V log V O A log V utilizando cola de prioridad por ejemplo un monticulo binario o un arbol binario balanceado Por otro lado si se utiliza un monticulo de Fibonacci seria O V log V A La complejidad computacional del algoritmo de Dijkstra se puede calcular contando las operaciones realizadas El algoritmo consiste en n 1 iteraciones como maximo En cada iteracion se anade un vertice al conjunto distinguido En cada iteracion se identifica el vertice con la menor etiqueta entre los que no estan en Sk El numero de estas operaciones esta acotado por n 1 Ademas se realizan una suma y una comparacion para actualizar la etiqueta de cada uno de los vertices que no estan en Sk Luego en cada iteracion se realizan a lo sumo 2 n 1 operaciones Entonces Teorema El algoritmo de Dijkstra realiza O n operaciones sumas y comparaciones para determinar la longitud del camino mas corto entre dos vertices de un grafo ponderado simple conexo y no dirigido con n vertices En general Tiempo de ejecucion O A 𝑻 𝒅𝒌 v 𝑻 𝒅𝒎 A Numero de aristas 𝑻 𝒅𝒌 Complejidad de disminuir clave V Numero de vertices 𝑻 𝒅𝒎 Complejidad de extraer minimoPseudocodigo EditarEstructura de datos auxiliar Q Estructura de datos cola de prioridad se puede implementar con un monticulo DIJKSTRA Grafo G nodo fuente s para u V G hacer distancia u INFINITO padre u NULL visto u false distancia s 0 adicionar cola s distancia s mientras que cola no es vacia hacer u extraer minimo cola visto u true para todos v adyacencia u hacer si visto v si distancia v gt distancia u peso u v hacer distancia v distancia u peso u v padre v u adicionar cola v distancia v Otra version en pseudocodigo sin cola de prioridad Editarfuncion Dijkstra Grafo G nodo salida s Usaremos un vector para guardar las distancias del nodo salida al resto entero distancia n Inicializamos el vector con distancias iniciales booleano visto n vector de boleanos para controlar los vertices de los que ya tenemos la distancia minima para cada w V G hacer Si no existe arista entre s y w entonces distancia w Infinito puedes marcar la casilla con un 1 por ejemplo Si no distancia w peso s w fin si fin para distancia s 0 visto s cierto n es el numero de vertices que tiene el Grafo mientras que no esten vistos todos hacer vertice tomar el minimo del vector distancia y que no este visto visto vertice cierto para cada w sucesores G vertice hacer si distancia w gt distancia vertice peso vertice w entonces distancia w distancia vertice peso vertice w fin si fin para fin mientras fin funcion Al final tenemos en el vector distancia en cada posicion la distancia minima del vertice salida a otro vertice cualquiera Formulacion del algoritmo Dijkstra EditarPara llevar a cabo la formulacion de un modelo de red con el algoritmo Dijkstra es necesario saber de los nodos de inicio de final y de transbordo de la red posteriormente se analizan las etiquetas que se presentan en los arcos de la red para asi poder determinar la funcion objetivo del problema a formular En el siguiente ejemplo se presenta la formulacion del modelo de Red de Ejecucion del algoritmo de Dijkstra Se formulan las variables de decision denominadas Xij que son variables binarias y determinan la activacion del arco que conecta el nodo i con j En la red que Ejecucion del algoritmo de Dijkstra las variables de decision del problema son X12 X13 X16 X23 X24 X36 X34 X65 X45 Posteriormente se plantea la funcion objetivo que consiste en tomar la ruta que genere el menor valor de etiquetas de toda la red a traves de arcos que conectan los nodos Funcion Objetivo Minimizar 7 X12 9 X13 14 X16 10 X23 15 X24 2 X36 11 X34 9X65 6X45Restricciones del problema Para llevar a cabo el desarrollo de las restricciones del problema es necesario conocer el nodo de inicio que en el caso de la red es el nodo 1 el nodo final que es el nodo 5 y los nodos de transbordo que son 2 3 4 y 6 Una vez identificados los nodos de la red se plantean las restricciones del problemaRestricciones del nodo inicial y final Tambien denominadas restricciones de oferta y demanda en algunos modelos de formulacion Estas restricciones le indican al modelo que solo debe tomar un arco que sale del nodo inicial y un arco que llega al nodo final esto con el objetivo de garantizar que se cumplan las condiciones del algoritmo Dijkstra En el caso de la formulacion del modelo las restricciones del nodo inicial y final son Nodo Inicial X12 X 13 X16 1Nodo Final X65 X45 1 Restricciones de nodos transbordo Estas restricciones tambien denominadas restricciones de balance tienen el objetivo de garantizar que todo el flujo que entra en el nodo de transbordo de igual manera debe salir Estas restricciones se deben generar por cada uno de los nodos de transbordo de la red en el caso del ejemplo las restricciones de transbordo son Nodo 2 X12 X23 X24Nodo 3 X13 X23 X36 X34Nodo 4 X24 X34 X45Nodo 6 X16 X36 X65Restricciones de no negatividad Con estas restricciones se garantiza que las variables del modelo no van a tomar valores negativos haciendo que el modelo de infectable Una vez planteadas todas las restricciones del modelo que garantice que se va a cumplir el algoritmo de Dijkstra en la red se procede a resolver el modelo mediante algun software que permita obtener la solucion optima de dicho modelo Vease tambien EditarAnexo Ejemplo de Algoritmo de Dijkstra Algoritmo de Bellman FordReferencias Editar Frana Phil August 2010 An Interview with Edsger W Dijkstra Communications of the ACM 53 8 41 47 doi 10 1145 1787234 1787249 Dijkstra E W 1959 A note on two problems in connexion with graphs Numerische Mathematik 1 269 271 S2CID 123284777 doi 10 1007 BF01386390 Enlaces externos Editar Wikimedia Commons alberga una galeria multimedia sobre Algoritmo de Dijkstra Wikilibros alberga un libro o manual sobre algoritmo de Dijkstra Presentacion del algoritmo de Dijkstra Video del algoritmo de Dijkstra Applets en Java para probar el algoritmo de Dijkstra en ingles Graph modulo Perl en CPAN Bio Coordinate Graph modulo Perl en CPAN que implementa el algoritmo de Dijkstra Algoritmo de Dijkstra en Javascript Resolucion en linea del algoritmo de Dijkstra Optimizacion del algoritmo del camino mas corto entre todos los nodos de un grafo no dirigido Comparacion entre el algoritmo de Dijkstra y el de Floyd Warshall y metodo para optimizar el primero Distintas implementaciones del algoritmo en RosettaCode org Algoritmo de Dijkstra en PHP Datos Q8548 Multimedia Dijkstra s algorithm Obtenido de https es wikipedia org w index php title Algoritmo de Dijkstra amp oldid 140768068, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos