Vous êtes sur la page 1sur 40

Le probleme`

chemin : algorithme de Dijkstra

du plus court

Cours d’ASD Sciences de l’Ingenieur´

Hel´ ene`

Renard

(Marc Gaetano)

12/16 mai 2011

Question existentielle !

Exemples :

Livreur de pizzas ;

Mr Dupont -> gare de Strasbourg, direction Biarritz ;

Synchronisation entre l’Intermarch´e et le cimeti`ere d’Antony ;

Internet -> donn´ees dans le monde entier ?

Quelle route au fait ?

Internet - > donn´ees dans le monde entier ? ☞ Quelle route au fait ? Hel´

Hel´ ene`

Renard

Algorithme de Dijkstra

2

Le probleme`

des plus courts chemins

Qui dit trajet dit probl`eme des plus courts chemins. Qui dit probl`eme dit n´ecessit´e de trouver une solution.

Probleme`

´

Etant donn´e un ensemble de points et un ensemble de liaisons entre ces points caract´eris´ees par un certain poids, comment trouver le chemin le plus court, le moins cher, le plus agr´eable entre deux points ?

L’´etude suivante pr´esente l’algorithme de Dijkstra permettant de r´esoudre la question en θ((|n| + |a|)lg|n|) o`u n est le nombre de points et a le nombre de liaisons, dans le meilleur des cas.

Hel´ ene`

Renard

Algorithme de Dijkstra

3

Exemples concrets : distance entre la ville A et la ville J

Les nœuds symbolisent des villes identifi´ees par une lettre et les arˆetes indiquent la distance entre ces villes.

Le plus court trajet pour aller de la ville A `a la ville J.

Le plus court trajet pour aller de la ville A `a la ville J.   ´
 

´

`

Figure:

Etape 1

A partir de la ville A, 3 villes sont accessibles, B, C, et

E qui se voient donc affect´ees des poids respectifs de 85, 217, 173, tandis que les autres villes sont affect´ees d’une distance infinie.

Hel´ ene`

Renard

Algorithme de Dijkstra

4

Exemples concrets : distance entre la ville A et la ville J

Les nœuds symbolisent des villes identifi´ees par une lettre et les arˆetes indiquent la distance entre ces villes. Le plus court trajet pour aller de la ville A `a la ville J.

court trajet pour aller de la ville A `a la ville J. ☞ ´ Figure :

´

Figure:

Le passage par la ville B ouvre la voie `a la ville F (85+80 = 165).

Etape 2 La distance la plus courte est celle menant `a la ville B.

Hel´ ene`

Renard

Algorithme de Dijkstra

4

Exemples concrets : distance entre la ville A et la ville J

Les nœuds symbolisent des villes identifi´ees par une lettre et les arˆetes indiquent la distance entre ces villes. Le plus court trajet pour aller de la ville A `a la ville J.

court trajet pour aller de la ville A `a la ville J. ☞ ´ Figure :

´

Figure:

ville F. Le passage par la ville F ouvre une voie vers la ville I (415).

Etape 3 La distance la plus courte suivante est celle menant `a la

Hel´ ene`

Renard

Algorithme de Dijkstra

4

Exemples concrets : distance entre la ville A et la ville J

Les nœuds symbolisent des villes identifi´ees par une lettre et les arˆetes indiquent la distance entre ces villes. Le plus court trajet pour aller de la ville A `a la ville J.

court trajet pour aller de la ville A `a la ville J. ☞ ´ Figure :

´

Figure:

`a la ville E. Le passage par la ville E ouvre une voie vers la ville J (675).

Etape 4 La distance la plus courte suivante est alors celle menant

Hel´ ene`

Renard

Algorithme de Dijkstra

4

Exemples concrets : distance entre la ville A et la ville J

Les nœuds symbolisent des villes identifi´ees par une lettre et les arˆetes indiquent la distance entre ces villes.

Le plus court trajet pour aller de la ville A `a la ville J.

Le plus court trajet pour aller de la ville A `a la ville J. ´ Etape

´

Etape 5 La distance la plus courte suivante m`ene alors `a la ville

C. Le passage par la ville C ouvre une voie vers la ville G (403) et la ville H

(320).

Figure:

Hel´ ene`

Renard

Algorithme de Dijkstra

4

