Vous êtes sur la page 1sur 4

Université Abdelmalek Essadi Master MBD & SIM

Faculté des Sciences et Techniques –Tanger Semestre 1 2021-2022


Département Génie Informatique Module  : Théories des graphes - A, GHADI

Chapitre 4
Algorithmes de plus courts chemins
4.1 Problèmatique
Ce chapitre sera consacrer à l'une des thématiques les plus importantes de la théorie des graphes,
celle de la recherche d'un plus court chemin entre deux sommets.
Après avoir défini précisément le contexte, nous étudierons successivement les algorithmes de
Dijkstra et Bellman-Ford.

Nous allons travailler sur un graphe sans boucle G=(V , E , l ) avec l l’application poids
(E ⇒ ℝ) . L’application l associe à chaque arc/arête, un réel appelé longueur/coût de l’arc.

Soit π =( x 0 , x1 , ... x n ) un chemin/une chaîne dans G . On définit la longueur de π par :

n
l( π)=∑i=0 l ( x i , x i+1)
Définition – Plus court chemin
Soient x et y deux sommets de V. Dans la recherche d’un plus court chemin de x à y, trois cas
peuvent se présenter :
1. Il n’existe aucun chemin de x à y (si x et y appartiennent à deux composantes connexes
différentes de G).
2. Il existe un chemin de x à y mais pas de plus court chemin( Il n’existe pas de plus court
chemin de x à y. C’est à dire que pour tout chemin π de x à y, on peut trouver un chemin
π 0 tel que l( π 0)<l ( π) . (Circuit absorbant)
3. Il existe un plus court chemin de x à y.

Définition – Circuit absorbant


Un cycle de longueur négative est appelé cycle absorbant. Dans l’exemple suivant, il existe un cycle
absorbant.
Si une composante connexe présente un cycle absorbant, alors il n’existe pas de plus court chemin
entre deux points de cette composante.

Soit G=(V , E , l ) . Soit s ∈V , une condition nécessaire et suffisante


pour qu’il existe un plus court chemin entre s et tout point de V ∖ s est :
1. s est une racine de (V , E) et,
2. Il n’y a pas de circuit absorbant dans G .

Exemple
Dans l’exemple, le cycle acba est un cycle absorbant donc entre x et y il n’ y a pas de chemin plus
court :
xacby → est une chaîne de coût total égale à 2 ( 3+(-7)+2+4)
xacbacby → est une chaîne de coût total égale à 0 (3+(-7)+2+3+(-7)+2+4)
xacbacbacby → est une chaîne de coût total égale à -2 (3+(-7)+2+3+(-7)+2+3+(-7)+2+4)
… En trouvera toujours un chemin plus que l’ancien !

4.2 Algorithme de Dijkstra


Cet algorithme sert à résoudre le problème du plus court chemin à partir d’un sommet de départ (ici
s).
Attention : L'algorithme de Dijkstra ne retournait un résultat optimal que dans le cas de graphes à
valuations positives (tout les coûts des arcs/arêtes sont positifs).

Algorithme de Dijkstra : Soit S l'ensemble des sommets marqués. T l'ensemble des


sommets non marqués.
====================================================================
Phase A : Initialisation
S={s }
T =V ∖ {s }
P(i)=s si i∈ Γ (s) (Γ(s) est l’ensemble des voisins de s. s est
prédécesseur de i)
=Null sinon

l (s )=0
l (i)=l (s ,i ) si i∈ Γ (s)
=∞ sinon

Phase B : Sélection
sélectionner un sommet j ∈T tel que l ( j )=mini ∈ T (l(i ))
T =T −{ j }
S=S+{ j }
Phase C : Calcul des distances
Pour tout i ∈ T voisin de j ( i∈ Γ ( j ) )
l(i)=min(l(i ), l ( j)+l ( j , i))
si l (i) est modifiée alors P(i)= j
Fin Pour
======================================================================
Exemple 1
On prend comme sommet de départ le sommet S. Ci-
après la trace de l’algorithme de Dijkstra sur le graphe G
avec comme sommet de départ le sommet S.
l=(2,1,6 ,∞ ,0) (avec l’ordre A,B,C,D et S)
(car l ( S)=0, l ( A)=2 , l (B)=1, l (C)=6,l ( D)=∞)
P=(S , S , S , Null ,0)
S={S } et T ={ A , B ,C , D }
Étape 1
→ Phase B
j=B car l(B)=min(2,1,6 , ∞)=1
→ Phase C
les voisins de B dans T sont A et C :
pour i=A
l( A )=min( l( A) , l (B)+l ( B , A ))=min(2,1+1)=2 Donc la valeur de l ( A ) reste inchangée et
donc on ne change pas aussi la valeur de P( A) . → Aucun changement
pour i=C
l (C)=min(l (C) ,l ( B)+l ( B ,C ))=min(2,1+1)=2 puisque la valeur de l(C) est changée alors
P(C) devient B ( P(C)=B )
Donc l=(2,1,2, ∞ ,0) et P=(S , S , B , Null ,0) S={S , B } et T ={ A , C , D }

Étape 2
min(2,2 , ∞)=2 donc ici on a le choix entre les deux sommet A et C. par convention on va choisir
l’ordre alphabétique :
j= A . Les voisins de A dans T ={ A , C , D } sont C et D :
pour i=C
l (C)=min(l (C) ,l ( A)+l ( A ,C))=min (2,2+ 2)=2 Donc la valeur de l(C) reste inchangée et
donc on ne change pas aussi la valeur de P(C) . → Aucun changement

pour i=D
l ( D)=min(l (D) ,l( A)+l( A , D))=min(∞ ,2+1)=3 Donc l ( D)=3 et P( D)= A

Donc l=(2,1,2,3,0) et P=(S , S , B , A ,0) S={S , B , A } et T ={C , D }

Etape 3
j=C car l(C)=min(2,3)=2 . le seul voisin de C dans T ={C , D } est D :
pour i=D
l ( D)=min(l (D) ,l(C )+ l(C , D))=min(3,2+7)=3 Donc la valeur de l( D ) reste inchangée et
donc on ne change pas aussi la valeur de P( D ) . → Aucun changement

Donc l=(2,1,2,3,0) et P=(S , S , B , A ,0) S={S , B , A ,C } et T ={D }

Étape 4
j=D puisque il n’ y a pas de voisin de D dans T ={D } Alors pas de changement dans cette étape.

FIN de l’algorithme
Résultats :

Sommets A B C D S
L : longueur 2 1 2 3 0
P : Prédécesseur S S B A -

Interprétation :
P(A)=S donc le chemin la plus courte est S→ A avec le coût 2 .
P(B)=S donc le chemin la plus courte est S→ B avec le coût 1 .
P(C)=B et P(B)=S donc le chemin la plus courte est S→ B→C avec le coût 2 .
P(D)=A et P(A)=S donc le chemin la plus courte est S→ A→D avec le coût 3 .

Donc l’arbre des chemin les plus courts est


Exemple 2
Considérons le graphe G orienté valué suivant :

Correction
Sommets A B C D E F
L 0 5 1 8 3 6
P - E A E C B

Donc l’arbre des chemin les plus courts est

Exemple 3
Considérons le graphe orienté valué suivant :
On sait que l’algorithme de Dijkstra ne donnera pas un
résultat optimal car le coût de l’arc (C,B) est négatif (-5).
Le résultat de l’algorithme Dijkstra sur ce graphe avec A
comme sommet de départ est :
Sommets A B C D
L 0 1 2 3
P - A A B

Le chemin (A,C,B,D) a une valuation égale à −1, ce qui est mieux que la valeur 3 retournée par
l'algorithme de Dijkstra.
Pour avoir un résultat optimal dans le cas des graphes à valuations négatives (et aussi positives)
nous allons utiliser l’algorithme de Bellman-Ford.

Vous aimerez peut-être aussi