Plus court chemin
dans un graphe
Algorithmique avancée
Hervé Blanchon
IUT 2 – Département Informatique
Université Pierre Mendès France
2
Algorithmes de plus court chemin
!!On considère un graphe valué
"!chaque arc est muni d’un poids
!!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
"!avec des poids qui peuvent être négatifs c’est moins facile
!!Il existe plusieurs algorithmes
"!algorithme de Floyd (en |S|3)
3
Plus court chemin sur un graphe non valué
!!Soit G un graphe non valué
!!En utilisant un nœud s comme point de départ, on voudrait trouver le plus
court chemin depuis s jusqu’à tous les autres nœuds.
!!On est intéressé uniquement par le nombre d’arcs parcourus (soit la
longueur des chemins)
"!Si on était intéressé par les chemins, il faudrait mettre d’autres
informations à jour
4
Plus court chemin sur un graphe non valué
!!Soit s le nœud v3.
1.!Le plus court chemin de s à v3 est de longueur 0
"!on peut marquer cette information [schéma de gauche]
2.!On peut maintenant chercher tous les nœuds distants de 1 de s en
cherchant les nœuds adjacents de s (via un arc)
!!Il s’agit de v1 et v6. [schéma de droite]
5
Plus court chemin sur un graphe non valué
3.!On peut maintenant trouver les nœuds à distance 2 de s en cherchant les
nœuds adjacents à v1 et v6 pour lesquels un plus court chemin n’est pas
déjà connu (afin d’éviter de rentrer dans un cycle)
!!Il s’agit de v2 et v4 [schéma de gauche]
4.!On peut finalement trouver les nœuds à distance 3 de s en cherchant les
nœuds adjacents à v2 et v4
!!il s’agit de v5 et v7 [schéma de droite]
5.!Tous les nœuds ont été examinés, c’est terminé.
6
Plus court chemin sur un graphe non valué
!!La stratégie mise en œuvre est une stratégie en largeur d’abord
"!breadth-first search (BFS) ! File d’attente
!!Les informations qu’il faut mémoriser pour chaque nœuds v sont les
suivantes :
"!la longueur du chemin depuis s vers v : dv (distance à s)
!!initialement aucun nœud n’est atteignable, sauf s dont la distance à s est
égale à 0
"!le nœud précédent v sur le chemin qui l’atteint depuis s : pv
"!un booléen qui permet de savoir si v a déjà été visité : known
!!Ces informations sont mémorisées
dans une table
"!état initial :
7
Plus court chemin sur un graphe non valué
!!Trace de l’algorithme
8
V1 V2
V4
V3
V6 V7
V5
origine
0
File: V3
Autre trace
9
Autre trace
V1 V2
V4
V3
V6 V7
V5
origine
1
1
File: V1 V6
10
Autre trace
V1 V2
V4
V3
V6 V7
V5
origine
1
1
2
2
File: V6 V2 V4
11
Autre trace
V1 V2
V4
V3
V6 V7
V5
origine
1
1
2
2
File: V2 V4
12
Autre trace
V1 V2
V4
V3
V6 V7
V5
origine
1
1
2
2
File: V4 V5
3
13
Autre trace
V1 V2
V4
V3
V6 V7
V5
origine
1
1
2
2
File: V5 V7
3
3
14
Autre trace
V1 V2
V4
V3
V6 V7
V5
origine
1
1
2
2
File: V7
3
3
15
Plus court chemin sans poids
V1 V2
V4
V3
V6 V7
V5
origine
1
1
2
2
File: vide
3
3
void unweighted( Vertex s )
{
Queue<Vertex> q = new Queue<Vertex>( );
for each Vertex v // aucun des nœuds n’est atteint
v.dist = INFINITY;
s.dist = 0; // distance à s, premier nœud, =0
q.enqueue( s ); // s est enfilé
while( !q.isEmpty( ) )
{
Vertex v = q.dequeue( ); // le nœud à traiter est défilé
for each Vertex w adjacent to v
if( w.dist == INFINITY ) // on ne met dans la file que les
{ // jamais atteints
w.dist = v.dist + 1; // distance mise à jour
w.path = v; // précédent mis à jour
q.enqueue( w ); // le nœud traité est enfilé
}
}
}
17
Plus court chemin sur un graphe non valué
!!Algorithme utilisant une file pour les nœuds à explorer
"!l’information Known n’est pas nécessaire
!!on ne met dans la file que les nœuds jamais atteints
for each Vertex w adjacent to v
if( w.dist == INFINITY )
{
// distance mise à jour
// précédent mis à jour
// le nœud traité est enfilé
}
!!Coût de l’algorithme
"!O(|E|+|V|)
!!E=nombre d’arcs
!!V=nombre de nœuds
18
Plus court chemin sur un graphe valué positif (vp)
!!Le problème est du même type que le précédent
!!Information à mémoriser pour un nœud
"!un sommet est connu ou non (known à False ou True)
"!le sommet précédemment visité (pv)
"!la distance parcourue jusqu’alors (dv)
!!cette distance est la plus courte de s à v en utilisant uniquement des
sommets connus
!!La méthode générale est l’algorithme de Dijkstra (1959)
"!Algorithme glouton
!!celle qui semble être la meilleure option est choisie à chaque étape
!!sachant que tous les plus courts chemins sont déjà connus
19
Plus court chemin sur un graphe vp
!!Classe nœud pour l’algorithme de Dijkstra
20
Plus court chemin sur un graphe vp : exemple
!!Graphe de départ
!!Configuration initiale des données
"!nœud de départ (s) : v1
"!longueur de chemin = 0
1 / 10 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !