3 \section{Algorithme de Dijkstra}
5 \subsection{Présentation}
6 Edgser Wybe Dijkstra (1930-2002) a proposé en 1959 un algorithme qui permet de calculer le plus court chemin entre un sommet particulier et tous les autres.
9 Le résultat est une arborescence.
12 \subsection{L'algorithme}
15 \item Numérotons les sommets du graphe $G = (V,E)$ de $1$ à $n$.
17 \item Supposons que l'on s'intéresse aux chemins partant du sommet 1.
19 \item On construit un vecteur $l = (l(1); l(2); ...; l(n))$ ayant $n$ composantes tel que $l(j)$ soit égal à la longueur du plus court chemin allant de 1 au sommet j.
21 On initialise ce vecteur à $c_{1,j}$, c'est-à-dire à la première ligne de la matrice des coûts du graphe, définie comme indiqué ci-dessous :
25 0 & \textrm{ si } i=j \\
26 +\infty & \textrm{ si } i \neq j \textrm{ et } (i,j) \notin E\\
27 \delta (i,j) & \textrm{ si } i \neq j \textrm{ et } (i,j) \in E\\
31 où $\delta (i,j)$ est le poids (la longueur) de l'arc $(i,j)$. Les $c_{i,j}$ doivent être strictement positifs.
33 \item On construit un autre vecteur $p$ pour mémoriser le chemin pour aller du sommet 1 au sommet voulu.
35 La valeur $p(i)$ donne le sommet qui précède $i$ dans le chemin.
37 \item On considère ensuite deux ensembles de sommets, $S$ initialisé à $\{1\}$ et $T$ initialisé à $\{2, 3, ..., n\}$.
39 À chaque pas de l'algorithme, on ajoute à $S$ un sommet jusqu'à ce que $S = V$ de telle sorte que le vecteur $l$ donne à chaque étape le coût minimal des chemins de 1 aux sommets de $S$.
42 \subsection{Description de l'algorithme de Dijkstra}
44 On suppose ici que le sommet de départ (qui sera la racine de l'arborescence) est le sommet 1. Notons qu'on peut toujours renuméroter les sommets pour que ce soit le cas.
47 \item[Initialisations :]
49 \item $l(j) = c1,j et p(j) = NIL, pour 1\leqslant j \leqslant n$
50 \item Pour $2 \leqslant j \leqslant n$ faire : Si $c_{1,j} < +\infty$ alors $p(j) = 1$.
51 \item $S = \{1\}$ ; $T = \{2, 3, ..., n\}$.
53 \item[Itérations :] Tant que $T$ n'est pas vide faire :
55 \item Choisir $i$ dans $T$ tel que $l(i)$ est minimum
56 \item Retirer $i$ de $T$ et l'ajouter à $S$
57 \item Pour chaque successeur $j$ de $i$, avec $j$ dans $T$, faire : Si $l(j) > l(i) + d(i,j)$ alors
59 \item $l(j) = l(i) + d(i,j)$
71 \includegraphics[scale=0.7]{graphes/graphe1dij}
76 \item[Initialisations]
79 \item $T = \{2, 3, 4, 5\}$ ;
80 \item $l = (0, 15, \infty, \infty, 4)$;
81 \item $p = (NIL, 1, NIL, NIL, 1)$.
84 \item[Première itération]
86 \item $i = 5$ car $l(5) = min(15, \infty, \infty, 4) = 4$;
88 \item $S = \{1, 5\}$; $T = \{2, 3, 4\}$;
90 \item les successeurs de 5 dans $T$ sont 3 et 4;
92 \item $l(3)$ prend la nouvelle valeur $min(\infty; l(5) + d(5; 3)) = min(\infty; 4 + 7) = 11$; $p(3) = 5$;
94 \item $l(4)$ prend la nouvelle valeur $min(\infty ; l(5) + d(5; 4)) = 9$ ; $p(4) = 5$;
96 \item d'où les nouveaux vecteurs $l = (0, 15, 11, 9, 4)$ et p = $(NIL, 1, 5, 5, 1)$
99 \item[Deuxième itération]
102 \item $i = 4$; $l(4) = 9$;
104 \item $S = \{1, 5, 4\}$; $T = \{2, 3\}$;
106 \item le seul successeur de 4 dans $T$ est 2;
108 \item $l(2)$ prend la nouvelle valeur $min(\infty; l(4) + d(4; 2)) = min(15; 9 + 3) = 12$; $p(2) = 4$;
110 \item d'où les nouveaux vecteurs $l = (0, 12, 11, 9, 4)$ et $p = (NIL, 4, 5, 5, 1)$
113 \item[Troisième itération]
116 \item $i = 3$; $l(3) = 11$;
118 \item $S = \{1, 5, 4, 3\}$; $T = \{2\}$;
120 \item le seul successeur de 3 dans $T$ est 2;
122 \item $l(2)$ garde sa valeur car $min(12; l(3) + d(3; 2)) = min(12; 11 + 3) = 12$;
124 \item d'où les vecteurs inchangés $l = (0, 12, 11, 9, 4)$ et $p = (NIL, 4, 5, 5, 1)$
127 \item[Quatrième itération]
130 \item $i = 2$; $l(2) = 12$;
132 \item $S = \{1, 5, 4, 3, 2\}$; $T=\{\}$; FIN.
134 \item $l = (0, 12, 11, 9, 4)$;
136 \item $p = (NIL, 4, 5, 5, 1)$.
141 Le chemin minimal de 1 à 4 par exemple est de coût 9. C'est le chemin 1-5-4, car $p(4) = 5$ et $p(5) = 1$.
144 \includegraphics[scale=0.7]{graphes/graphe2dij}
147 \subsection{Exercices}
150 Appliquez l'algorithme de Dijkstra au graphe de l'exemple ci-dessus pour trouver tous les plus courts chemins en partant des sommets 2, 3, 4 et 5.
155 Expliquez pourquoi des arcs avec des poids négatifs pourraient poser problème dans la recherche d'un plus court chemin dans un graphe.
159 \section{Méthode PERT}
161 \subsection{Présentation de la méthode}
163 Le problème du plus long chemin dans les digraphes sans circuits trouve une application dans l'ordonnancement et la planification des tâches composant un projet complexe, par exemple la construction d'une maison.
165 On fait correspondre à chaque tâche un arc d'un digraphe, sa durée d'exécution étant égale au poids de cet arc.
167 Le digraphe reflète les précédences requises dans l'exécution du projet. Ainsi, la tâche correspondant à l'arc $(i, j)$ ne peut commencer que si toutes les tâches correspondant à des arcs $(k, i)$ ont été complétées. Le digraphe peut contenir des tâches fictives de durée nulle afin de forcer certaines précédences.
170 Les sommets du digraphe représentent des événements, début (fin) des activités correspondant aux arcs dont ils sont l'extrémité initiale (finale). Le fait que le digraphe est sans circuit est garant de la faisabilité du projet. En effet, l'existence d'un circuit impliquerait une contradiction dans les précédences : une tâche devant en même temps précéder et succéder une autre!
173 On supposera dorénavant que les sommets ont déjà été numérotés de 1 à $n$ de manière compatible avec leurs rangs, c'est-à-dire que $r(j)>r(i)$ implique $j>i$ (voir l'algorithme de calcul du rang).
175 En plus, si le digraphe possède plusieurs sommets sans prédécesseurs, on supposera avoir introduit un sommet 1 relié par un arc de durée nulle à chacun de ces sommets. Ce sommet indique le début du projet.
177 De même, si le digraphe possède plusieurs sommets sans successeurs, ceux-ci seront reliés par un arc de durée nulle à un dernier sommet $n$ (fin du projet).
179 Enfin, on supposera éliminés les arcs parallèles par l'introduction de tâches fictives.
181 \subsection{Algorithme du chemin critique}
183 \item[Données :] Digraphe $G = (V, E)$, sans circuits, des activités avec leur durée $d_{ik}$.
186 \item $d_i$ début au plus tôt des activités correspondant aux arcs $(i, k)$ partant de $i$,
187 \item $j_i$ fin au plus tard des activités correspondant aux arcs $(k, i)$ arrivant à $i$,
188 \item durée du chemin critique.
192 \item Calcul des dates de début au plus tôt (récurrence en avançant dans le projet)
195 \item Pour $k := 2$ à $n$ faire $d_k := max\{d_j + d_{jk} | j \in P(k)\}$
197 \item Calcul des dates de fin au plus tard (récurrence en reculant dans le projet)
200 \item Pour $k := n-1$ à 1 faire $j_k := min\{j_j - d_{kj} | j \in S(k)\}$
207 $P(i) = \{k \in V | (k, i) \in E\}$ est l'ensemble des sommets prédécesseurs de $i$.
211 $S(i) = \{k \in V | (i, k) \in E\}$ est l'ensemble des sommets successeurs de $i$.
215 \subsection{Définitions}
217 \begin{Def}[Sommet critique]
218 Un sommet $i$ est \emph{critique}\index{sommet!critique} si $d_i = j_i$.
221 \begin{Def}[Arc critique]
222 Un arc $(i, j)$ est \emph{critique}\index{arc!critique} si ses extrémités sont des sommets critiques et $d_{ij} = d_j - d_i$.
225 \begin{Def}[Chemin critique]
226 Un chemin \emph{critique}\index{chemin!critique} est un chemin de 1 à $n$ n'utilisant que des arcs critiques, c'est-à-dire des activités telles que tout retard dans leur exécution provoquerait un retard de la fin du projet.
229 \begin{Def}[Durée du chemin critique]
230 La \emph{durée} du chemin critique est donnée par $d_n$ (ou par $j_n$, les deux valeurs étant toujours égales). Elle correspond à la durée minimale du projet étant données les durées des tâches le composant et les précédences respectives.
236 Ci-dessous le graphe des précédences obtenu avec l'algorithme du chemin critique. Les sommets et les arcs critiques sont en rouge.
240 \includegraphics[scale=0.7]{graphes/pert1}
244 \begin{tabular}{|c|c|c|}
246 Tâches & Précédences & Durée [jours] \\
271 \subsection{Exercices}
273 Refaites le graphe des précédences de l'exemple en utilisant l'algorithme du chemin critique.
278 La rénovation du séjour d'un appartement se décompose en plusieurs tâches décrites dans le tableau ci-dessous. Ce dernier donne également les précédences à respecter lors de la planification des travaux ainsi qu'une estimation de la durée de chacune des tâches.
281 \begin{tabular}{|c|c|c|c|}
283 & Tâches & Précédences & Durée [jours]\\
285 A & Enlèvement des portes & - & 1/2\\
287 B & Ponçage et peinture des portes & A & 3 \\
289 C & Pose des portes & B, J & 1/2 \\
291 D & Arrachage des papiers peints & - & 1\\
293 E & Tirage des fils électriques & D & 1 \\
295 F & Pose des prises & E, H, I & 1/2 \\
297 G & Ragréage des murs & E, A & 2\\
299 H & Peinture du plafond & G & 2\\
301 I & Pose des papiers peints & G & 3\\
303 J & Peinture des cadres & H, I & 1\\
305 K & Arrachage de la moquette & H, I, J & 1/2 \\
307 L & Ponçage du parquet & K & 1\\
309 M & Imprégnation et séchage du parquet & L, F & 4\\
311 N & Peinture du balcon & - & 2\\
313 O & Changement des protections solaires & N & 1\\
319 \item Représentez le graphe des précédences de ces travaux de rénovation.
320 \item Déterminez une durée totale minimale de rénovation en exhibant un chemin critique dans le graphe précédent.
324 \centerline{\x{Fin du Chapitre}}