Vous êtes sur la page 1sur 5

Algorithme de Dijkstra

jour sopre comme suit : la nouvelle distance du som-


met voisin est le minimum entre la distance existante et
celle obtenue en ajoutant le poids de l'arc entre sommet
voisin et sommet ajout la distance du sommet ajout.
On continue ainsi jusqu' puisement des sommets (ou
jusqu' slection du sommet d'arrive).

1.1 Distance entre la ville A et la ville J


L'algorithme de Dijkstra fonctionne aussi sur un graphe
non orient (qui peut le plus peut le moins). L'exemple
suivant montre les tapes successives dans la rsolution
du chemin le plus court dans un graphe. Les nuds sym-
bolisent des villes identies par une lettre et les artes
Une excution de l'algorithme.
indiquent la distance entre ces villes. On cherche dter-
miner le plus court trajet pour aller de la ville A la ville
En thorie des graphes, l'algorithme de Dijkstra (pro- J.
nonc [dj.kstra]) sert rsoudre le problme du plus
On connat ainsi le chemin le plus court menant de A J,
court chemin. Il permet, par exemple, de dterminer un
il passe par C et H et mesure 487 km.
plus court chemin pour se rendre d'une ville une autre
connaissant le rseau routier d'une rgion. Plus prcis-
ment, il calcule des plus courts chemins partir d'une 1.2 Prsentation sous forme de tableau
source dans un graphe orient pondr par des rels po-
sitifs. On peut aussi l'utiliser pour calculer un plus court On peut aussi rsumer l'excution de l'algorithme de
chemin entre une source et un sommet d'arrive. Dijkstra avec un tableau. Chaque tape correspond une
L'algorithme porte le nom de son inventeur, ligne. Une ligne donne les distances courantes des som-
l'informaticien nerlandais Edsger Dijkstra, et a t mets depuis le sommet de dpart. Une colonne donne
publi en 1959[1] . l'volution des distances d'un sommet donn depuis le
sommet de dpart au cours de l'algorithme. La distance
Cet algorithme est de complexit polynomiale.
d'un sommet choisi (car minimale) est souligne. Les dis-
tances mises jour sont barres si elles sont suprieures
des distances dj calcules.
1 Principe sur un exemple Le tableau donne non seulement la distance minimale de
la ville A la ville J (487) mais aussi le chemin suivre
L'algorithme prend en entre un graphe orient pond- rebours (J - H - C - A) pour aller de A J ainsi que toutes
r par des rels positifs et un sommet source. Il sagit les distances minimales de la ville A aux autres villes ran-
de construire progressivement un sous-graphe dans lequel ges par ordre croissant.
sont classs les dirents sommets par ordre croissant de
leur distance minimale au sommet de dpart. La distance
correspond la somme des poids des arcs emprunts. 2 Schma d'algorithme
Au dpart, on considre que les distances de chaque som-
met au sommet de dpart sont innies sauf pour le som- Le graphe est not G = (S, A) o :
met de dpart pour lequel la distance est de 0. Le sous-
graphe de dpart est l'ensemble vide. l'ensemble S est l'ensemble ni des sommets du
graphe G ;
Au cours de chaque itration, on choisit en dehors du
sous-graphe un sommet de distance minimale et on l'ensemble A est l'ensemble des arcs de G tel que :
l'ajoute au sous-graphe. Ensuite, on met jour les dis- si (s1 , s2 ) est dans A , alors il existe un arc depuis
tances des sommets voisins de celui ajout. La mise le nud s1 vers le nud s2 ;

1
2 3 IMPLMENTATION DE L'ALGORITHME

n'y a pas d'arc reliant s1 s2 ).

4 Le poids du chemin entre deux sommets est la somme des


