Technopedia Center
PMB University Brochure
Faculty of Engineering and Computer Science
S1 Informatics S1 Information Systems S1 Information Technology S1 Computer Engineering S1 Electrical Engineering S1 Civil Engineering

faculty of Economics and Business
S1 Management S1 Accountancy

Faculty of Letters and Educational Sciences
S1 English literature S1 English language education S1 Mathematics education S1 Sports Education
  • Registerasi
  • Brosur UTI
  • Kip Scholarship Information
  • Performance
  1. Weltenzyklopädie
  2. Algorithme de Floyd-Warshall
Algorithme de Floyd-Warshall 👆 Click Here! Read More..
Un article de Wikipédia, l'encyclopédie libre.
Algorithme de Floyd-Warshall
Découvreur ou inventeur
Bernard RoyVoir et modifier les données sur Wikidata
Date de découverte
1959Voir et modifier les données sur Wikidata
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
GrapheVoir et modifier les données sur Wikidata
Complexité en temps
Pire cas
O ( | V | 3 ) {\displaystyle O(|V|^{3})} {\displaystyle O(|V|^{3})}Voir et modifier les données sur Wikidata
Moyenne
O ( | V | 3 ) {\displaystyle O(|V|^{3})} {\displaystyle O(|V|^{3})}Voir et modifier les données sur Wikidata
Meilleur cas
O ( | V | 3 ) {\displaystyle O(|V|^{3})} {\displaystyle O(|V|^{3})}Voir et modifier les données sur Wikidata
Complexité en espace
Pire cas
O ( | V | 2 ) {\displaystyle O(|V|^{2})} {\displaystyle O(|V|^{2})}Voir et modifier les données sur Wikidata

modifier - modifier le code - modifier WikidataDocumentation du modèle

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.

Algorithme

[modifier | modifier le code]

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 ) {\displaystyle G=(S,A)} {\displaystyle G=(S,A)} un graphe à n {\displaystyle n} {\displaystyle n} sommets avec S = { s 1 , s 2 , … , s n } {\displaystyle S=\{s_{1},s_{2},\dots ,s_{n}\}} {\displaystyle S=\{s_{1},s_{2},\dots ,s_{n}\}}. Il résout successivement les sous-problèmes suivants :

W i j k {\displaystyle {\mathcal {W}}_{ij}^{k}} {\displaystyle {\mathcal {W}}_{ij}^{k}} est le poids minimal d'un chemin du sommet s i ∈ S {\displaystyle s_{i}\in S} {\displaystyle s_{i}\in S} au sommet s j ∈ S {\displaystyle s_{j}\in S} {\displaystyle s_{j}\in S}n'empruntant que des sommets intermédiaires dans { s 1 , s 2 , … , s k } ∈ S {\displaystyle \{s_{1},s_{2},\dots ,s_{k}\}\in S} {\displaystyle \{s_{1},s_{2},\dots ,s_{k}\}\in S} s'il en existe un, et ∞ {\displaystyle \infty } {\displaystyle \infty } sinon.

