Plus courts chemins dans un graphe -...

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

Transcript of Plus courts chemins dans un graphe -...

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

E. W. DijkstraPlus court chemin

Algorithme de Dijkstra

Exercices

Correction et complexité de l’algorithme de Floyd-WarshallDétection de cycles négatifs ?

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