• Aucun résultat trouvé

Algorithme de Floyd-Warshall

N/A
N/A
Protected

Academic year: 2022

Partager "Algorithme de Floyd-Warshall"

Copied!
10
0
0

Texte intégral

(1)

Algorithme de Floyd-Warshall

Judicaël Courant 13 décembre 2016

1 Introduction

Dans ce document, on considère un grapheG= (S, A) orienté et pondéré par des réels.

Notre objectif est de trouver un plus court chemin allant d’un sommet s1 à un sommet s2pourtoutcouple de sommets (s1, s2) =S2. Le but de l’algorithme deFloyd-Warshall est de calculer ces plus courts chemins et leurs longueurs.

1.1 Cadre : graphe orienté pondéré complet

Remarque 1 1. La longueur d’un chemin est défini comme la somme des poids de ses arcs.

2. Les pondérations sont des réels non nécessairement positifs.

3. S’il y a un cycle de poids strictement négatif, il n’y a pas de plus court chemin.

4. S’il n’y a pas de cycle de poids négatif, tout plus court chemin est simple.

5. S’il n’y a pas de cycle de poids strictement négatif, il y a toujours un plus court chemin simple entre deux sommets fixés.

Démonstration : Exercice.

Exercice 1 Donner un minorant de la complexité en espace des résultats d’un algo- rithme qui calcule ces longueurs. En déduire un minorant en temps.

La représentation du graphe par une matrice d’adjacence semble-t-elle pertinente ? Justifiez.

Exercice 2 Dans un grapheG, donner une estimation asymptotique du nombre de che- mins (simples) de longueur 1, 2, 3, 4 dans le cas le pire.

On peut donc craindre que la complexité du calcul des plus courts chemins soit très élevée.

(2)

Remarque 2 (Astuce de calcul) Considérons un graphe G0 = (S0, A0) pondéré par des réels, c’est-à-dire muni d’une fonction w0 : A0 → R. On peut alors construire un graphe G = (S, A) pondéré par des éléments de R∪ {+∞ }, c’est-à-dire munit d’une fonction w:A0 →R∪ {+∞ } de façon suivante :

1. S=S0.

2. A=S2\∆ (S) =(x, y)∈S2x6=y .

3. w coïncide avecw0 sur A0 : ∀(x, y)∈A w(x, y) =w0(x, y) 4. w vaut +∞ sur A\A0 : ∀(x, y)∈A\A w(x, y) = +∞.

Autrement dit, étant donné un graphe G0 pondéré par des réels, on peut lui ajouter tous les arcs manquants pour obtenir un graphe complet, ces nouveaux arcs ayant un poids +∞.

Alors tout chemin dans G0 est un chemin de même poids dans G. Réciproquement, dansG, tout chemin de poids non infini est un chemin de même poids dansG, et aucun chemin de poids infini dansG n’est un chemin dans G0.

Trouver un plus court chemin dans G0 est donc équivalent à trouver un plus court chemin qui ne soit pas de poids infini dans G.

On peut même s’autoriser des arêtes de la forme (x, x) ∈S2, auxquelles on donnera un poids +∞.

