Algorithme de Dijsktra
Algorithme de DijsktraAlgorithme de Dijsktra
Algorithme de Dijsktra
Chemins minimaux à partir d’une source
Auteur : Tony Wong Ph.D., ing.
Département de génie de production automatisée
École de technologie supérieure
Courriel : wong.wong@ etsmtl.ca
Université du Québec
École de technologie supérieure
Département de génie de la production automatisée
Algorithme de Dijsktra
Les chemins minimaux à partir d’une seule source
Présentation
À partir d’un graphe, l’algorithme de Dijsktra utilise le parcours en « largeur d’abord »
et l’approche « gourmande » (greedy) pour trouver les chemins les plus courts entre une
source et toutes les destinations du graphe.
Puisqu’un graphe est composé de nœuds et d’arêtes, l’algorithme de Dijsktra peut
trouver les chemins les plus courts liant un nœud quelconque à tous les autres noeuds
du graphe en une seule exécution.
Conditions d’applicabilité
L’algorithme de Dijsktra s’opère dans l’univers des graphes. Les graphes acceptés
peuvent être orientés ou non. La figure 1a) montre un graphe non orienté alors que la
figure 1b) montre un graphe orienté.
1a) 1b)
Figure 1 Graphe non orienté (a), graphe orienté (b).
Section
1
3
Un graphe peut également être pondéré. Dans ce cas, la valeur de pondération est
indiquée sur les arêtes du graphe. La figure 2 montre un graphe orienté et pondéré.
1 2 3
7
4 5 6
8
400 700
300 600
1200
700700
1700700
Figure 2 Graphe orienté et pondéré.
De cette façon, nous pouvons représenter un nombre de situations réelles par des
graphes. Par exemple, le trafic aérien où les nœuds sont des villes et les pondérations
sont le coût des billets d’embarquement reliant deux villes. Dans le domaine de la
production industrielle, les nœuds peuvent représenter différentes étapes d’un
processus de fabrication alors que les pondérations peuvent représenter le temps
requis pour passer d’une étape à l’autre.
L’application de l’algorithme de Dijsktra exige un graphe dont les caractéristiques
sont :
Orienté ou non orienté.
Pondéré ou non pondéré.
Valeur de la pondération non négative (c’est à dire, 0).
Enfin, il doit exister au moins un chemin partant du nœud de départ vers tous les
autres nœuds du graphe. Évidemment, cette condition ne s’applique pas pour le
nœud de départ.
Il est donc important de s’assurer que les valeurs inscrites sur les arêtes des
graphes soient non négatives.
Nature des graphes
Cette section est une brève introduction, pour les non initiés, de la théorie des
graphes. Les lecteurs qui ne s’intéressent qu’aux applications de l’algorithme de
Dijkstra sont priés de passer à la section suivante.
Un graphe G est représenté par la notation
4
G = (N, A) (1)
N est l’ensemble des nœuds et A est l’ensemble des arêtes et chaque arête est un
pair (u, v) où u, v N. Si l’ordre des nœuds dans le pair (u, v) est important alors le
graphe est orienté. Dans le cas contraire, le graphe est non orienté.
Dans un graphe orienté, on dit qu’un nœud v est adjacent au nœud u si et seulement si
le pair (u, v) A. C’est-à-dire, l’arête (u, v) existe dans le graphe. Pour exprimer la
même notion dans un graphe non orienté, on dit qu’un nœud v est adjacent au nœud
u (et par le fait même u est adjacent à v) si (u, v) A et (v, u) A.
Lorsqu’un graphe est pondéré, on ajoute un troisième composant dans l’équation (1).
C’est-à-dire,
G = (N, A, c)(2)
c : N × N + est une fonction donnant le coût de l’arête reliant deux nœuds. Le
domaine de la fonction c(· ) est l’ensemble des nœuds d’où le produit cartésien N × N.
Rappelons que le coût doit être non négative pour permettre l’application de
l’algorithme de Dijsktra, c’est pour cette raison que l’image de la fonction est +.
Un chemin dans un graphe est une séquence de nœuds u1, u2, …, uW tel que (ui , ui+1)
A pour 1 i W – 1. La longueur d’un chemin est alors simplement W – 1.
Également, un nœud u peut avoir un chemin vers lui-même. Si ce chemin n’a pas
d’arêtes alors la longueur de ce chemin est nulle (zéro). Par contre, si ce chemin
possède une arête (u, u) alors le chemin joignant le nœud u est appelé une boucle et sa
longueur demeure nulle (zéro). Un chemin est un chemin simple si tous les nœuds du
chemin sont distincts excepté le nœud de départ et le nœud d’arrivée.
Soit un nœud de départ u1 et un nœud d’arrivée uW. Dans un graphe orienté, un
chemin de longueur 1 avec u1 = uW est appelé un cycle. Un cycle est un cycle simple
si le chemin composant le cycle est un chemin simple. Dans un graphe non orienté,
on impose une contrainte supplémentaire dans la formation d’un cycle : il faut que les
nœuds du chemin soient tous des nœuds distincts. La raison de cette contrainte
supplémentaire est évidente si l’on considère que le chemin u1, u2, u1 dans un graphe
non orienté est en fait la même arête. C’est-à-dire (u1, u2) = (u2, u1) pour un graphe non
orienté. Donc, nous avons la nomenclature suivante :
Graphe orienté Graphe non orienté
Cycle simple Cycle
Cycle non simple où les nœuds du
chemin ne sont pas tous distincts
N/A
Un graphe orienté sans cycle est un graphe acyclique. Ces graphes ont beaucoup
d’applications dans la pratique. Notamment dans la représentation et l’analyse des
5
programmes parallèles. Nous les avons donnés un nom particulier, le DAG.
L’acronyme DAG signifie tout simplement « Direct Acyclic Graphs ».
S’il existe un chemin reliant tous les nœuds du graphe, ce dernier est appelé un graphe
connecté pour un graphe non orienté. Pour un graphe orienté, il est appelé graphe
fortement connecté. Si on enlève la direction des arêtes d’un graphe orienté et que le
graphe non orienté résultant est connecté alors on appelé le graphe orienté, un graphe
orienté faiblement connecté. Le tableau suivant résume cette propriété des graphes.
Graphe orienté Graphe non orienté
Fortement connecté Connecté
Faiblement connecté – éliminer
l’orientation des arêtes. Le graphe
résultant est connecté.
Connecté
Enfin, s’il existe au moins une arête reliant tous les pairs de nœuds dans le graphe, le
graphe est un graphe complet. On peut constater que ce type de graphes peut
représenter un grand nombre de situations. Par exemple, un ordinateur parallèle à
mémoire commune, les chemins de communication entre ordinateurs reliés par un
réseau Ethernet.
Lorsqu’un graphe est pondéré (voir équation 2), nous pouvons associer un coût aux
différents chemins contenus dans le graphe. Ainsi, le coût du chemin u1, u2, …, uW tel
que (ui , ui+1) A pour 1 i W – 1 est donné par
1
1
1
(, ).
W
ii
i
Ccuu
+
=
=(3)
Un grand nombre de problèmes consistent à trouver un chemin entre u1 et uW et en
même temps minimiser le coût associé.
Dans la théorie des graphes, nous faisons souvent l’abstraction de la façon dont les
graphes sont représentés. En informatique, dont le but consiste à trouver des
solutions aux problèmes mathématiques, la représentation des graphes est une
question primordiale. L’une des représentation la plus utilisée est la liste des nœuds
adjacents. Dans cette représentation, nous dressons une liste de nœuds contenus dans
le graphe et on les lie à d’autres listes énumérant les nœuds adjacents. La figure 3 est
une représentation figurative d’une liste de nœuds adjacents du graphe orienté de la
figure 2. Le symbole est utilisé ici pour représenter le vide ou la fin d’une liste.
L’avantage de cette représentation réside dans sa simplicité et dans l’économie de son
implantation. En fait, l’espace mémoire nécessaire pour emmagasiner la liste de
nœuds adjacents est proportionnel au nombre des nœuds et au nombre d’arêtes du
graphe (C’est-à-dire, | N | + | A | où |· | est le nombre cardinal de l’ensemble).
1 / 16 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 !