Aller au contenu

Algorithme de Floyd-Warshall

Un article de Wikipédia, l'encyclopédie libre.
Algorithme de Floyd-Warshall
Découvreur ou inventeur
Date de découverte
Problèmes liés
Algorithme de recherche de chemin (d), algorithme de la théorie des graphes (en)Voir et modifier les données sur Wikidata
Structure des données
Complexité en temps
Pire cas
O(|S|3)Voir et modifier les données sur Wikidata
Moyenne
O(|S|3)Voir et modifier les données sur Wikidata
Meilleur cas
O(|S|3)Voir et modifier les données sur Wikidata
Complexité en espace
Pire cas
O(|S|2)Voir et modifier les données sur Wikidata

En informatique, l'algorithme de Floyd-Warshall est un algorithme pour déterminer les distances des plus courts chemins entre toutes les paires de sommets dans un graphe orienté et pondéré, en temps cubique au nombre de sommets. Il est parfois appelé algorithme de Roy-Floyd-Warshall car il a été décrit par Bernard Roy en 1959[1] avant la parution des articles de Floyd et Warshall datant de 1962.

L'algorithme de Floyd-Warshall prend en entrée un graphe orienté et valué, décrit par une matrice d'adjacence donnant le poids d'un arc lorsqu'il existe et la valeur ∞ sinon. Le poids d'un chemin entre deux sommets est la somme des poids sur les arcs constituant ce chemin. Les arcs du graphe peuvent avoir des poids négatifs, mais le graphe ne doit pas posséder de circuit de poids strictement négatif. L'algorithme calcule, pour chaque paire de sommets, le poids minimal parmi tous les chemins entre ces deux sommets.

L'algorithme de Floyd-Warshall est un exemple de programmation dynamique. Soit G=(S,A) un graphe à n sommets avec S={s1,s2,…,sn}. Il résout successivement les sous-problèmes suivants :

𝒲ijk est le poids minimal d'un chemin du sommet si∈S au sommet sj∈Sn'empruntant que des sommets intermédiaires dans {s1,s2,…,sk}∈S s'il en existe un, et ∞ sinon.

On note 𝒲k la matrice des 𝒲ijk. Pour k=0, 𝒲0 est la matrice d'adjacence définissant G. Maintenant, pour trouver une relation de récurrence, on considère un chemin p entre si et sj de poids minimal dont les sommets intermédiaires sont dans {s1,s2,…,sk}. De deux choses l'une :

  • soit p n'emprunte pas le sommet sk ;
  • soit p emprunte exactement une fois le sommet sk (car les circuits sont de poids positifs ou nuls) et p est donc la concaténation de deux chemins, entre si et sk et sk et sj respectivement, dont les sommets intermédiaires sont dans {s1,s2,…,sk−1}.

L'observation ci-dessus donne la relation de récurrence 𝒲ijk=min⁡(𝒲ijk−1,𝒲ikk−1+𝒲kjk−1), pour tous i, j et k dans {1,2,…,n}. Ainsi on résout les sous-problèmes par valeur de k croissante.

Pseudo-code

[modifier | modifier le code]

Donnons d'abord une première version d'après l'analyse faite dans la section précédente. Le pseudo-code suivant effectue ce calcul :

 fonction FloydWarshall (G)
   𝒲0:= matrice d'adjacence de G (matrice 𝑛×𝑛)
   for 𝑘:=1 to 𝑛
       for 𝑖:=1 to 𝑛
           for 𝑗:=1 to 𝑛
                𝒲ijk=min⁡(𝒲ijk−1,𝒲ikk−1+𝒲kjk−1)
   renvoyer 𝒲n

On peut optimiser l'algorithme en effectuant le calcul en place dans une unique matrice 𝒲. Le pseudo-code suivant effectue ce calcul :

 fonction FloydWarshall (G)
   𝒲:=matrice d'adjacence de G (matrice 𝑛×𝑛)
   for 𝑘:=1 to 𝑛
       for 𝑖:=1 to 𝑛
           for 𝑗:=1 to 𝑛
                𝒲𝑖𝑗:=min⁡(𝒲𝑖𝑗,𝒲𝑖𝑘+𝒲𝑘𝑗)
   renvoyer 𝒲

La complexité en temps, dans le pire cas, de cet algorithme (deuxième version) est O(n3) et sa complexité en espace O(n2).

L'algorithme est exécuté sur le graphe à gauche.

Floyd-Warshall example

  • Pour k=0, les seuls chemins sont les arcs directs.
  • Pour k=1, on regarde les chemins où le sommet s1 peut être un sommet intermédiaire. On trouve le chemin s2→s1→s3 qui est moins lourd que s2→s3.
  • Pour k=2, maintenant, le sommet s2 peut être un sommet intermédiaire. La boîte rouge et la boîte bleu montrent que le chemin s4→s2→s1→s3 est la concaténation du chemin s4→s2 et s2→s1→s3 avec le sommet s2 comme sommet intermédiaire. Notons que le chemin s4→s2→s3 n'est pas considéré car c'est s2→s1→s3 qui est un chemin le plus léger obtenu à l'itération précédente et non s2→s3.
  • Pour k=3, on trouve encore d'autres chemins.
  • Pour k=4, on a trouvé des plus courts chemins entre tous les sommets.

Applications

[modifier | modifier le code]

L'algorithme de Floyd-Warshall peut être utilisé dans les situations suivantes :

Améliorations

[modifier | modifier le code]

En 1993, Bahar et coll. ont donné une implémentation de l'algorithme de Floyd-Warshall pour des graphes représentés symboliquement à l'aide d'une structure de données appelée diagramme de décision algébriques qui est une généralisation des diagrammes de décision binaire[2].

Notes et références

[modifier | modifier le code]
  1. ↑ Bernard Roy, « Transitivité et connexité. », C. R. Acad. Sci. Paris, vol. 249,‎ , p. 216–218
  2. ↑ R. Iris Bahar, Erica A. Frohm, Charles M. Gaona et Gary D. Hachtel, « Algebraic decision diagrams and their applications », ICCAD '93 Proceedings of the 1993 IEEE/ACM international conference on Computer-aided design, IEEE Computer Society Press,‎ , p. 188–191 (ISBN 0818644907, lire en ligne, consulté le )

Références

[modifier | modifier le code]