plus courts chemins dans un graphe -...
TRANSCRIPT
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Plus courts chemins dans un graphe
F. Guinand, S. Balev
Master I - Le Havre
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Plan
1 E. W. Dijkstra
2 Plus court chemin
3 Algorithme de Dijkstra
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Le plus court chemin d’un graphe n’est jamais celuique l’on croit, il peut surgir de nulle part, et la plupartdu temps il n’existe pas
E. W. Dijkstra
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Edsger Wybe Dijkstra (1930 - 2002)
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
E.W. Dijkstramathématicien et informaticiendébut en physique théoriquecontributions majeures en informatique
notion de sémaphore, section critique, dîner desphilosophesprogrammation structurée→ sus au gotocontributeur de Algol W, Algol.théorie des graphes (1950s, 60s)=⇒ prix Turing en 1972notion d’autostabilisation en informatique répartie (1974)
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
L’informatique n’est pas plus la science desordinateurs que l’astronomie n’est celle des
télescopes
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Tester un programme peut démontrer la présence debugs, jamais leur absence
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
La programmation par objets est une idéeexceptionnellement mauvaise qui ne pouvait naître
qu’en Californie
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Pourquoi s’intéresse t-on à ces problèmes ?
1 postier chinois et plus généralement problèmes detournées
2 ordonnancement3 routage4 programmation dynamique5 labyrinthe6 investissements/gestion de stocks
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Types de problèmesle problème de la détermination d’un plus court cheminentre deux sommets,le problème de la détermination des plus courts chemind’un sommet vers l’ensemble des autres sommets dugraphe,le calcul du plus court chemin pour l’ensemble des couplesde sommets du graphe.
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Contraintessi les longueurs sont toutes positives ou nullessi les longueurs sont toutes égales à l’unitési le graphe et les longueurs sont quelconquessi le graphe est sans circuitsi le graphe est connexe ou fortement connexe (grapheorienté)
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
algorithme de Dijkstraalgorithme de Bellman-Fordalgorithme de Floyd-Warshall
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Problème
Dans un graphe orienté G(V ,A), trouver les plus courtschemins à partir d’un sommet de départ s ∈ V vers tous lesautres sommets.
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Principe
On maintientT - ensemble de sommets traitésd(v), v ∈ V - longueur du plus court chemin de s à v qui nepasse que par des sommets de T
À chaque itérationon choisit le sommet non-traité le plus proche de Ton l’ajoute à Ton met à jour les d de ses voisins
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Algorithme – version simple
T ← ∅Pour v ∈ V Faire
d(v)←∞finPourd(s)← 0
TantQue (T 6= V )v ← argmin{d(u) : u 6∈ T}T ← T ∪ {v}Pour u ∈ voisins(v) Faire
d(u)← min{d(u), d(v) + wvu}finPour
finTantQue
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Exemple
4 7
1
1
11
145
52
2 4
2
a b c
d e
fg
h i j
Trouver les plus courts chemins de c vers tous les autressommets
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
QuestionOn a les longueurs des chemins, mais comment obtenir leschemins eux-mêmes ?
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Maintien des chemins
T ← ∅Pour v ∈ V Faire
d(v)←∞finPourd(s)← 0pred(s)← nullTantQue (T 6= V )
v ← argmin{d(u) : u 6∈ T}T ← T ∪ {v}Pour u ∈ voisins(v) Faire
Si (d(u) > d(v) + wvu) Alorsd(u)← d(v) + wvu
pred(u)← vfinSi
finPourfinTantQue
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Terminaison et correction
Démonstration par récurrence sur la taille de T avec leshypothèses suivantes :
Pour v ∈ T , d(v) est la longueur du plus court chemin de sà vPour v 6∈ T , d(v) est la longueur du plus court chemin nepassant que par sommets de T pour arriver en v
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Complexité
Implémentation naïve : O(n2)
n itérations de la boucle TantQuerecherche du sommet avec d minimum : O(n)
On peut réduire la complexité en utilisant des structures dedonnées performantes
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
File prioritaire
Une structure de données permettant de stocker des élémentstriés (partiellement) en fonction de leur « priorité » et d’extrairerapidement l’élément de priorité minimum. Opérations :
F.estVide() : permet de vérifier si la fille est videF.extraireMin() : permet de récupérer l’élément de prioritéminimumF.ajouter(e, p) : permet d’ajouter l’élément e de priorité p.Si e est déjà dans F, change sa priorité.
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Algorithme – avec file de priorité
Pour v ∈ V Faired(v)←∞
finPourd(s)← 0F.initialiser()F.ajouter(s, 0)TantQue (non F.estVide())
v ← F.extraireMin()Pour u ∈ voisins(v) Faire
Si (d(u) > d(v) + wvu) Alorsd(u)← d(v) + wvu
F.ajouter(u, d(u))finSi
finPourfinTantQue
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
File prioritaire – implémentation avec listes
Liste non-triéF.estVide() : O(1)F.extraireMin() : O(n)F.ajouter(e, p) : O(1)
Liste triéF.estVide() : O(1)F.extraireMin() : O(1)F.ajouter(e, p) : O(n)
Dans les deux cas, la complexité de l’algorithme de Dijkstrareste O(n2)
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
File prioritaire – implémentation performante
Heureusement, il existe des structures de données, telles queles tas ou les arbres binaires de recherche équilibréspermettant de rendre performantes les deux opérations :
F.estVide() : O(1)F.extraireMin() : O(log n)F.ajouter(e, p) : O(log n)
Avec ce type de structures, la complexité de l’algorithme deDijkstra passe à O(m + n log n)
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Complexité – récapitulation
Impléméntation naïve : O(n2)
Implémentation efficace : O(m + n log n)
Exemple. Soit n = 1000 et m = 10000Impléméntation naïve : ≈ 1 000 000 opérationsImplémentation efficace : ≈ 20 000Accélération : ≈ ×50
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Exercice
Démontrer que l’algorithme de Dijkstra effectue un parcoursdans le graphe
Rappel. Un parcours d’un graphe à partir d’un sommet s est lagénération d’une liste L de sommets, telle que :
L contient tous les sommets de G atteignables à partir des ;s est le premier élément de L ;chaque sommet de G est au plus une fois dans L ;pour chaque sommet v 6= s dans L il existe un voisin de vavant lui dans L
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
LimitationsL’algorithme de Dijkstra ne s’applique que pour des graphesdont le poids des arêtes/arcs est positif ou nul.
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Exemple pour lequel Dijkstra ne s’applique pas
12
−2
4 52
−5
a
b c d
e f
Trouver les plus courts chemins de a vers tous les autressommets
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Le cas de poids négatifs
Comment adapter l’algorithme de Dijkstra pour le cas de poidsnégatifs ?
Procedure maj((u, v) ∈ E)d(v) = min{d(v), d(u) + wuv}
FinProcedure
Donne la valeur correcte de d(v) si u et le sommet avant vdans le plus court chemin de s à v et si la valeur de d(u)est correcteQuel que soit le nombre d’appels, d(v) reste une bornesupérieure sur la distance entre s et v
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Le cas de poids négatifs
Considérons le plus court chemin entre s et v :
s − u1 − u2 − · · · − uk − v
Si la séquence des mises à jour inclut (s,u1), (u1,u2), . . . (uk , v)dans cet ordre (mais pas forcement consécutivement), ladistance de s à v sera correctement calculée.
Mais comment savoir le bon ordre ?→ Mettre à jour tous lesarcs n − 1 fois.
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Algorithme de Bellman-Ford
Pour v ∈ V Faired(v)←∞
finPourd(s)← 0
Répéter n − 1 foisPour e ∈ E faire
maj(e)finPour
finRépéter
Amélioration possible : s’arrêter si pendant une itération il n’y apas eu de mise à jour.
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Exercices
Correction et complexité de l’algorithme de Bellman-FordLe problème du plus court chemin est mal posé dans lecas de circuits négatifs. Néanmoins, on peut modifierl’algorithme de Bellman-Ford pour détecter ces circuits.Comment ?
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Le plus court chemin entre toutes les paires desommets
Principe :d(i , j , k) - la longueur du plus court chemin entre i et j enutilisant des sommets intermédiaires seulement parmi{1, . . . , k}Au début d(i , j ,0) = wij si (i , j) ∈ E et∞ sinonOn ajoute un sommet k à chaque itération en mettant àjour tous les d(i , j , k)
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. DijkstraPlus court chemin
Algorithme de Dijkstra
Algorithme de Floyd-Warshall
Pour i de 1 à n FairePour j de 1 à n Faire
d(i, j) = wij ou∞finPour
finPour
Pour k de 1 à n FairePour i de 1 à n Faire
Pour j de 1 à n Faired(i, j) = min{d(i, j), d(i, k) + d(k , j)}
finPourfinPour
finPour
F. Guinand, S. Balev Plus courts chemins dans un graphe