On note W k {\displaystyle {\mathcal {W}}^{k}} {\displaystyle {\mathcal {W}}^{k}} la matrice des W i j k {\displaystyle {\mathcal {W}}_{ij}^{k}} {\displaystyle {\mathcal {W}}_{ij}^{k}}. Pour k = 0 {\displaystyle k=0} {\displaystyle k=0}, W 0 {\displaystyle {\mathcal {W}}^{0}} {\displaystyle {\mathcal {W}}^{0}} est la matrice d'adjacence définissant G {\displaystyle G} {\displaystyle G}. Maintenant, pour trouver une relation de récurrence, on considère un chemin p {\displaystyle p} {\displaystyle p} entre s i {\displaystyle s_{i}} {\displaystyle s_{i}} et s j {\displaystyle s_{j}} {\displaystyle s_{j}} de poids minimal dont les sommets intermédiaires sont dans { s 1 , s 2 , … , s k } {\displaystyle \{s_{1},s_{2},\dots ,s_{k}\}} {\displaystyle \{s_{1},s_{2},\dots ,s_{k}\}}. De deux choses l'une :

  • soit p {\displaystyle p} {\displaystyle p} n'emprunte pas le sommet s k {\displaystyle s_{k}} {\displaystyle s_{k}} ;
  • soit p {\displaystyle p} {\displaystyle p} emprunte exactement une fois le sommet s k {\displaystyle s_{k}} {\displaystyle s_{k}} (car les circuits sont de poids positifs ou nuls) et p {\displaystyle p} {\displaystyle p} est donc la concaténation de deux chemins, entre s i {\displaystyle s_{i}} {\displaystyle s_{i}} et s k {\displaystyle s_{k}} {\displaystyle s_{k}} et s k {\displaystyle s_{k}} {\displaystyle s_{k}} et s j {\displaystyle s_{j}} {\displaystyle s_{j}} respectivement, dont les sommets intermédiaires sont dans { s 1 , s 2 , … , s k − 1 } {\displaystyle \{s_{1},s_{2},\dots ,s_{k-1}\}} {\displaystyle \{s_{1},s_{2},\dots ,s_{k-1}\}}.

L'observation ci-dessus donne la relation de récurrence W i j k = min ( W i j k − 1 , W i k k − 1 + W k j k − 1 ) {\displaystyle {\mathcal {W}}_{ij}^{k}=\min({\mathcal {W}}_{ij}^{k-1},{\mathcal {W}}_{ik}^{k-1}+{\mathcal {W}}_{kj}^{k-1})} {\displaystyle {\mathcal {W}}_{ij}^{k}=\min({\mathcal {W}}_{ij}^{k-1},{\mathcal {W}}_{ik}^{k-1}+{\mathcal {W}}_{kj}^{k-1})}, pour tous i {\displaystyle i} {\displaystyle i}, j {\displaystyle j} {\displaystyle j} et k {\displaystyle k} {\displaystyle k} dans { 1 , 2 , … , n } {\displaystyle \{1,2,\dots ,n\}} {\displaystyle \{1,2,\dots ,n\}}. Ainsi on résout les sous-problèmes par valeur de k {\displaystyle k} {\displaystyle 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
      
    
    {\displaystyle G}
  
{\displaystyle G})
   
  
    
      
        
          
            
              W
            
          
          
            0
          
        
        :=
      
    
    {\displaystyle {\mathcal {W}}^{0}:=}
  
{\displaystyle {\mathcal {W}}^{0}:=} matrice d'adjacence de 
  
    
      
        G
      
    
    {\displaystyle G}
  
{\displaystyle G} (matrice 
  
    
      
        
          
            n
          
        
        ×
        
          
            n
          
        
      
    
    {\displaystyle {\mathit {n}}\times {\mathit {n}}}
  
{\displaystyle {\mathit {n}}\times {\mathit {n}}})
   for 
  
    
      
        
          
            k
          
        
        :=
        1
      
    
    {\displaystyle {\mathit {k}}:=1}
  
{\displaystyle {\mathit {k}}:=1} to 
  
    
      
        
          
            n
          
        
      
    
    {\displaystyle {\mathit {n}}}
  
{\displaystyle {\mathit {n}}}
       for 
  
    
      
        
          
            i
          
        
        :=
        1
      
    
    {\displaystyle {\mathit {i}}:=1}
  
{\displaystyle {\mathit {i}}:=1} to 
  
    
      
        
          
            n
          
        
      
    
    {\displaystyle {\mathit {n}}}
  
{\displaystyle {\mathit {n}}}
           for 
  
    
      
        
          
            j
          
        
        :=
        1
      
    
    {\displaystyle {\mathit {j}}:=1}
  
{\displaystyle {\mathit {j}}:=1} to 
  
    
      
        
          
            n
          
        
      
    
    {\displaystyle {\mathit {n}}}
  
