0% ont trouvé ce document utile (0 vote)
85 vues12 pages

Cours 3

Le document traite des algorithmes de Dijkstra et de Floyd-Warshall pour déterminer les plus courts chemins dans un graphe. L'algorithme de Dijkstra est utilisé pour trouver la distance du plus court chemin à partir d'un sommet donné, tandis que l'algorithme de Floyd-Warshall calcule les distances minimales entre toutes les paires de sommets. Les deux algorithmes ont des applications pratiques dans divers domaines, tels que le routage et le câblage.

Transféré par

ayoub bouker
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
85 vues12 pages

Cours 3

Le document traite des algorithmes de Dijkstra et de Floyd-Warshall pour déterminer les plus courts chemins dans un graphe. L'algorithme de Dijkstra est utilisé pour trouver la distance du plus court chemin à partir d'un sommet donné, tandis que l'algorithme de Floyd-Warshall calcule les distances minimales entre toutes les paires de sommets. Les deux algorithmes ont des applications pratiques dans divers domaines, tels que le routage et le câblage.

Transféré par

ayoub bouker
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Plus court chemin et Algorithme de Dijkstra

Objectif : Etant donné 𝐺𝐺 = 𝑉𝑉, 𝐸𝐸 un graphe valué (valeurs non-négatives) sur les arcs/arêtes et un sommet initial 𝑠𝑠,
déterminer la distance du plus court chemin entre 𝑠𝑠 et tout sommet atteignable.

Applications : câblage dans une centrale nucléaire, routages dans l’internet…


Opération triangulaire et calcul du plus court chemin
j

𝑑𝑑𝑖𝑖𝑖𝑖 Etant donné une matrice [𝑑𝑑𝑗𝑗𝑗𝑗] de distance nxn l’opération triangulaire for sommet k est :
𝑑𝑑𝑗𝑗𝑗𝑗
𝑑𝑑𝑖𝑖𝑖𝑖 = min {𝑑𝑑𝑖𝑖𝑖𝑖, 𝑑𝑑𝑖𝑖𝑖𝑖 + 𝑑𝑑𝑗𝑗𝑗𝑗 }, pour tout i, k = 1,...,n et i,k =/= j
i k
𝑑𝑑𝑖𝑖𝑖𝑖
X1 𝑐𝑐𝑥𝑥1𝐵𝐵 Le plus court chemin de A à B: r(B)
x2 𝑐𝑐𝑥𝑥2𝐵𝐵 B
A r(B)=min{ r(xi) + 𝑐𝑐𝑥𝑥𝑥𝑥𝑥𝑥 : i=1,…,k }
𝑐𝑐𝑥𝑥𝑘𝑘𝑘𝑘
Xk Rm : chaque r(xi) + 𝑐𝑐𝑥𝑥𝑥𝑥𝑥𝑥est un majorant de r(B) (borne sup)

V-W 𝜌𝜌 𝑦𝑦 =10
10 y
W
𝑐𝑐𝑥𝑥𝑥𝑥 = 2
y s x
y 𝜌𝜌 𝑥𝑥 =5
s x y
y
Algorithme de Dijkstra

Pour tout 𝑢𝑢, 𝑣𝑣 ∈ 𝑉𝑉, on définit 𝑐𝑐𝑢𝑢𝑢𝑢 ≥ 0 si 𝑢𝑢, 𝑣𝑣 ∈ 𝐸𝐸; 𝑐𝑐𝑢𝑢𝑢𝑢 = ∞ si 𝑢𝑢, 𝑣𝑣 ∉ 𝐸𝐸.

𝑊𝑊 = {𝑥𝑥 ∈ 𝑉𝑉 | le plus court chemin de 𝑠𝑠 à 𝑥𝑥 est connu}


Un vecteur 𝜌𝜌[𝑥𝑥] de taille |V| où 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡 𝑥𝑥 ∈ 𝑉𝑉, 𝑡𝑡𝑡𝑡
𝑠𝑠𝑠𝑠 𝑥𝑥 ∈ 𝑊𝑊, 𝜌𝜌 𝑥𝑥 = la distance du plus court chemin de 𝑠𝑠 à 𝑥𝑥.
𝑠𝑠𝑠𝑠 𝑥𝑥 ∉ 𝑊𝑊, 𝜌𝜌 𝑥𝑥 = le meilleur majorant jusqu′ à présent de la distance du plus court chemin de 𝑠𝑠 à 𝑥𝑥
(𝐞𝐞𝐞𝐞 𝐩𝐩𝐩𝐩𝐩𝐩𝐩𝐩𝐩𝐩𝐩𝐩𝐩𝐩 𝐮𝐮𝐮𝐮𝐮𝐮𝐮𝐮𝐮𝐮𝐮𝐮𝐮𝐮𝐮𝐮𝐮𝐮𝐮𝐮 𝐩𝐩𝐩𝐩𝐩𝐩 𝐥𝐥𝐥𝐥𝐥𝐥 𝐬𝐬𝐬𝐬𝐬𝐬𝐬𝐬𝐬𝐬𝐬𝐬𝐬𝐬 𝑑𝑑𝑑𝑑 𝑊𝑊).