Exemples concrets : distance entre la ville A et la ville J

Les nœuds symbolisent des villes identifi´ees par une lettre et les arˆetes indiquent la distance entre ces villes.

Le plus court trajet pour aller de la ville A `a la ville J.

Le plus court trajet pour aller de la ville A `a la ville J. ´ Etape

´

Etape 6 La distance la plus courte suivante m`ene `a ville H(320).

Le passage par la ville H ouvre une voie vers la ville D et un raccourci vers la ville J (487 < 675).

Figure:

Hel´ ene`

Renard

Algorithme de Dijkstra

4

Exemples concrets : distance entre la ville A et la ville J

Les nœuds symbolisent des villes identifi´ees par une lettre et les arˆetes indiquent la distance entre ces villes. Le plus court trajet pour aller de la ville A `a la ville J.

court trajet pour aller de la ville A `a la ville J. ☞ ´ Figure :

´

Figure:

ne change aucune autre distance.

Etape 7 La distance la plus courte suivante m`ene `a la ville G et

Hel´ ene`

Renard

Algorithme de Dijkstra

4

Exemples concrets : distance entre la ville A et la ville J

Les nœuds symbolisent des villes identifi´ees par une lettre et les arˆetes indiquent la distance entre ces villes.

Le plus court trajet pour aller de la ville A `a la ville J.

Le plus court trajet pour aller de la ville A `a la ville J. ´ Etape

´

Etape 8 La distance la plus courte suivante m`ene `a la ville I. Le

passage par la ville I ouvre un chemin vers la ville J qui n’est pas int´eressant (415 + 84 > 487).

Figure:

Hel´ ene`

Renard

Algorithme de Dijkstra

4

Exemples concrets : distance entre la ville A et la ville J

Les nœuds symbolisent des villes identifi´ees par une lettre et les arˆetes indiquent la distance entre ces villes.

Le plus court trajet pour aller de la ville A `a la ville J.

Le plus court trajet pour aller de la ville A `a la ville J. Figure :

Figure:

´

Etape 9 La distance la plus courte suivante m`ene `a la ville J (487).

On connait ainsi le chemin le plus court menant de A `a J, il passe par C et H et mesure 487 km.

Hel´ ene`

Renard

Algorithme de Dijkstra

4

Exemples concrets : presentation´ de tableau

sous forme

Exemples concrets : presentation´ de tableau sous forme Figure : La construction de ce tableau donne

Figure: La construction de ce tableau donne non seulement la distance mi- nimale de la ville A `a la ville J mais aussi le chemin `a suivre (J - H - C - A) ainsi que toutes les distances minimales de la ville A aux autres villes rang´ees par ordre croissant.

Hel´ ene`

Renard

Algorithme de Dijkstra

5

Exemples concrets : le livreur de pizzas !

Exemple 2 : Cherchons les plus courts chemins d’origne E et de destina-

tion S dans ce graphe avec le tableau correspondant :

On se place au sommet de plus petit poids, ici le sommet E

Renard Algorithme de Dijkstra
Renard
Algorithme de Dijkstra

Hel´ ene`

6

Exemples concrets : le livreur de pizzas !

Exemple 2 : Cherchons les plus courts chemins d’origne E et de destina-

tion S dans ce graphe avec le tableau correspondant :

On ´etudie chacune des arˆetes partant du sommet choisi. Dans les colonnes, on met la distance `a E, et le sommet d’o`u l’on vient.

Renard Algorithme de Dijkstra
Renard
Algorithme de Dijkstra

On se place de nouveau au sommet de plus petit poids, ici B.

Hel´ ene`

6

Exemples concrets : le livreur de pizzas !

Exemple 2 : Cherchons les plus courts chemins d’origne E et de destina-

tion S dans ce graphe avec le tableau correspondant :

Et ainsi de suite.

tion S dans ce graphe avec le tableau correspondant : Et ainsi de suite. Renard Algorithme

Renard

Algorithme de Dijkstra

Hel´ ene`

6

Exemples concrets : le livreur de pizzas !

Exemple 2 : Cherchons les plus courts chemins d’origne E et de destina-

tion S dans ce graphe avec le tableau correspondant :

Et ainsi de suite.

Renard Algorithme de Dijkstra
Renard
Algorithme de Dijkstra

Hel´ ene`