{\displaystyle {\mathit {n}}}
                
  
    
      
        
          
            
              W
            
          
          
            i
            j
          
          
            k
          
        
        =
        min
        (
        
          
            
              W
            
          
          
            i
            j
          
          
            k
            −
            1
          
        
        ,
        
          
            
              W
            
          
          
            i
            k
          
          
            k
            −
            1
          
        
        +
        
          
            
              W
            
          
          
            k
            j
          
          
            k
            −
            1
          
        
        )
      
    
    {\displaystyle {\mathcal {W}}_{ij}^{k}=\min({\mathcal {W}}_{ij}^{k-1},{\mathcal {W}}_{ik}^{k-1}+{\mathcal {W}}_{kj}^{k-1})}
  
{\displaystyle {\mathcal {W}}_{ij}^{k}=\min({\mathcal {W}}_{ij}^{k-1},{\mathcal {W}}_{ik}^{k-1}+{\mathcal {W}}_{kj}^{k-1})}
   renvoyer 
  
    
      
        
          
            
              W
            
          
          
            n
          
        
      
    
    {\displaystyle {\mathcal {W}}^{n}}
  
{\displaystyle {\mathcal {W}}^{n}}

On peut optimiser l'algorithme en effectuant le calcul en place dans une unique matrice W {\displaystyle {\mathcal {W}}} {\displaystyle {\mathcal {W}}}. Le pseudo-code suivant effectue ce calcul :

 fonction FloydWarshall (
  
    
      
        G
      
    
    {\displaystyle G}
  
{\displaystyle G})
   
  
    
      
        
          
            W
          
        
        :=
      
    
    {\displaystyle {\mathcal {W}}:=}
  
{\displaystyle {\mathcal {W}}:=}matrice d'adjacence de 
  
    
      
        G
      
    
    {\displaystyle G}
  
{\displaystyle G} (matrice 
  
    
      
        
          
            n
          
        
        ×
        
          
            n
          
        
      
    
    {\displaystyle {\mathit {n}}\times {\mathit {n}}}
  
{\displaystyle {\mathit {n}}\times {\mathit {n}}})
   for 
  
    
      
        
          
            k
          
        
        :=
        1
      
    
    {\displaystyle {\mathit {k}}:=1}
  
{\displaystyle {\mathit {k}}:=1} to 
  
    
      
        
          
            n
          
        
      
    
    {\displaystyle {\mathit {n}}}
  
{\displaystyle {\mathit {n}}}
       for 
  
    
      
        
          
            i
          
        
        :=
        1
      
    
    {\displaystyle {\mathit {i}}:=1}
  
{\displaystyle {\mathit {i}}:=1} to 
  
    
      
        
          
            n
          
        
      
    
    {\displaystyle {\mathit {n}}}
  
{\displaystyle {\mathit {n}}}
           for 
  
    
      
        
          
            j
          
        
        :=
        1
      
    
    {\displaystyle {\mathit {j}}:=1}
  
{\displaystyle {\mathit {j}}:=1} to 
  
    
      
        
          
            n
          
        
      
    
    {\displaystyle {\mathit {n}}}
  
{\displaystyle {\mathit {n}}}
                
  
    
      
        
          
            
              W
            
          
          
            
              
                i
              
            
            
              
                j
              
            
          
        
        :=
        min
        (
        
          
            
              W
            
          
          
            
              
                i
              
            
            
              
                j
              
            
          
        
        ,
        
          
            
              W
            
          
          
            
              
                i
              
            
            
              
                k
              
            
          
        
        +
        
          
            
              W
            
          
          
            
              
                k
              
            
            
              
                j
              
            
          
        
        )
      
    
    {\displaystyle {\mathcal {W}}_{{\mathit {i}}{\mathit {j}}}:=\min({\mathcal {W}}_{{\mathit {i}}{\mathit {j}}},{\mathcal {W}}_{{\mathit {i}}{\mathit {k}}}+{\mathcal {W}}_{{\mathit {k}}{\mathit {j}}})}
  
