Plus courts chemins, avec poids: l”algorithme de Dijkstra#
On considère le graphe suivant qui modélise un réseau routier :
%load_ext autoreload
%autoreload 2
from graph import examples
from dijkstra import *
G = examples.dijkstra()
G.show()
On souhaite calculer le plus court chemin entre deux sommets de ce graphe.
Exercice
Complétez la fonction
dijkstradu fichier dijkstra.py.Appliquez cette fonction au graphe
Gci-dessus:
### BEGIN SOLUTION
dijkstra(G, "A")
### END SOLUTION
Exercice, suite
Déduisez en la distance entre
AetJ, à mettre dans la variabledistance_AJ:
### BEGIN SOLUTION
distance_AJ = 487
### END SOLUTION
# Vérifie votre résultat sans dévoiler la solution, par la magie des fonctions de hachage :-)
import hashlib
assert hashlib.md5(bytes(distance_AJ)).hexdigest() == '2f6064003b888e403627e493532fc751'
distances = dijkstra(G, "A")[0]
assert distances["A"] == 0
assert sum(distances.values()) == 2774
Exercice, suite
Implantez la fonction
shortest_pathdans dijkstra.py, et utilisez là pour calculer un plus court chemin entreAetJdansG:
shortest_path(G, "A", "J")
Exercice, suite
Pour aller plus loin : Instrumentez votre fonction pour en visualiser l’exécution.
Problème 1: le trajet le plus rapide en métro de Montgallet à Billancourt ?
Le fichier metro_complet.txt contient la description d’un graphe modélisant le métro de Paris. Consultez son contenu pour en comprendre le format.
Implantez une fonction qui lit le fichier et renvoie le graphe qu’il contient sous la forme d’un objet de type
Graph.Utilisez la fonction
dijkstrapour calculer un plus court chemin de Montgallet à Billancourt! Vous stockerez la longueur de ce chemin dans dans la variabledistance.
### BEGIN SOLUTION
G = metro_network()
path, distance = metro_shortest_path(G, "Montgallet","Billancourt")
path
### END SOLUTION
## BEGIN SOLUTION
distance
### END SOLUTION
# Vérifie votre résultat sans dévoiler la solution, par la magie des fonctions de hachage :-)
import hashlib
assert hashlib.md5(bytes(int(distance))).hexdigest() == '47699f4b69b37670eb6ce45276ad9a30'