Dans la suite on supposera donc quele grapheGest pondéré avec des éléments de R∪ {+∞ } et est complet. De plus, on supposera que son ensemble de sommetsS est un intervalle [[0, n[[, oùn∈N. On noteMGla matrice (gij)(i,j)∈[[0,n[[2 avecgij ∈R∪{+∞ } poids de l’arc allant deià j.

1.2 Les plus courts chemins

Exercice 3 (Minimalité d’un sous-chemin) Soit k un entier non nul et s0, . . . , sk−1 des sommets. Montrer que si s0, . . . , sk−1 est un plus court chemin entre s0 et sk−1, alors pour tout (i, j) vérifiant 0 ≤ αβk−1, sα, . . . , sβ est un plus court chemin entresα et sβ.

Dans la suite on supposera queG ne contient pas de cycle de poids strictement négatif.

Définition 1 Pour (i, j)∈S2, on appelle distance de j dans le grapheG, et on note d(i, j), comme la longueur du plus court chemin entre i et j (comme somme des poids des arêtes).

On note D= (d(i, j))(i,j)∈[[0,n[[2 la matrice des distances dans le graphe.

Exercice 4 Justifiez que cette définition a un sens.

Proposition 1 d vérifie l’inégalité triangulaire :

∀(i, j, k)∈S3 d(i, k)d(i, j) +d(j, k)

(3)

Démonstration : Exercice.

Attention, dn’est pas une distance au sens mathématique usuel car : 1. Elle n’est pas symétrique.

2. Elle peut prendre des valeurs strictement négatives.

3. Elle peut prendre la valeur 0 entre deux sommets distincts.

4. Elle peut prendre la valeur +∞ (véniel).

Proposition 2 Pour tout (i, j, k) ∈ S3, on a d(i, j) =d(i, k) +d(k, j) si et seulement s’il y a un plus court chemin de i à j passant par k.

2 Calcul des longueurs

Avant de s’intéresser au calcul des plus courts chemins eux-mêmes, on va calculer leurs longueurs, c’est-à-dire calculer itérativement la matrice des distances entre deux sommets du graphe.

Pour cela, on va faire appel à une technique dite de relaxation, qu’on appliquera à des sommets bien choisis.

2.1 Principe de l’algorithme

La relaxation décrit une technique qui consiste à prendre une matrice donnant des majorants des distances dans le graphe et à diminuer (relâcher) ces majorants.

Soit M = (mij)(i,j)∈[[0,n[[2 une matrice carrée à valeurs dans R∪ {+∞ }.

Définition 2 Étant donné deux matrices AetB de coefficients respectifs(aij)(i,j)∈[[0,n[[2

et(bij)(i,j)∈[[0,n[[2 à valeurs dansR∪{+∞ }, on dira queAest majorée parB et on écrira AB ou BA pour signifier qu’on a

∀(i, j)∈0, n2 aijbij

En particulier, on dira que M majore la matrice des distances dans G ou que les coefficient de M majorent les distances dans G pour signifier qu’on a DM, c’est-à- dire

∀(i, j)∈[[0, n[[2 d(i, j)mij (1) Définition 3 (Relaxation élémentaire) Une étape élémentaire de relaxation sur le calcul de la distance entre iet j à l’aide du sommet kconsiste à remplacer le coefficient mij de M par mik+mkj si mij > mik+mkj et à ne rien faire sinon.

En Caml, cela s’écrit l e t r e l a c h e m i j k =

l e t d = m. ( i ) . ( j ) and d ’ = m. ( i ) . ( k ) + m. ( k ) . ( j ) in i f d ’ < d then m. ( i ) . ( j ) <d ’ ; ;

(4)

Exercice 5 Si, avant une étape de relaxation, les coefficients de M majorent les dis- tances dans G, les majorent-ils encore nécessairement après ladite étape ? Justifiez.

On rappelle qu’on s’intéresse à un grapheGorienté, d’ensemble de sommetsS = [[0, n[[, complet, dont les arcs sont pondérés par des éléments deR∪ {+∞ }, représenté par une matrice (gij)(i,j)∈[[0,n[[2 et queGne possède pas de cycle de poids strictement négatif.

L’algorithme de Floyd-Warshall repose sur trois idées :

1. Définir une suite finie de matrices W(k) pour k = 0, . . . , n majorant toutes la matrice des distances dans G et telle que W(n) soit exactement la matrice des distances.

2. Donner une formule de récurrence permettant de calculer cette suite de matrice.

3. Faire le calcul en place dans une unique matrice de taille n×n par relaxation.

Définition 4 On pose, pour (i, j) ∈[[0, n[[2 et k∈[[0, n+ 1[[, Wij(k) la longueur du plus court chemin entre i et j dont tout sommet intermédiaire s vérifie s < k et on note, pourk∈[[0, n+ 1[[, W(k) la matricen×n de coefficients Wij(k)

(i,j)∈[[0,n[[2. Proposition 3 On a

∀(i, j)∈[[0, n[[2\∆ ([[0, n[[) Wij(0) =gij (2)

∀i∈[[0, n[[ Wii(0)= 0 (3)

Pour tout (i, j, k)∈[[0, n[[3,

Wij(k+1)= minWij(k), Wik(k)+Wkj(k) (4)

Démonstration : Les égalités (2) et (3) sont évidentes. Montrons (4).

Soit (i, j, k) ∈[[0, n[[3. Considérons un chemin le plus court relianti à j avec tous ses sommets intermédiaires dans [[0, k[[. Il a pour longueurWij(k). De plus, tous ses sommets intermédiaires sont dans [[0, k+ 1[[. On en déduit :

Wij(k+1)Wij(k) (5)

De même, un chemin de longueur Wik(k) (resp. Wkj(k)) relie ià k (resp. k à j), avec tous ses sommets intermédiaires dans [[0, k[[, donc

Wij(k+1)Wik(k)+Wkj(k) (6)

D’après (5) et (6), on a

Wij(k+1)≤minWij(k), Wik(k)+Wkj(k) (7)

Pour montrer l’autre inégalité, considérons un chemin le plus court reliant iàj dont tous les sommets intermédiaires sont dans [[0, k+ 1[[. Il a pour poids Wij(k+1). Quitte à supprimer les cycles qu’il contient, on peut le supposer simple. On a alors deux possibi- lités :

(5)

— Ou bien il n’a pas k pour sommet intermédiaire, donc tous ses sommets intermé- daires sont dans [[0, k[[, d’oùWij(k+1)Wij(k).

— Ou bien il akpour sommet intermédiaire. Comme il est simple, les autres sommets intermédiaires sont tous dans [[0, k[[ donc le chemin se décompose en un chemin de ià kdont tous les sommets intermédiaires sont dans [[0, k[[ et un chemin de k àj dont tous les sommets intermédiaires sont dans [[0, k[[. D’oùWij(k+1)Wik(k)+Wkj(k). Dans les deux cas, on a donc

Wij(k+1)≥minWij(k), Wik(k)+Wkj(k) (8)

Le résultat se déduit de (7) et (8).

2.2 L’algorithme

Nous pouvons maintenant donner une version de l’algorithme de Floyd-Warshall sim- plifiée pour ne calculer que les longueurs :

type ’ a m a t r i x == ’ a v e c t v e c t ; ;

l e t i n f t y = exp 1 0 0 0 . ; ; (∗ +∞, en f l o t t a n t) (∗ f l o y d _ w a r s h a l l _ s i m p l e :

f l o a t m a t r i x> f l o a t m a t r i x)

(∗ ( f l o y d _ w a r s h a l l _ s i m p l e g ) r e t o u r n e une m a t r i c e m d e s d i s t a n c e s dans l e g r a p h e g .)

l e t f l o y d _ w a r s h a l l _ s i m p l e g = l e t n = v e c t _ l e n g t h g in

l e t w = make_matrix n n i n f t y in begin

(∗ i n i t i a l i s a t i o n ∗) f o r i = 0 to n−1 do

f o r j = 0 to n−1 do then

begin

w . ( i ) . ( j ) <− g . ( i ) . ( j ) ; end

done done;

(∗ on met l a d i a g o n a l e à z é r o) f o r i = 0 to n−1 do

w . ( i ) . ( i ) <− 0 . ; done;

(∗ r e l a x a t i o n)

f o r k = 0 to n−1 do (∗ w=W(k) e t p= Π(k)) f o r i = 0 to n−1 do

f o r j = 0 to n−1 do

(6)

(∗ ∀(a, b)≥(i, j) wab=Wab(k)

∀(a, b)<(i, j) wab=Wab(k+1)) r e l a c h e w p i j k

done done done;

w (on r e t o u r n e l a m a t r i c e d e s d i s t a n c e s) end; ;

L’algorithme semble assez fidèle à la description faite précédemment, à un point près : à un instant donné, on mélange dans la matricemun morceau deW(k) et deW(k+1). Il reste à voir pourquoi cela ne met pas en péril sa correction.

2.3 Correction de l’algorithme simplifié

La difficulté ici est de montrer l’invariant le plus interne. Il s’agit de l’invariantI(i, j, k) vérifiant :

∀(a, b)≥(i, j) wab=Wab(k) et∀(a, b)<(i, j) wab=Wab(k+1)

La difficulté réside essentiellement dans le fait de montrer que si I(i, j, k) est vérifié juste avant l’exécution de relache w p i j k, alors après son exécution, on a I(i, j+ 1, k).

Lorsqu’on appellerelache, le coefficient dem.(i).(j) est mis à jour (ou non) à partir des valeurs de m.(i).(k) et m.(k).(j). Si (i, k) ≥(i, j) et (k, j) ≥ (i, j), ces coefficients valent bien respectivementWik(k)etWkj(k)et dans ce cas,m.(i).(j) prend bien pour valeur Wij(k+1) et comme les autres coefficients dem sont inchangés, on a bien I(i, j+ 1, k).

Dans le cas contraire ces coefficients peuvent valoir respectivementWik(k+1)etWkj(k+1). D’où l’intérêt de la remarque suivante :

Remarque 3 Pour tout i∈[[0, n[[ et tout k∈[[0, n[[, on a Wik(k+1) =Wik(k) et Wki(k+1) =Wki(k)

Dans tous les cas,m.(i).(j) contient donc bien la valeurWij(k+1)après l’appel derelache et on a doncI(i, j+ 1, k).

Exercice 6 On pourrait envisager d’appliquer les étapes de relaxation dans un autre ordre. Par exemple, on pourrait les appliquer sur des triplets (i, j, k) pris au hasard uniformément parmi ceux qui permettent de faire diminuer au moins un coefficient de m, jusqu’à ce qu’il n’y ait plus moyen de faire évoluer la matrice m.

Montrer que cet algorithme termine avec probabilité 1 et qu’il retourne alors une ma- tricem qui est bien la matrice des distances.

(7)

2.4 Complexité

Exercice 7 Quelle est la complexité de cet algorithme en temps et en espace dans le cas le meilleur ? Le pire ?

3 Calcul des chemins

3.1 Utilisation de matrices de prédécesseurs

Exercice 8 Quelle est la longueur, dans le cas le pire, d’un chemin simple dans G? En déduire un majorant asymptotique de l’espace à utiliser si on veut représenter naïvement tous les plus courts chemin.

Ce majorant est-il serré ? (Indication : considérez un graphe où les sommets sont des villes situées le long d’un axe routier, les arcs les moyens de transport et les pondérations le coût du transport en auto-stop ou en avion)

On peut faire mieux en ne stockant qu’une matrice indiquant simplement comment construire les chemins désirés en utilisant la remarque suivante :

Remarque 4 Si un plus court chemin relieiàj (aveci6=j), il est de la formes0, . . . , sk−1 avec i = s0 et j = sk−1. On appelle prédécesseur de j sur un plus court chemin d’originei le sommet sk−2.

Exercice 9 Y a-t-il unicité du prédécesseur ?

Donc au lieu de stocker des plus courts chemins, on va stocker une matrice Π = (πij)(i,j)∈[[0,n[[2 telle que pour tout (i, j) ∈ [[0, n[[2, πij est un prédécesseur de j sur un plus court chemin d’origine i, ou πij =⊥si aucun chemin de iàj n’existe ou si i=j.

Reconstruire un plus court chemin entre i etj vérifiantd(i, j)<+∞ se fait récursi- vement :

1. Sii=j, c’est le chemin réduit ài, de longueur 0.

2. Sinon, on calcule récursivement un plus court chemin entre i et πij puis on lui ajoutej.

Exercice 10 Montrer que cet algorithme termine.

Remarque 5 1. On aurait pu stocker les successeurs plutôt que les prédécesseurs (les prédécesseurs sont plus naturels pour certains problèmes).

2. Le routage sur Internet fonctionne de cette façon : chaque nœud du réseau sait, pour chaque adresse de destination quel est le prochain nœud sur lequel envoyer le paquet et seulement le prochain nœud (et on abandonne les paquets qui bouclent).

C’est aussi le principe des panneaux routiers de direction.

Nous allons en fait travailler sur une suite de matrices Π(k)=πij(k)

(i,j)∈[[0,n[[pourk= 0, . . . , noù pour tout (i, j, k), π(k)i,j désigne un prédécesseur de j sur un plus court chemin de iàj n’ayant pas k comme sommet intermédiaire:

(8)

Définition 5 On définit par récurrence pour (i, j, k)∈[[0, n[[2 : πij(0)=⊥ sigij = +∞ ou i=j π(k+1)ij =πkj(k) si Wik(k)+Wkj(k)< Wij(k)

π(k+1)ij =πij(k) sinon

Et on pose, pour k∈[[0, n+ 1[[, Π(k)=πij(k)

(i,j)∈[[0,n[[2.

Exercice 11 Montrer que pour tout (i, j) ∈ [[0, n[[ et tout k ∈ [[0, n+ 1[[, on a ainsi bien défini un prédécesseur de j sur un plus court chemin dei à j n’ayant pas k comme sommet intermédiaire.

Notons, pour i∈[[0, n[[ et k∈[[0, n+ 1[[ fixés, Gk,i le graphe d’ensemble de sommets Sk,i=njπij(k) 6=⊥o∪ {i}et d’ensemble d’arcs Ak,i=n(k)ij , j)jSk,i\ {i}o. Exercice 12 S’agit-il bien d’un graphe ?

Proposition 4 Pour tout i∈[[0, n[[ et tout k ∈[[0, n+ 1[[, le graphe Gk,i est acyclique et l’algorithme de reconstruction donné précédemment termine sur Π(k).

Démonstration : Exercice (non trivial).

3.2 Algorithme de Floyd-Warshall

Comme précédemment pour la suite des matrices W(k), on peut en fait calculer la suite des matrices Π(k) en utilisant une unique matrice.

On adapte la fonction de relaxation en lui donnant en argument la matrice des pré- décesseurs :

l e t r e l a c h e m p i j k =

l e t d = m. ( i ) . ( j ) and d ’ = m. ( i ) . ( k ) + m. ( k ) . ( j ) in i f d ’ < d then

begin

m. ( i ) . ( j ) <− d ’ ;

p . ( i ) . ( j ) <− p . ( k ) . ( j ) ; end; ;

On peut alors écrire comme précédemment l’algorithme. La valeur ⊥est représentée par l’entier−1 dans la matrice des prédécesseurs.

type ’ a m a t r i x == ’ a v e c t v e c t ; ;

l e t i n f t y = exp 1 0 0 0 . ; ; (∗ +∞, en f l o t t a n t) (∗ f l o y d _ w a r s h a l l :

f l o a t m a t r i x> f l o a t m a t r i xi n t m a t r i x)

(9)

(∗ ( f l o y d _ w a r s h a l l g ) r e t o u r n e une m a t r i c e m d e s d i s t a n c e s dans l e g r a p h e g a i n s i qu ’ une m a t r i c e p d e s p r é d é c e s s e u r s p e r m e t t a n t l e c a l c u l d e s p l u s c o u r t s chemins : pour t o u t ( i , j ) , p . ( i ) . ( j ) e s t un p r é d é c e s s e u r de j dans un p l u s c o u r t chemin r e l i a n t i à j s ’ i l en e x i s t e un , e t −1 s i n o n . ∗)

l e t f l o y d _ w a r s h a l l g = l e t n = v e c t _ l e n g t h g in

l e t w = make_matrix n n i n f t y in l e t p = make_matrix n n (−1) in begin

(∗ i n i t i a l i s a t i o n ∗) f o r i = 0 to n−1 do

f o r j = 0 to n−1 do i f g . ( i ) . ( j ) < +i n f t y then

begin

w . ( i ) . ( j ) <− g . ( i ) . ( j ) ; p . ( i ) . ( j ) <− j ;

end done done;

(∗ on met l a d i a g o n a l e à z é r o) f o r i = 0 to n−1 do

w . ( i ) . ( i ) <− 0 . ; done;

(∗ r e l a x a t i o n)

f o r k = 0 to n−1 do (∗ w=W(k) e t p= Π(k)) f o r i = 0 to n−1 do

f o r j = 0 to n−1 do

(∗ ∀(a, b)≥(i, j) wab=Wab(k) etpab = Π(k)ab

∀(a, b)<(i, j) wab=Wab(k+1) etpab= Π(k+1)ab) r e l a c h e w p i j k

done done done;

(w, p ) end; ;

La correction se montre comme dans le cas de l’algorithme simplifié.

Exercice 13 Dans l’exerice 6 on avait envisagé d’appliquer les étapes de relaxation dans un ordre quelconque.

(10)

Les choses ne sont pas si simples pour le calcul de la matrice des prédécesseurs. Donnez un exemple de graphe sans cycle de poids négatif ou nul dans lequel, en appliquant des relaxations dans un ordre bien choisi, on obtient une matrice p telle que l’algorithme de reconstruction de plus court chemin ne termine pas (ce qui montre au passage que l’énoncé de l’exercice 10 est en fait faux).

3.3 Complexité

Exercice 14 Quelle est la complexité de cet algorithme en temps et en espace dans le cas le meilleur ? Le pire ?

Références

Documents relatifs

Pour ceci, on définit d k ij le poids d’un plus court chemin de i à j dont tous les sommets intermédiaires sont dans { 1,.. En particulier pour k = 0, un tel chemin n’a pas de

TOME s eu, Metodâ pentru determinarea drumului de cea mai mica lungime dintre doua noduri aie unui graf finit, Analele Univ. TOMESCU, Sur les méthodes matricielles dans la théorie

Mathias est dans sa maison et décide de rendre visite à quatre de ses amis (Julie, Léo, Fabien et Kevin) en VTT?. Dans quel ordre doit-il rencontrer ses amis pour effectuer le

Ils sont alors obligés de prendre un autre cap avant de virer vers la bouée d’arrivée, qui est aussi la bouée de départ.. Doc

Ils sont alors obligés de prendre un autre cap avant de virer vers la bouée d’arrivée, qui est aussi la bouée de départ.. Doc

On peut le réaliser à partir du parcours (récursif) en profondeur en partant d'un sommet sur lequel aucun arc n'aboutit dans le graphe dual. Il suffira

On peut le réaliser à partir du parcours (récursif) en profondeur dans le graphe dual en partant d'un sommet sur lequel aucun arc n'aboutit.. Il suffira

Si un sommet est égal à son point d'attache at(x), et si pour tout descendant y de x dans T, on a at(y) &lt; y, alors l'ensemble des descendants de x forme