L’idée de l’algorithme :
𝑐𝑐𝑠𝑠𝑠𝑠 ≥ 0, si 𝑠𝑠, 𝑦𝑦 ∈ 𝐸𝐸
Initialisation: 𝑊𝑊 = {𝑠𝑠}, 𝜌𝜌 𝑠𝑠 = 0; pour tout 𝑦𝑦 ∈ 𝑉𝑉 ∖ 𝑠𝑠 , on définit 𝜌𝜌 𝑦𝑦 = �
∞, sinon, i. e. , 𝑠𝑠, 𝑦𝑦 ∉ 𝐸𝐸

Extension de 𝑊𝑊 (itération par itération): étendre 𝑊𝑊 par un sommet 𝑥𝑥 ∈ 𝑉𝑉 ∖ 𝑊𝑊 𝑥𝑥 ∉ 𝑊𝑊 tq 𝜌𝜌 𝑥𝑥 = min{𝜌𝜌 𝑦𝑦 | 𝑦𝑦 ∈ 𝑉𝑉 ∖ 𝑊𝑊}

𝜌𝜌 𝑥𝑥 + 𝑐𝑐𝑥𝑥𝑥𝑥, 𝑠𝑠𝑠𝑠 𝜌𝜌 𝑥𝑥 + 𝑐𝑐𝑥𝑥𝑦𝑦 < 𝜌𝜌 𝑦𝑦


Mis à jour du vecteur 𝜌𝜌: pour tout successeur 𝑦𝑦 de 𝑥𝑥 et 𝑦𝑦 ∉ 𝑊𝑊, 𝜌𝜌 𝑦𝑦 = �
𝜌𝜌 𝑦𝑦 , sinon
Plus court chemin et Algorithme de Dijkstra
Algorithme de Dijikstra
Input : Graphe orienté 𝐺𝐺 = 𝑉𝑉, 𝐸𝐸 avec valuations 𝑐𝑐𝑢𝑢𝑢𝑢 ≥ 0 sur les arcs et un sommet 𝑠𝑠 ∈ 𝑉𝑉
Output : Vecteur 𝜌𝜌 de taille |V| : pour tout 𝑥𝑥 ∈ 𝑉𝑉, 𝜌𝜌 𝑥𝑥 = la distance du plus court chemin de s à 𝑥𝑥 atteignable
begin
𝑊𝑊 ← 𝑠𝑠 ; 𝜌𝜌 𝑠𝑠 ← 0;
𝒇𝒇𝒇𝒇𝒇𝒇 tout 𝑦𝑦 ∈ 𝑉𝑉 ∖ {𝑠𝑠} 𝒅𝒅𝒅𝒅 𝜌𝜌 𝑦𝑦 ← 𝑐𝑐𝑠𝑠𝑠𝑠
𝒘𝒘𝒘𝒘𝒘𝒘𝒘𝒘𝒘𝒘 𝑊𝑊 ≠ 𝑉𝑉 𝒅𝒅𝒅𝒅
begin
Chercher le plus petit 𝜌𝜌 𝑥𝑥 = min 𝜌𝜌 𝑦𝑦 𝑦𝑦 ∉ 𝑊𝑊};
𝑊𝑊 ← 𝑊𝑊 ∪ 𝑥𝑥 ;
𝒇𝒇𝒇𝒇𝒇𝒇 tout 𝑦𝑦 ∈ 𝑉𝑉 ∖ W 𝒅𝒅𝒅𝒅
𝜌𝜌 𝑦𝑦 ← min{𝜌𝜌 𝑦𝑦 , 𝜌𝜌 𝑥𝑥 + 𝑐𝑐𝑥𝑥𝑦𝑦}
end
end
Complexité en temps
1) Initialisation du vecteur 𝜌𝜌: 𝑂𝑂(|V |)
2) Boucle principale : |V | itérations et chaque itération est bornée par 𝑂𝑂 |V | , donc 𝑂𝑂(|V |2 ) au total.
Rm:
L’algorithme ne donne pas les chemins, mais la distance de chaque plus court chemin.
Plus court chemin et Algorithme de Dijkstra

Ex: Dérouler l’algorithme de Dijkstra en donnant


l’état de 𝑊𝑊 et 𝜌𝜌 itération par iteration;
Indiquer les valeurs mises à jour de 𝜌𝜌.
Distances minimales entre chaque paire de sommets et algorithme de Floyd-Warshall
u

𝑑𝑑𝑣𝑣𝑣𝑣 Etant donné une matrice [𝑑𝑑] de distance nxn l’opération triangulaire pour sommet w est :
𝑑𝑑𝑢𝑢𝑢𝑢
𝑑𝑑𝑣𝑣𝑣𝑣 = min {𝑑𝑑𝑣𝑣𝑣𝑣, 𝑑𝑑𝑣𝑣𝑣𝑣 + 𝑑𝑑𝑢𝑢𝑢𝑢 }, pour tout v, w = 1,...,n et v,w =/= u
v w
𝑑𝑑𝑣𝑣𝑣𝑣