6

Exemples concrets : le livreur de pizzas !

Exemple 2 : Cherchons les plus courts chemins d’origne E et de destina-

tion S dans ce graphe avec le tableau correspondant :

Et ainsi de suite.

Renard Algorithme de Dijkstra
Renard
Algorithme de Dijkstra

Hel´ ene`

6

Exemples concrets : le livreur de pizzas !

Exemple 2 : Cherchons les plus courts chemins d’origne E et de destina-

tion S dans ce graphe avec le tableau correspondant :

Et ainsi de suite.

tion S dans ce graphe avec le tableau correspondant : Et ainsi de suite. Renard Algorithme

Renard

Algorithme de Dijkstra

Hel´ ene`

6

Exemples concrets : le livreur de pizzas !

Exemple 2 : Cherchons les plus courts chemins d’origne E et de destina-

tion S dans ce graphe avec le tableau correspondant :

Et ainsi de suite.

Renard Algorithme de Dijkstra
Renard
Algorithme de Dijkstra

Hel´ ene`

6

Plan de la presentation´

1. Principes de l’algorithme de Dijkstra Description de l’algorithme

Implementation´

2. Complexite´

3. Conclusion

4. Exercices

Hel´ ene`

Renard

de l’algorithme de Dijkstra

Algorithme de Dijkstra

7

Principes de l’algorithme de Dijkstra

Plan de la presentation´

1. Principes de l’algorithme de Dijkstra Description de l’algorithme

Implementation´

2. Complexite´

3. Conclusion

4. Exercices

Hel´ ene`

Renard

de l’algorithme de Dijkstra

Algorithme de Dijkstra

8

Principes de l’algorithme de Dijkstra

Plan de la presentation´

Description de l’algorithme

1. Principes de l’algorithme de Dijkstra Description de l’algorithme

Implementation´

2. Complexite´

3. Conclusion

4. Exercices

Hel´ ene`

Renard

de l’algorithme de Dijkstra

Algorithme de Dijkstra

9

Principes de l’algorithme de Dijkstra

Description de l’algorithme

Glouton, vous avez dit glouton ?!

Soit G = (S, A) un graphe orient´e pond´er´e.

Glouton : `a chaque nouvelle ´etape, on traite un nouveau sommet. Reste `a d´efinir le choix du sommet `a traiter, et le traitement `a lui infliger, bref l’algorithme

Tout au long du calcul, on va donc maintenir deux ensembles :

E, l’ensemble des sommets pour lesquels on connaˆıt d´ej`a leur plus petite distance `a la source ;

F, l’ensemble des sommets qui restent `a visiter ; Au d´epart F = S E.

L’algorithme se termine bien ´evidemment lorsque F est vide.

Hel´ ene`

Renard

Algorithme de Dijkstra

10

Principes de l’algorithme de Dijkstra

Plan de la presentation´

Impl´ementation de l’algorithme de Dijkstra

1. Principes de l’algorithme de Dijkstra Description de l’algorithme

Implementation´

2. Complexite´

3. Conclusion

4. Exercices

Hel´ ene`

Renard

de l’algorithme de Dijkstra

Algorithme de Dijkstra

11

Principes de l’algorithme de Dijkstra

Impl´ementation de l’algorithme de Dijkstra

Initialisation de l’algorithme et mise-a-jour` distances

Initialisation de l’algorithme :

Initialisation(G,sdeb)

/*sdeb = le sommet du d´epart */

des

1:

Pour chaque point s de G :

2:

distances[s] := infini infini */

/* on initialise les sommets autres que sdeb `a

3:

distances[sdeb] := 0

/* sdeb ´etant le point le plus proche de sdeb */

Mise-`a-jour des distances :

maj distances(s1,s2)

1: Si distances[s2] > distances[s1] + P oids(s1, s2) Alors 2: distances[s2] := distances[s1] + P oids(s1, s2)

Hel´ ene`

Renard

Algorithme de Dijkstra

12

Principes de l’algorithme de Dijkstra

Fonction principale

Fonction principale :

Dijkstra(G,Poids,sdeb)

Impl´ementation de l’algorithme de Dijkstra

1: Initialisation(G,sdeb)

2: F := ensemble de tous les nœuds non visit´es 3: Tant que F n’est pas un ensemble vide :

