On considère des graphes simples
valués, c’est-à-dire dont chaque arc est muni d’un poids
(nombre
réel). Un chemin a pour poids la somme des poids des arcs qui le
constituent.
Le problème des plus courts chemins consiste à déterminer le
poids minimal d’un chemin d’un sommet à un autre, en supposant les
poids positifs.
Algorithme de Floyd
On représente un graphe orienté valué
à sommets par une matrice carrée de nombres :
a pour valeur le poids de l’arc ( si cet arc
n’existe pas).
Une variante de l’algorithme de Warshall permet de calculer la matrice
telle que soit le poids minimal d’un chemin de à :
D = M ;
POUR i 1 a n
POUR j de 1 a n
SI D[j, i] < +inf
ALORS
POUR k allant de 1 a n
SI D[j, k] > D[j, i] + D[i, k]
ALORS
D[j, k] = D[j, i] + D[i, k]
FIN SI
FIN POUR
FIN SI
FIN POUR
FIN POUR
Cet algorithme résout le problème des plus courtes distances de
tout sommet du graphe à tout autre sommet, mais ne donne pas le chemin
correspondant.
%{\bf Preuve de l’algorithme} : on montre par récurrence sur {\it i} qu’au
%début du passage dans la boucle {\sc pour}
%extérieure, chacun
%des représente le poids minimal des chemins de à dont
%les sommets intermédiaires sont d’indice strictement inférieur à
%.
%
%Complexité : |S|
%
Les algorithmes qui suivent permettent de déterminer les plus courts
chemins d’un sommet particulier du graphe à tout autre sommet. On
notera le poids d’un arc .
Algorithme de Ford
POUR tout sommet t
d[s, t] = +inf
FINPOUR
d[s, s] = 0
REPETER
POUR tout sommet t
SI d[s, t] < +inf
ALORS
POUR tout successeur u de t
SI d[s, u] > d[s, t] + p(t -> u)
ALORS
d[s, u] = d[s, t] + p(t -> u)
FIN SI
FIN POUR
FIN SI
FIN POUR
TANT QU'on modifie quelque chose
%{\bf Preuve de l’algorithme} : on montre inductivement qu’au
%passage dans la boucle {\sc repeter}, chacun des d[s, u] a pour valeur le
%poids du plus court chemin de à comprenant moins de sommets
%intermédiaires. Il sénsuit que l’algorithme termine (on ne peut
%passer plus de fois dans la boucle {\sc repeter}) et qu’il
%calcule bien les poids minimaux cherchés.
%
%Complexité : .
Algorithme de Dijkstra
POUR tout sommet t
d[s, t] = +inf
FINPOUR
d[s, s] = 0
TANT QU'il reste des sommets non fixe's
choisir un sommet t non fixe'
tel que d[s, t] soit minimale ;
fixer t ;
POUR tout successeur u de t
SI d[s, u] > d[s, t] + p(t -> u)
ALORS
d[s, u] = d[s, t] + p(t -> u)
FIN SI
FIN POUR
FIN TANT QUE
Exemple d’application de l’algorithme de Dijkstra. Soit à chercher les
plus courts chemins depuis le sommet A dans le graphe suivant :
\begin{figurette}
\centerline{\includegraphics{Figures/chemins-courts.eps}}
\end{figurette}
Le tableau suivant donne les distances depuis A et les arcs marqués
au cours des différentes étapes de l’algorithme :