Vous êtes sur la page 1sur 35

E. W.

Dijkstra
Plus 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. Dijkstra
Plus 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. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Le plus court chemin d’un graphe n’est jamais celui


que l’on croit, il peut surgir de nulle part, et la plupart
du temps il n’existe pas

E. W. Dijkstra

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Edsger Wybe Dijkstra (1930 - 2002)

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

E.W. Dijkstra
mathématicien et informaticien
début en physique théorique
contributions majeures en informatique

notion de sémaphore, section critique, dîner des


philosophes
programmation structurée → sus au goto
contributeur de Algol W, Algol.
théorie des graphes (1950s, 60s)
=⇒ prix Turing en 1972
notion d’autostabilisation en informatique répartie (1974)

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

L’informatique n’est pas plus la science des


ordinateurs que l’astronomie n’est celle des
télescopes

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Tester un programme peut démontrer la présence de


bugs, jamais leur absence

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

La programmation par objets est une idée


exceptionnellement mauvaise qui ne pouvait naître
qu’en Californie

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Pourquoi s’intéresse t-on à ces problèmes ?

1 postier chinois et plus généralement problèmes de


tournées
2 ordonnancement
3 routage
4 programmation dynamique
5 labyrinthe
6 investissements/gestion de stocks

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Types de problèmes
le problème de la détermination d’un plus court chemin
entre deux sommets,
le problème de la détermination des plus courts chemin
d’un sommet vers l’ensemble des autres sommets du
graphe,
le calcul du plus court chemin pour l’ensemble des couples
de sommets du graphe.

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Contraintes
si les longueurs sont toutes positives ou nulles
si les longueurs sont toutes égales à l’unité
si le graphe et les longueurs sont quelconques
si le graphe est sans circuit
si le graphe est connexe ou fortement connexe (graphe
orienté)

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

algorithme de Dijkstra
algorithme de Bellman-Ford
algorithme de Floyd-Warshall

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Problème

Dans un graphe orienté G(V , A), trouver les plus courts


chemins à partir d’un sommet de départ s ∈ V vers tous les
autres sommets.

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Principe

On maintient
T - ensemble de sommets traités
d(v ), v ∈ V - longueur du plus court chemin de s à v qui ne
passe que par des sommets de T
À chaque itération
on choisit le sommet non-traité le plus proche de T
on l’ajoute à T
on met à jour les d de ses voisins

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Algorithme – version simple