4:

s1 := Trouve min(F) F := F priv´e de s1 Pour chaque nœud s2 voisin de s1 :

5:

6:

7:

maj distances(s1,s2)

Le plus court chemin de sdeb `a sf in :

/* sf in = le sommet d’arriv´ee */

1: A = suitevide

2:

s := sf in

3:

A = s + A

/* ins`ere s au d´ebut de A */

4:

Tant que s! = sdeb :

5:

s = pr´ed´ecesseur[s]

/* on continue de suivre le chemin */

6:

A = s + A

Hel´ ene`

Renard

Algorithme de Dijkstra

13

Principes de l’algorithme de Dijkstra

Impl´ementation de l’algorithme de Dijkstra

Preuve de l’algorithme (1/2)

Initialisation :

Le chemin le plus court connu entre la source et chacun des sommets est le chemin direct, avec une arˆete de poids infini s’il n’y a pas de liaison entre les deux sommets. i e ´etape :

s le sommet de F r´ealisant le minimum de distances[s] ;

On supprime s de F et on l’ajoute `a E ;

Si distances[s] + P oids(s, t) < distances[t], alors on remplace

distances[t] par distances[s] + P oids(s, t)

parcours[t] par s

et c’est tout ! (n-2) e ´etape :

distances[s] est le poids du plus court chemin de la source `a s ;

parcours[t] est le pr´ed´ecesseur de s dans un plus court chemin de la source `a s.

Hel´ ene`

Renard

Algorithme de Dijkstra

14

Principes de l’algorithme de Dijkstra

Impl´ementation de l’algorithme de Dijkstra

Preuve de l’algorithme (2/2)

La r´ecurrence `a effectuer repose sur les deux hypoth`eses suivantes :

= un plus court chemin qui m`ene de la source `a s ;

= un plus court chemin qui m`ene de la source `a t en ne

s F

t E

passant que par des points de F . Elles sont bien v´erifi´ees `a l’initialisation des tableaux !

Si elles le sont encore `a l’arriv´ee, comme hypoth`ese fournit la preuve de l’algorithme.

F

=

S, la deuxi`eme

La preuve de la 2 e hypoth`ese se fait par l’absurde.

Hel´ ene`

Renard

Algorithme de Dijkstra

15

Principes de l’algorithme de Dijkstra

Pseudo-code

fonction Dijkstra (nœuds, fils, distance, debut, fin) Pour n parcourant nœuds :

n.parcouru = infini // Peut ˆetre impl´ement´e avec -1 n.precedent = 0 Fin pour debut.parcouru = 0 PasEncoreVu = nœuds Tant que PasEncoreVu ! = liste vide :

Impl´ementation de l’algorithme de Dijkstra

n1= minimum(PasEncoreVu) // Le nœud dans PasEncoreVu avec parcouru le plus petit

PasEncoreVu.enlever(n1)

Pour n2 parcourant fils(n1) // Les nœuds reli´es `a n1 par un arc :

Si n2.parcouru > n1.parcouru + distance(n1, n2) // distance correspond au poids de l’arc reliant n1 et n2 Alors n2.parcouru = n1.parcouru + distance(n1, n2) n2.precedent = n1 // dit que pour aller `a n2, il faut passer par n1 Fin si Fin pour Fin tant que chemin = liste vide n = fin Tant que n ! = debut :

chemin.ajouterAvant(n) n = n.precedent Fin tant que chemin.ajouterAvant(debut) Retourner chemin Fin fonction Dijkstra

Hel´ ene`

Renard

Algorithme de Dijkstra

16

Complexit´e

Plan de la presentation´

1. Principes de l’algorithme de Dijkstra Description de l’algorithme

Implementation´

2. Complexite´

3. Conclusion

4. Exercices

Hel´ ene`

Renard

de l’algorithme de Dijkstra

Algorithme de Dijkstra

17

Complexit´e

Complexite´ de l’algorithme de Dijkstra

Il existe 2 m´ethodes pour impl´ementer l’algorithme de Dijkstra :

1 re m´ethode :

Soient n le nombre de noeuds et a le nombre d’arcs.

L’´etape de s´election du nœud qui devient permanent requiert au plus n op´erations.