poids des arcs qui le composent. Pour une paire donne
de sommets sdeb (le sommet du dpart) sf in (sommet
d'arrive) appartenant S , l'algorithme trouve un chemin

0 1
depuis sdeb vers sf in de moindre poids (autrement dit un
chemin le plus lger ou encore le plus court).
L'algorithme fonctionne en construisant un sous-graphe
P de manire ce que la distance entre un sommet s de

2
P depuis sdeb soit connue et soit un minimum dans G .
Initialement P contient simplement le nud sdeb isol, et

la distance de sdeb lui-mme vaut zro. Des arcs sont


ajouts P chaque tape :

1. en identiant toutes les arcs ai = (si1 , si2 )


dans P G ;
2. en choisissant l'arc aj = (sj1 , sj2 ) dans P

4
G qui donne la distance minimum depuis sdeb
sj2 en passant tous les chemins crs menant

4 ce nud.

L'algorithme se termine soit quand P devient un arbre

0
couvrant de G , soit quand tous les nuds d'intrt[2] sont

1 dans P .
On peut donc crire l'algorithme de la faon suivante :
Entres : G = (S, A) un graphe avec une pondration

2 positive poids des arcs, sdeb un sommet de S P :=

2
d[a] := + pour chaque sommet a d(sdeb ) = 0 Tant
qu'il existe un sommet hors de P Choisir un sommet
a hors de P de plus petite distance d[a] Mettre a
dans P Pour chaque sommet b hors de P voisin de a
d[b] = min(d[b], d[a] + poids(a, b)) Fin Pour Fin Tant
Que

4 3 3 Implmentation de l'algorithme

3.1 Fonctions annexes

0 1 L'algorithme utilise les fonctions annexes suivantes.

3.1.1 Initialisation de l'algorithme

2 2
Initialisation(G,sdeb) 1 pour chaque point s de G 2 faire
d[s] := inni /* on initialise les sommets autres que sdeb
inni */[3] 3 d[sdeb] := 0 /* sdeb tant le point le plus
proche de sdeb */

3.1.2 Recherche d'un nud de distance minimale


on dnit la fonction poids dnie sur S S dans
R+ qui un couple (s1 , s2 ) associe le poids positif On recherche un nud de distance minimale (reli
poids(s1 , s2 ) de l'arc reliant s1 s2 (et + si sil par l'arc de poids le plus faible) de sdeb parmi les
3

nuds situs hors de P . Le complmentaire de P de l'algorithme est O((|A| + |S|) log(|S|)) si on im-
est not Q . On implmente pour cela une fonction plmente la le priorits par un tas binaire (en suppo-
Trouve_min(Q) qui choisit un nud de Q de dis- sant que les comparaisons des poids d'arcs soient temps
tance minimale. constant). Si on implmente la le priorits avec un tas
de Fibonacci, l'algorithme est en O(|A| + |S| log(|S|))
[4]
.
Trouve_min(Q) 1 mini := inni 2 sommet := 1 3 pour
chaque sommet s de Q 4 si d[s] < mini 5 alors 6 mini =
d[s] 7 sommet := s 8 renvoyer sommet
4 Correction de l'algorithme
3.1.3 Mise jour des distances
La dmonstration de correction repose sur l'invariant sui-
vant : les distances des sommets dans P sont les distances
On met jour les distances entre sdeb et s2 en se
minimales[4] . L'algorithme de Dijkstra est un algorithme
posant la question : vaut-il mieux passer par s1 ou
glouton.
pas ?

maj_distances(s1,s2) 1 si d[s2] > d[s1] + Poids(s1,s2) /*


Si la distance de sdeb s2 est plus grande que */ 2 /* celle
5 Applications
de sdeb S1 plus celle de S1 S2 */ 3 alors 4 d[s2] :=
d[s1] + Poids(s1,s2) /* On prend ce nouveau chemin qui L'algorithme de Dijkstra trouve son utilit dans le cal-
est plus court */ 5 prdcesseur[s2] := s1 /* En notant par cul des itinraires routiers. Le poids des arcs pouvant tre
o on passe */ la distance (pour le trajet le plus court), le temps estim
(pour le trajet le plus rapide), la consommation de car-
burant et le prix des pages (pour le trajet le plus cono-
3.2 Fonction principale mique). [rf. ncessaire]
Une application des plus courantes de l'algorithme de
Voici la fonction principale utilisant les prcdentes fonc- Dijkstra sont les protocoles de routage interne tat
tions annexes : de liens , tels que Open Shortest Path First (OSPF)[5] ou
[6]
Dijkstra(G,Poids,sdeb) 1 Initialisation(G,sdeb) 2 Q := en- IS-IS ou encore PNNI (en) sur les rseaux ATM , qui
semble de tous les nuds 3 tant que Q n'est pas un en- permettent un routage internet trs ecace des informa-
[rf. ncessaire]
semble vide 4 faire s1 := Trouve_min(Q) 5 Q := Q pri- tions en cherchant le parcours le plus ecace.
v de s1 6 pour chaque nud s2 voisin de s1 7 faire
maj_distances(s1,s2)
Le plus court chemin de sdeb sf in peut ensuite se cal- 6 Comparaison avec d'autres algo-
culer itrativement selon l'algorithme suivant, avec A la rithmes
suite reprsentant le plus court chemin de sdeb sf in :
1 A = suite vide 2 s := sn 3 tant que s != sdeb 4 A = A L'algorithme de Dijkstra est une spcialisation du
+ s /* on ajoute s la suite A */ 5 s = prdcesseur[s] /* parcours en largeur.
on continue de suivre le chemin */
La spcialisation de l'algorithme de Dijkstra qui cal-
cule un plus court chemin d'une source une des-
3.3 Spcialisation de l'algorithme tination est une instance de l'algorithme A* dans
lequel la fonction heuristique est la fonction nulle.
Il est possible de spcialiser l'algorithme en arrtant la L'algorithme A* qui utiliserait une heuristique mi-
recherche lorsque l'galit s1 = sf in est vrie, dans norante et monotone (par exemple la distance vol
lequel o on ne cherche que la distance minimale entre d'oiseau) peut tre plus ecace [rf. ncessaire] .
sdeb et sf in .
L'algorithme ne sapplique pas aux graphes avec des
poids ngatifs. Mais l'algorithme de Bellman-Ford
3.4 Complexit de l'algorithme permet de rsoudre le problme des plus courts che-
mins depuis une source avec des poids ngatifs (mais
L'ecacit de l'algorithme de Dijkstra repose sur une sans cycle ngatif).
mise en uvre ecace de Trouve_min. On considre
l'ensemble Q comme une le priorits. Si le graphe pos- L'algorithme de Floyd-Warshall calcule des plus
sde |A| arcs et |S| nuds, que le graphe est reprsent courts chemins entre tous les sommets dans un
par des listes d'adjacence, alors la complexit en temps graphe o les poids peuvent tre ngatifs.
4 8 ANNEXES

7 Notes et rfrences 8.3 Liens externes


Explication dtaille de l'algorithme de Dijkstra et
[1] (fr) Principes de l'algorithme de Dijkstra, site Nimbus-
tier.net. implmentation complte en C++

(en) Applet Java montrant l'algorithme de Dijkstra


[2] Par exemple, les nuds n'ayant pas d'artes autres que
tape par tape
celle que l'on a parcourue pour arriver eux, ne sont pas
considrs comme des nuds d'intrt. (en) Applets Java utilisant l'algorithme
[3] La suite de caractres /* ... */ est un commentaire.

[4] Cormen et al. 2010, p. 610 Portail de l'informatique thorique

[5] (en) John Moy, RFC2328 OSPF Version 2 , avril 1998


(consult le 19 mai 2016) : Using the Dijkstra algorithm,
a tree is formed from this subset of the link state database.
, p. 161

[6] (en) David R. Oran, RFC1142 : OSI IS-IS Intra-domain


Routing Protocol , fvrier 1990 (consult le 19 mai
2016) : An algorithm invented by Dijkstra (see refer-
ences) known as shortest path rst (SPF), is used as the
basis for the route calculation.

8 Annexes

8.1 Bibliographie

(en) A short introduction to the art of program-


ming de Edsger W. Dijkstra, 1971, contenant
l'article original (1959) dcrivant l'algorithme de
Dijkstra (pages 67 73).

(en) Thomas H. Cormen, Charles E. Leiserson,


Ronald L. Rivest et Cliord Stein, Introduction
l'algorithmique, MIT Press et McGraw-Hill, 2001,
2e d. [dtail de ldition], section 24.3, Dijkstras
algorithm , pages 595601.

Thomas H. Cormen, Charles E. Leiserson, Ronald


L. Rivest et Cliord Stein (trad. de l'anglais),
Algorithmique : Cours avec 957 exercices et 158
problmes, Dunod, 2010 [dtail de ldition]

8.2 Articles connexes

Lexique de la thorie des graphes

Recherche de chemin et Problmes de cheminement

Algorithme de parcours en largeur

Algorithme A*

Article sur l'algorithme de Ford-Bellman qui permet


de calculer le plus court chemin avec des poids d'arcs
ngatifs
5

9 Sources, contributeurs et licences du texte et de limage


9.1 Texte
Algorithme de Dijkstra Source : https://fr.wikipedia.org/wiki/Algorithme_de_Dijkstra?oldid=134144791 Contributeurs : Med, Vargenau,
Looxix, Orthogae, Crales Killer, Fphilibert, Jeanmichel, Alno, HasharBot, P-e, Tom~frwiki, Francis.sourd, Archibald, Sanao, MedBot,
ChrisJ, Sam Hocevar, VIGNERON, David.Monniaux, Anarkman, Xmlizer, Francois Trazzi, HB, Phe-bot, Romainhk, Kassus, Tuxmym,
Jef-Infojef, Mms~frwiki, Dake, Neoneurone, Sherbrooke, Franckyboy, Laubrau, Chobot, Seb35, Stendhalconques, Lmaltier, Kilom691,
Gzen92, Jeanot, RobotQuistnix, FlaBot, Arria Belli, YurikBot, Gene.arboit, Caron, MistWiz, Litlok, Jill-Jnn, 16@r, Dummy~frwiki,
Loveless, Freewol, FranoisD, Epsilon0, Booggi, Aeleftherios, Jaimie Ann Handson, AzertyFab, Thijs !bot, Julien Jorge, Gilles.L, Kro-
potkine 113, El Caro, Soulbot, Blue Prawn, Int xxh, Sebleouf, FR, VonTasha, Analphabot, Salebot, MIRROR, TXiKiBoT, VolkovBot,
Paul Bouchequet, Backtracking, AlleborgoBot, Ssx`z, Gz260, SieBot, Utb diablo, Kyro, Ange Gabriel, Alecs.bot, FitzSai, DumZiBoT,
SniperMask, Raude, Carapass, Rinaku, Artemis01, Grouic, Mayayu, SilvonenBot, ZetudBot, Ggal, Elx, Franois-Karim, Pierre KRIE-
GER, Varmin, Luckas-bot, Zandr4, Yonidebot, JmCor, Anne Bauval, Aadri, Flyingsquirrel, Sayah24, ArthurBot, Rubinbot, Podgy piglet,
Cucurbitacea1551, D'ohBot, Touam, MondalorBot, Dommm063, Lamusiqueduhasard, Bobodu63, EmausBot, Alexandre Duret-Lutz, Eo-
Winn, Faure.thomas, ChuispastonBot, Placide delens, OrlodrimBot, Elopash, Bacs31, LionelGotti, Rannios, Ectod, OrikriBot, Roll-Morton,
Kmil97.1, Addbot, Zebulon84bot, JulienCo, Leo033, Fschwarzentruber, Tearow, Remycave et Anonyme : 135

9.2 Images
Fichier:Dijkstra{}s_algorithm.svg Source : https://upload.wikimedia.org/wikipedia/commons/b/be/Dijkstra%27s_algorithm.svg Li-
cence : Public domain Contributeurs : Travail personnel Artiste dorigine : Dcoetzee
Fichier:DijkstraBis01.svg Source : https://upload.wikimedia.org/wikipedia/commons/2/29/DijkstraBis01.svg Licence : CC BY-SA 3.0
Contributeurs : Travail personnel Artiste dorigine : HB
Fichier:DijkstraBis02.svg Source : https://upload.wikimedia.org/wikipedia/commons/5/5c/DijkstraBis02.svg Licence : CC BY-SA 3.0
Contributeurs : Travail personnel Artiste dorigine : HB
Fichier:DijkstraBis03.svg Source : https://upload.wikimedia.org/wikipedia/commons/3/3a/DijkstraBis03.svg Licence : CC BY-SA 3.0
Contributeurs : Travail personnel Artiste dorigine : HB
Fichier:DijkstraBis04.svg Source : https://upload.wikimedia.org/wikipedia/commons/2/26/DijkstraBis04.svg Licence : CC BY-SA 3.0
Contributeurs : Travail personnel Artiste dorigine : HB
Fichier:DijkstraBis05.svg Source : https://upload.wikimedia.org/wikipedia/commons/b/b0/DijkstraBis05.svg Licence : CC BY-SA 3.0
Contributeurs : Travail personnel Artiste dorigine : HB
Fichier:DijkstraBis06.svg Source : https://upload.wikimedia.org/wikipedia/commons/f/f5/DijkstraBis06.svg Licence : CC BY-SA 3.0
Contributeurs : Travail personnel Artiste dorigine : HB
Fichier:DijkstraBis07.svg Source : https://upload.wikimedia.org/wikipedia/commons/d/d9/DijkstraBis07.svg Licence : CC BY-SA 3.0
Contributeurs : Travail personnel Artiste dorigine : HB
Fichier:DijkstraBis08.svg Source : https://upload.wikimedia.org/wikipedia/commons/f/f7/DijkstraBis08.svg Licence : CC BY-SA 3.0
Contributeurs : Travail personnel Artiste dorigine : HB
Fichier:DijkstraBis09.svg Source : https://upload.wikimedia.org/wikipedia/commons/d/d9/DijkstraBis09.svg Licence : CC BY-SA 3.0
Contributeurs : Travail personnel Artiste dorigine : HB
Fichier:Dijkstra_Animation.gif Source : https://upload.wikimedia.org/wikipedia/commons/5/57/Dijkstra_Animation.gif Licence : Pu-
blic domain Contributeurs : Work by uploader. Artiste dorigine : Ibmua
Fichier:Max-cut.svg Source : https://upload.wikimedia.org/wikipedia/commons/c/cf/Max-cut.svg Licence : CC BY-SA 3.0 Contribu-
teurs : Travail personnel Artiste dorigine : Miym

9.3 Licence du contenu


Creative Commons Attribution-Share Alike 3.0

Vous aimerez peut-être aussi