T ←∅
Pour v ∈ V Faire
d(v ) ← ∞
finPour
d(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. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Exemple

a 4 b 7 c

5 1 4 1
1 2
d e g
f
2 5 1
1

h 2 4
i j

Trouver les plus courts chemins de c vers tous les autres


sommets
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Question
On a les longueurs des chemins, mais comment obtenir les
chemins eux-mêmes ?

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Maintien des chemins

T ←∅
Pour v ∈ V Faire
d(v ) ← ∞
finPour
d(s) ← 0
pred(s) ← null
TantQue (T 6= V )
v ← argmin{d(u) : u 6∈ T }
T ← T ∪ {v }
Pour u ∈ voisins(v ) Faire
Si (d(u) > d(v ) + wvu ) Alors
d(u) ← d(v ) + wvu
pred(u) ← v
finSi
finPour
finTantQue

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Terminaison et correction

Démonstration par récurrence sur la taille de T avec les


hypothèses suivantes :
Pour v ∈ T , d(v ) est la longueur du plus court chemin de s
àv
Pour v 6∈ T , d(v ) est la longueur du plus court chemin ne
passant que par sommets de T pour arriver en v

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Complexité

Implémentation naïve : O(n2 )


n itérations de la boucle TantQue
recherche du sommet avec d minimum : O(n)
On peut réduire la complexité en utilisant des structures de
données performantes

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

File prioritaire

Une structure de données permettant de stocker des éléments


triés (partiellement) en fonction de leur « priorité » et d’extraire
rapidement l’élément de priorité minimum. Opérations :
F.estVide() : permet de vérifier si la fille est vide
F.extraireMin() : permet de récupérer l’élément de priorité
minimum
F.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. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Algorithme – avec file de priorité

Pour v ∈ V Faire
d(v ) ← ∞
finPour
d(s) ← 0
F.initialiser()
F.ajouter(s, 0)
TantQue (non F.estVide())
v ← F.extraireMin()
Pour u ∈ voisins(v ) Faire
Si (d(u) > d(v ) + wvu ) Alors
d(u) ← d(v ) + wvu
F.ajouter(u, d(u))
finSi
finPour
finTantQue

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus 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 Dijkstra
reste O(n2 )

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

File prioritaire – implémentation performante

Heureusement, il existe des structures de données, telles que


les tas ou les arbres binaires de recherche équilibrés
permettant 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 de
Dijkstra passe à O(m + n log n)

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus 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 = 10000
Impléméntation naïve : ≈ 1 000 000 opérations
Implémentation efficace : ≈ 20 000
Accélération : ≈ ×50

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Exercice

Démontrer que l’algorithme de Dijkstra effectue un parcours


dans le graphe

Rappel. Un parcours d’un graphe à partir d’un sommet s est la


génération d’une liste L de sommets, telle que :
L contient tous les sommets de G atteignables à partir de
s;
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 v
avant lui dans L

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Limitations
L’algorithme de Dijkstra ne s’applique que pour des graphes
dont le poids des arêtes/arcs est positif ou nul.

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Exemple pour lequel Dijkstra ne s’applique pas

−2
1 2
b c d
−5
4 5 2

e f

Trouver les plus courts chemins de a vers tous les autres


sommets
F. Guinand, S. Balev Plus courts chemins dans un graphe
E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Le cas de poids négatifs

Comment adapter l’algorithme de Dijkstra pour le cas de poids


né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 v


dans le plus court chemin de s à v et si la valeur de d(u)
est correcte
Quel que soit le nombre d’appels, d(v ) reste une borne
supérieure sur la distance entre s et v

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus 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), la
distance de s à v sera correctement calculée.

Mais comment savoir le bon ordre ? → Mettre à jour tous les


arcs n − 1 fois.

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Algorithme de Bellman-Ford

Pour v ∈ V Faire
d(v ) ← ∞
finPour
d(s) ← 0

Répéter n − 1 fois
Pour e ∈ E faire
maj(e)
finPour
finRépéter

Amélioration possible : s’arrêter si pendant une itération il n’y a


pas eu de mise à jour.

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Exercices

Correction et complexité de l’algorithme de Bellman-Ford


Le problème du plus court chemin est mal posé dans le
cas de circuits négatifs. Néanmoins, on peut modifier
l’algorithme de Bellman-Ford pour détecter ces circuits.
Comment ?

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Le plus court chemin entre toutes les paires de


sommets

Principe :
d(i, j, k ) - la longueur du plus court chemin entre i et j en
utilisant des sommets intermédiaires seulement parmi
{1, . . . , k }
Au début d(i, j, 0) = wij si (i, j) ∈ E et ∞ sinon
On 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. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Algorithme de Floyd-Warshall

Pour i de 1 à n Faire
Pour j de 1 à n Faire
d(i, j) = wij ou ∞
finPour
finPour

Pour k de 1 à n Faire
Pour i de 1 à n Faire
Pour j de 1 à n Faire
d(i, j) = min{d(i, j), d(i, k ) + d(k , j)}
finPour
finPour
finPour

F. Guinand, S. Balev Plus courts chemins dans un graphe


E. W. Dijkstra
Plus court chemin
Algorithme de Dijkstra

Exercices

Correction et complexité de l’algorithme de Floyd-Warshall


Détection de cycles négatifs ?

F. Guinand, S. Balev Plus courts chemins dans un graphe

Vous aimerez peut-être aussi