On fait l’´etape pr´ec´edente au plus n fois ; donc cela demande un total d’au plus n 2 op´erations.

Le r´eajustement des distances demande qu’on examine chaque arc au plus une fois ; donc ce travail requiert a op´erations.

Au total, l’algorithme effectue au plus n 2 + a op´erations 2 × n 2 op´erations.

Hel´ ene`

Renard

Algorithme de Dijkstra

18

Complexit´e

Complexite´ de l’algorithme de Dijkstra : le tas special´

2 e m´ethode :

Fabrication du tas sp´ecial T on fabrique un tas de taille |n| : θ(|n|)

Boucle externe on extrait tous les ´el´ements du tas : θ(|n|lg|n|)

Boucle interne on refait le tas pour toutes les arˆetes : θ(|a|lg|n|)

Algorithme de Dijkstra θ(|n|) + θ(|n|lg|n|) + θ(|a|lg|n|) = θ((|n| + |a|)lg|n|)

Hel´ ene`

Renard

Algorithme de Dijkstra

19

Conclusion

Plan de la presentation´

1. Principes de l’algorithme de Dijkstra Description de l’algorithme

Implementation´

2. Complexite´

3. Conclusion

4. Exercices

Hel´ ene`

Renard

de l’algorithme de Dijkstra

Algorithme de Dijkstra

20

Conclusion

Conclusion sur l’algorithme de Dijkstra

Se calcule pour le r´eseau routier, le r´eseau SNCF, le r´eseau Internet etc.

Pour toutes les structures bas´ees sur un r´eseau quelconque.

Ce n’est pas forc´ement l’algorithme de Dijkstra qui est impl´ement´e partout

Le r´eseau Internet = autre type d’algorithme : Routing Infor- mation Protocol (RIP).

Ceci dit, Dijkstra commence `a s’implanter l`a aussi et `a remplacer progressivement ce protocole.

Pourquoi ? Pour la bonne et simple raison qu’il est le plus rapide `a proposer une solution au probl`eme des plus courts che- mins !

Hel´ ene`

Renard

Algorithme de Dijkstra

21

Ref´ erences´

Conclusion

- Sources

Introduction `a l’algorithme , T. Cormen, C. Leiserson, R. Rivest et C. Stein ;

Probl`eme du plus court chemin : Algorithmes et complexit´e , G. Stauffer ;

http://www.nimbustier.net/ -> Dijkstra ;

Wikip´edia ;

Etc.

Hel´ ene`

Renard

Algorithme de Dijkstra

22

Exercices

Plan de la presentation´

1. Principes de l’algorithme de Dijkstra Description de l’algorithme

Implementation´

2. Complexite´

3. Conclusion

4. Exercices

Hel´ ene`

Renard

de l’algorithme de Dijkstra

Algorithme de Dijkstra

23

Exercices

Exercices (1/2)

Exercice 1 :

Appliquer l’algorithme de Dijkstra sur le graphe suivant, `a partir du sommet A. Donner `a chaque it´eration le contenu du tableau.

A. Donner `a chaque it´eration le contenu du tableau. Figure : Un graphe orient´e pond´er´e Hel´

Figure: Un graphe orient´e pond´er´e

Hel´ ene`

Renard

Algorithme de Dijkstra

24

Exercices

Exercices (2/2)

Exercice 2 :

Exercices Exercices (2/2) Exercice 2 : Figure : Un graphe orient´e pond´er´e ❀ Remplir le tableau

Figure: Un graphe orient´e pond´er´e

Remplir le tableau (transparent d’apr`es), pour le graphe de la figure ci-dessus, donne la valeur du plus court chemin d’un sommet `a un autre.

Hel´ ene`

Renard

Algorithme de Dijkstra

25

Exercices

Exercices (2/2)

Exercices Exercices (2/2) ❀ Ex´ecuter l’algorithme de Dijkstra sur le graphe pr´ec´edent, `a partir du sommet

Ex´ecuter l’algorithme de Dijkstra sur le graphe pr´ec´edent, `a partir du sommet C, puis `a partir du sommet F.

Que se passe-t-il si l’arc F -> D est valu´e 6 au lieu de 7 ?

Proposer une solution pour trouver un chemin minimal dans les graphes avec des valuations n´egatives.

Hel´ ene`

Renard

Algorithme de Dijkstra

26