L’idée: on considère chaque sommet u tour à tour comme un pivot, on examine chaque paire de sommets v et w
ayant u comme somme intermédiaire.

Si d(v,u) + d(u,w) < d(v,w), alors d(v,w) = d(v,u) + d(u,w)

Hypothèses :

1. Les sommets sont numérotés de 1 à n


2. Le graphe est représenté par sa matrice de distance A
3. On utilise une matrice d[nxn] pour représenter la distance minimale entre chaque paire de sommets
Algorithme de Floyd-Warshall

Input: graphe représenté par sa matrice A d’adjacence


Output: matrice d de distance minimale entre chaque paire de sommets

Var: u, v, w: Entiers
Début
pour v = 1 à n faire
pour w = 1 à n faire
d(v,w) = A(v,w) /* A est la matrice d’adjacence
pour u = 1 à n faire /* u est le pivot
pour v = 1 à n faire
pour w = 1 à n faire
si d(v,u) + d(u,w) < d(v,w)
alors d(v,w) = d(v,u) + d(u,w)

Rm:

1. Complexité O(𝑛𝑛3 )
2. Applicable aux graphes orientés et non-orientés
Example

Pas de changement avec pivot 4 Pivot 5


Justification de de l’algorithme de Floyd-Warshall

Une fois fini, nous avons, pour tout v,w, d(v,w) = la longueur du plus court chemin entre v et w.

Déf : (k-chemin) : un k-chemin de v à w est un chemin dont les sommets intermédiaires ont un no ≤ k.

Ex:
• 1-2-3-4 : 3-chemin (mais aussi 4-chemin, 5-chemin…)
• 0-chemin est un sommet ou un arc
• Un n-chemin est un chemin quelconque (n = le nombre des sommets du graphe)

Démonstration par récurrence


Assertion S(k) : juste après l’itération u = k, d(v,w) = la longueur du plus court k-chemin de v à w.

La base : si k = 0, S(0) est vrai car d(v,w) = A(v,w)

Récurrence : Supposons S(k), on cherche à démontrer S(k+1), i.e.,


après itérations u=k+1, d(v,w) = la longueur du plus court (k+1)-chemin de v à w.
Justification de de l’algorithme de Floyd-Warshall (suite)
Sout C un plus court (k+1)-chemin de v à w, deux cas sont possibles selon si C passe ou non par le sommet k+1.

1) C ne passe pas par le sommet k+1, l’itération courante (k+1) n’a aucune influence sur d(v,w) qui est égale à
la longueur du plus court k-chemin, donc (k+1)-chemin. Done.

2) C passe par k+1, C est donc composé d’un k-chemin A et d’un k-chemin B : v - - - - - - (k+1) - - - - - - - w

D’après l’hypothèse S(k),


- d(v,k+1) = la longueur du plus court k-chemin de v à k+1
- d(k+1,w) = la longueur du plus court k-chemin de k+1 à w.

Le test d(v,k+1) + d(k+1,w) < d(v,w) réussit (car C est le plus court (k+1)-chemin de v à w),

Selon l’algorithme, l’affectation d(v,w) = d(v,k+1) + d(k+1,w) est alors effectuée.

Donc d(v,w) = la longueur du plus court k-chemin de v à w après l’itération (k+1).


Puisque un k-chemin est aussi un (k+1) chemin, on obtient le résultat.

Pour un graphe de n sommets, on pose k=n.


Fermeture transitive et réflexive de G

L’algorithme est fondé sur la récurrence suivante :


1) exchemin(x,y) = arc(x,y)
2) exchemin(x,y) = exchemin(x,i) ET arc(i,y)

On replace la matrice de distance par une matrice d[nxn] booléenne, et on replace l’opération triangulaire par
une opération booléenne.
Exemple d’application (compilateur)
Var: u, v, w: booléenne Un graphe de dépendance est un graphe où
Début les sommets sont des variables et un arc entre
la variable x et la variable y indique que le calcul de a
pour v = 1 à n faire
nécessite le calcul de b.
pour w = 1 à n faire
d(v,w) = vrai ou faux selon si (v,w) ∈ 𝐸𝐸) La fermeture transitive de ce graphe donne toutes les
pour u = 1 à n faire variables nécessaires directement ou indirectement
pour v = 1 à n faire au calcul de a.
pour w = 1 à n faire
si NOT d(v,w) Cette information permet de minimiser la quantité
alors d(v,w) = d(v,u) ET d(u,w) de calculs à effectuer en machine pour l'exécution
du programme.
Fermeture transitive et réflexive

Dérouler l’algorithme sur le graphe G suivant

G G*

Vous aimerez peut-être aussi