En el gráfico, hay nodos y bordes. Los nodos son los valores y los bordes son la ruta o las líneas que crean enlaces entre los dos nodos. En Python, podemos implementar los nodos y los bordes utilizando el diccionario anidado. Podemos representar los nodos como una clave y todas las rutas de ese nodo a otros nodos como un valor de esa clave en particular.
El algoritmo de Dijkstra se usa para encontrar la ruta más corta entre el nodo fuente y el nodo de destino. El enfoque de este algoritmo se usa llamado enfoque codicioso. Entonces, en este artículo, vamos a comprender los conceptos del algoritmo de Dijkstra y cómo podemos implementarlo utilizando la programación de Python.
El algoritmo de Dijkstra, como dijimos antes, está utilizando el concepto del enfoque codicioso. Podemos entender el enfoque codicioso en un término normal que encuentra la solución óptima de las opciones disponibles.
Pasos de algoritmo
El valor de distancia del nodo debe ser menor que los valores de distancia entre los nodos disponibles. Después de eso, elimine eso de la lista del diccionario porque eso ahora es actual_source_node.
Pasos de algoritmo de Dijkstra
El algoritmo de Dijkstra se usa para encontrar la ruta más corta entre el nodo fuente y el nodo de destino.
Paso 1: Para esto, primero tenemos que inicializar el nodo fuente como un 0 y otros nodos como ∞. Luego insertamos el par en el diccionario. Nuestro primer par será porque la distancia desde la fuente a la fuente en sí es 0 como se muestra en el gráfico y la tabla a continuación.
Nodo fuente | Nodo de destino | Dist desde el nodo fuente | Diccionario |
---|---|---|---|
0 | 0 | 0 | [0, 0] |
0 | 1 | ∞ | |
0 | 2 | ∞ | |
0 | 3 | ∞ | |
0 | 4 | ∞ | |
0 | 5 | ∞ |
Paso 2 En el diccionario, solo hay un par . Por lo tanto, tomamos esto como un Current_Source_Node y relajamos el peso de los bordes de todos los nodos adyacentes del Current_Source_Node (0).
nodo fuente actual | Nodo adyacente | Dist de la fuente (0) al nodo adyacente | Actualizar el peso de EGDE o no |
---|---|---|---|
0 | 1 | dist [1] = ∞ | Dist [1]> Dist_between [0 - 1] + Dist [0] I.e ∞> 5 + 0 Entonces, vamos a actualizar la distancia. Actualizar dist => Dist [1] = 5 y actualizar el par en el dict |
0 | 2 | dist [2] = ∞ | Dist [2]> Dist_between [0 - 2] + Distancia [0] I.e ∞> 1 + 0 Entonces, vamos a actualizar la distancia. Actualizar dist => Dist [2] = 1 y actualizar el par en el dict |
0 | 3 | dist [3] = ∞ | Dist [3]> Dist_between [0 - 3] + Dist [0] Entonces, vamos a actualizar la distancia. i.E ∞> 4 + 0 Actualización Dist, i.mi Dist [3] = 4 y actualizar el par en el dict |
Nodo fuente | Nodo de destino | Dist desde el nodo fuente | Diccionario |
---|---|---|---|
0 | 0 | 0 | [15] [2, 1] [3, 4] |
0 | 1 | 5 | |
0 | 2 | 1 | |
0 | 3 | 4 | |
0 | 4 | ∞ | |
0 | 5 | ∞ |
Paso 3: Ahora, eliminamos el siguiente par del diccionario para el actual_source_node. Pero la condición es que tenemos que elegir el nodo de valor de distancia mínima. Por lo tanto, elegimos el Diccionario y asignado como un Current_Source_Node y relajamos el peso de los bordes de todos los nodos adyacentes del Current_Source_Node (2).
nodo fuente actual | Nodo adyacente | Dist de la fuente (0) al nodo adyacente | Actualizar el peso de EGDE o no |
---|---|---|---|
2 | 0 | distancia [0] = 0 | Dist [0] < dist_between [ 2 - 0 ] + dist [ 2 ] i.e 0 dist_between [ 2 - 1 ] + dist [ 2 ] i.e 5 > 3 + 1 |
2 | 1 | distancia [1] = 5 | Entonces, vamos a actualizar la distancia. Actualizar dist ==> dist [1] = 4 y actualice el par en el Dict Dist [3]> Dist_between [2 - 3] + Dist [2] I.E 4> 2 + 1 |
2 | 3 | distancia [3] = 4 | Entonces, vamos a actualizar la distancia. Actualizar dist => dist [3] = 3 y actualice el par en el Dict Dist [4]> Dist_between [2 - 4] + Dist [2] I.e ∞> 1 + 1 |
2 | 4 | distancia [4] = ∞ | Entonces, vamos a actualizar la distancia. Actualizar dist => Dist [4] = 2 Actualizar el par en el dict |
Nodo fuente | Nodo de destino | Dist desde el nodo fuente | Diccionario |
---|---|---|---|
2 | 0 | 0 | [1, 4] [3, 3] [4, 2] |
2 | 1 | 4 | |
2 | 2 | 1 | |
2 | 3 | 3 | |
2 | 4 | 2 | |
2 | 5 | ∞ |
Etapa 4: Ahora, eliminamos el siguiente par del diccionario para elegir Current_Source_Node y relajar el peso de los bordes de todos los nodos adyacentes del Current_Source_Node (4).
nodo fuente actual | Nodo adyacente | Dist de la fuente (0) al nodo adyacente | Actualizar el peso de EGDE o no |
---|---|---|---|
4 | 1 | Dist [1] = 4 | Dist [1] < dist_between [ 4 - 1 ] + dist [ 4 ] i.e 4 < 8 + 2 No weight updation required. |
4 | 2 | Dist [2] = 1 | Dist [2] < dist_between [ 4 - 2 ] + dist [ 4 ] i.e 1 < 1 + 2 No weight updation required. |
4 | 3 | Dist [3] = 3 | Dist [3] < dist_between [ 4 - 3 ] + dist [ 4 ] i.e 3 < 2 + 2 No weight updation required. |
4 | 5 | dist [5] = ∞ | Entonces, vamos a actualizar la distancia. Actualizar dist => dist [5] = 5 Actualizar el par en el dict |
Nodo fuente | Nodo de destino | Dist desde el nodo fuente | Diccionario |
---|---|---|---|
4 | 0 | 0 | [1, 4] [3, 3] [5, 5] |
4 | 1 | 4 | |
4 | 2 | 1 | |
4 | 3 | 3 | |
4 | 4 | 2 | |
4 | 5 | 5 |
Paso 5: Eliminamos el siguiente par del diccionario para elegir Current_Source_Node y relajamos el peso de los bordes de todos los nodos adyacentes del Current_Source_Node (3).
nodo fuente actual | Nodo adyacente | Dist de la fuente (0) al nodo adyacente | Actualizar el peso de EGDE o no |
---|---|---|---|
3 | 0 | Dist [0] = 0 | Dist [0] < dist_between [ 3 - 0 ] + dist [ 3 ] i.e 0 < 4 + 3 No weight updation required. |
3 | 2 | Dist [2] = 1 | Dist [2] < dist_between [ 3 - 2 ] + dist [ 3 ] i.e 1 < 2 + 3 No weight updation required. |
3 | 4 | Dist [4] = 2 | Dist [4] < dist_between [ 3 - 4 ] + dist [ 3 ] i.e 2 < 2 + 3 No weight updation required. |
3 | 5 | Dist [5] = 5 | Entonces, vamos a actualizar la distancia. Actualizar dist =>Dist [5] = 4 Actualizar el par en el dict |
Nodo fuente | Nodo de destino | Dist desde el nodo fuente | Diccionario |
---|---|---|---|
3 | 0 | 0 | [1, 4] [5, 4] |
3 | 1 | 4 | |
3 | 2 | 1 | |
3 | 3 | 3 | |
3 | 4 | 2 | |
3 | 5 | 4 |
Paso 6: Eliminamos el siguiente par del diccionario para elegir Current_Source_Node y relajamos el peso de los bordes de todos los nodos adyacentes del Current_Source_Node (1).
nodo fuente actual | Nodo adyacente | Dist de la fuente (0) al nodo adyacente | Actualizar el peso de EGDE o no |
---|---|---|---|
1 | 0 | Dist [0] = 0 | distancia [0] < distance_between [ 1 - 0 ] + distance [ 1 ] i.e Since 0 < 5 + 4 No weight updation required. |
1 | 2 | Dist [2] = 1 | Dist [2] < dist_between [ 1 - 2 ] + dist [ 1 ] i.e 1 < 3 + 4 No weight updation required. |
1 | 4 | Dist [4] = 2 | Dist [4] < dist_between [ 1 - 4 ] + dist [ 1 ] i.e 2 < 8 + 4 No weight updation required. |
Nodo fuente | Nodo de destino | Dist desde el nodo fuente | Diccionario |
---|---|---|---|
1 | 0 | 0 | [5, 4] |
1 | 1 | 4 | |
1 | 2 | 1 | |
1 | 3 | 3 | |
1 | 4 | 2 | |
1 | 5 | 4 |
Paso 7: Ahora, eliminamos el siguiente par del diccionario para elegir Current_Source_Node y relajar el peso de los bordes de todos los nodos adyacentes del Current_Source_Node (5).
nodo fuente actual | Nodo adyacente | Dist de la fuente (0) al nodo adyacente | Actualizar el peso de EGDE o no |
---|---|---|---|
5 | 3 | Dist [3] = 3 | ddist [3] < dist_between [ 5 - 3 ] + dist [ 5 ] i.e 3 < 1 + 4 No weight updation required. |
5 | 4 | Dist [4] = 2 | Dist [4] < dist_between [ 5 - 4 ] + dist [ 5 ] i.e 2 < 3 + 4 No weight updation required. |
Ahora, el diccionario es nulo y no queda ningún par. Entonces, nuestro algoritmo ahora se detiene. Y obtuvimos toda la ruta más corta desde los nodos de origen principal hasta todos los nodos de los demás como se muestra a continuación:
Nodo fuente | Nodo de destino | Dist desde el nodo fuente | Diccionario |
---|---|---|---|
0 | 0 | 0 | |
0 | 1 | 4 | |
0 | 2 | 1 | |
0 | 3 | 3 | |
0 | 4 | 2 | |
0 | 5 | 4 |
Código de Python: A continuación se muestra la implementación del algoritmo anterior.
1 # Algoritmo de Dijkstra en PythonLínea 9 a 53: La explicación de esta clase se da a continuación:
Línea 9: Creamos una clase el nombre Dijkstraalgorithm.
Línea 11 a 16: Inicializamos el adjacentList y Node_Count. El adyacentList es un dicte que usamos para almacenar el nodo y todos sus nodos adyacentes, como el nodo 0: . Este código si imprime, mostrará el resultado como a continuación:
Defaultdict (El resultado anterior muestra que estamos creando un dict que tiene todos los detalles de un nodo particular y sus nodos adyacentes.
Línea 21 a 22: Inicializamos todos los nodos con un valor infinito y nodos de origen con 0 según nuestro algoritmo.
Línea 26: Inicializamos el dict_of_node_dist según nuestro algoritmo, que es nuestro primer par.
Línea 28 a 50: Implementamos según las líneas de algoritmo 4 a 8.
Línea 57 a 83: Creamos un objeto de la clase Dijksstraalgorithm y pasamos el número de nodos en el gráfico. Luego llamamos al método adjacente_nodelist usando el gráfico de objeto para hacer un dict de todos los nodos con sus nodos adyacentes. El nodo será la clave y los nodos adyacentes y la distancia serán sus valores.
Línea 83: Llamamos al método dijkstras_shortest_path (0) usando el gráfico de objeto.
Producción: Algoritmo de Python Dijkstra.py
Conclusión
En este artículo, hemos estudiado el algoritmo de Dijkstra paso a paso. También hemos estudiado la idea de enfoque codicioso. No incluimos los detalles sobre el enfoque codicioso porque volveremos a este tema (enfoque codicioso) más tarde pronto.
El código de este artículo está disponible en el enlace GitHub:
https: // github.com/shekharpandey89/dijkstra-s-algorithm