{\displaystyle {\mathcal {W}}_{{\mathit {i}}{\mathit {j}}}:=\min({\mathcal {W}}_{{\mathit {i}}{\mathit {j}}},{\mathcal {W}}_{{\mathit {i}}{\mathit {k}}}+{\mathcal {W}}_{{\mathit {k}}{\mathit {j}}})}
   renvoyer 
  
    
      
        
          
            W
          
        
      
    
    {\displaystyle {\mathcal {W}}}
  
{\displaystyle {\mathcal {W}}}

La complexité en temps, dans le pire cas, de cet algorithme (deuxième version) est O ( n 3 ) {\displaystyle O(n^{3})} {\displaystyle O(n^{3})} et sa complexité en espace O ( n 2 ) {\displaystyle O(n^{2})} {\displaystyle O(n^{2})}.

Exemple

[modifier | modifier le code]

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

Floyd-Warshall example

  • Pour k = 0 {\displaystyle k=0} {\displaystyle k=0}, les seuls chemins sont les arcs directs.
  • Pour k = 1 {\displaystyle k=1} {\displaystyle k=1}, on regarde les chemins où le sommet s 1 {\displaystyle s_{1}} {\displaystyle s_{1}} peut être un sommet intermédiaire. On trouve le chemin s 2 → s 1 → s 3 {\displaystyle s_{2}\rightarrow s_{1}\rightarrow s_{3}} {\displaystyle s_{2}\rightarrow s_{1}\rightarrow s_{3}} qui est moins lourd que s 2 → s 3 {\displaystyle s_{2}\rightarrow s_{3}} {\displaystyle s_{2}\rightarrow s_{3}}.
  • Pour k = 2 {\displaystyle k=2} {\displaystyle k=2}, maintenant, le sommet s 2 {\displaystyle s_{2}} {\displaystyle s_{2}} peut être un sommet intermédiaire. La boîte rouge et la boîte bleu montrent que le chemin s 4 → s 2 → s 1 → s 3 {\displaystyle s_{4}\rightarrow s_{2}\rightarrow s_{1}\rightarrow s_{3}} {\displaystyle s_{4}\rightarrow s_{2}\rightarrow s_{1}\rightarrow s_{3}} est la concaténation du chemin s 4 → s 2 {\displaystyle s_{4}\rightarrow s_{2}} {\displaystyle s_{4}\rightarrow s_{2}} et s 2 → s 1 → s 3 {\displaystyle s_{2}\rightarrow s_{1}\rightarrow s_{3}} {\displaystyle s_{2}\rightarrow s_{1}\rightarrow s_{3}} avec le sommet s 2 {\displaystyle s_{2}} {\displaystyle s_{2}} comme sommet intermédiaire. Notons que le chemin s 4 → s 2 → s 3 {\displaystyle s_{4}\rightarrow s_{2}\rightarrow s_{3}} {\displaystyle s_{4}\rightarrow s_{2}\rightarrow s_{3}} n'est pas considéré car c'est s 2 → s 1 → s 3 {\displaystyle s_{2}\rightarrow s_{1}\rightarrow s_{3}} {\displaystyle s_{2}\rightarrow s_{1}\rightarrow s_{3}} qui est un chemin le plus léger obtenu à l'itération précédente et non s 2 → s 3 {\displaystyle s_{2}\rightarrow s_{3}} {\displaystyle s_{2}\rightarrow s_{3}}.
  • Pour k = 3 {\displaystyle k=3} {\displaystyle k=3}, on trouve encore d'autres chemins.
  • Pour k = 4 {\displaystyle k=4} {\displaystyle 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 :

  • Plus courts chemins dans les graphes orientés non pondérés (en donnant un poids 1 à chaque arc)
  • Clôture transitive d'un graphe orienté (algorithme de Warshall). Dans la formulation initiale de l'algorithme ci-dessus par Warshall, le graphe n'est pas valué et donc simplement représenté par une matrice de booléens. On obtient alors la clôture transitive de ce graphe en remplaçant dans l'algorithme ci-dessus l'addition par la conjonction (ET) et le minimum par la disjonction (OU).
  • Trouver une expression régulière dénotant le langage rationnel défini par un automate fini. Les formules sont celles connues sous le nom d’algorithme de McNaughton et Yamada.

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,‎ 1959, 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,‎ 7 novembre 1993, p. 188–191 (ISBN 0818644907, lire en ligne, consulté le 9 février 2018)

Références

[modifier | modifier le code]
  • (en) Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest et Clifford Stein, Introduction to Algorithms, MIT Press et McGraw-Hill, 2001, 2e éd. [détail de l’édition]
    • Section 26.2, "The Floyd-Warshall algorithm", p. 558–565;
    • Section 26.4, "A general framework for solving path problems in directed graphs", p. 570–576.
  • (en) Robert W. Floyd, « Algorithm 97: Shortest Path », Communications of the ACM, vol. 5, no 6,‎ juin 1962, p. 345 (DOI 10.1145/367766.368168)
  • (en) Stephen Warshall, « A theorem on Boolean matrices », Journal of the ACM, vol. 9, no 1,‎ janvier 1962, p. 11–12 (DOI 10.1145/321105.321107)

Voir aussi

[modifier | modifier le code]
  • Algorithme de Warshall
  • Robert Floyd
  • Algorithme de Dijkstra
  • Algorithme de Bellman-Ford
v · m
Algorithmes sur les graphes
Recherche
  • A*
  • D*
  • parcours en largeur
  • parcours en largeur lexicographique
  • parcours en profondeur
  • recherche arborescente Monte-Carlo
  • recherche best-first
  • recherche en faisceau
  • recherche jump point
Plus court chemin
  • Bellman-Ford
  • Dijkstra
  • Floyd-Warshall
  • Johnson
Arbre couvrant minimum
  • Borůvka
  • Kruskal
  • Prim
  • reverse-delete
Flot maximum
  • Dinic
  • Edmonds-Karp
  • Ford-Fulkerson
  • Goldberg-Tarjan
Coupe minimum
  • Karger
  • Stoer-Wagner
Composantes fortement connexes
  • Kosaraju
  • Tarjan
Coloration
  • DSATUR
  • Wigderson
  • icône décorative Portail de l'informatique théorique
Ce document provient de « https://fr.wikipedia.org/w/index.php?title=Algorithme_de_Floyd-Warshall&oldid=225067319 ».
Catégorie :
  • Algorithme de la théorie des graphes
Catégories cachées :
  • Page utilisant P61
  • Page utilisant P575
  • Page utilisant P31
  • Page utilisant P2283
  • Page utilisant P3752
  • Page utilisant P3754
  • Page utilisant P3753
  • Page utilisant P3755
  • Article utilisant l'infobox Algorithme
  • Article utilisant une Infobox
  • Portail:Informatique théorique/Articles liés
  • Portail:Informatique/Articles liés
  • Portail:Mathématiques/Articles liés
  • Portail:Sciences/Articles liés

  • indonesia
  • Polski
  • الرية
  • Deutsch
  • English
  • Español
  • Français
  • Italiano
  • مصر
  • Nederlands
  • 本語
  • Português
  • Sinugboanong Binisaya
  • Svenska
  • Українска
  • Tiếng Việt
  • Winaray
  • 中文
  • Русски
Sunting pranala
Pusat Layanan

UNIVERSITAS TEKNOKRAT INDONESIA | ASEAN's Best Private University
Jl. ZA. Pagar Alam No.9 -11, Labuhan Ratu, Kec. Kedaton, Kota Bandar Lampung, Lampung 35132
Phone: (0721) 702022
Email: pmb@teknokrat.ac.id