]> AND Private Git Repository - cours-maths-dis.git/blob - graphes/pbChemins.tex
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
synthèse relations
[cours-maths-dis.git] / graphes / pbChemins.tex
1
2
3 \section{Algorithme de Dijkstra}
4
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.
7
8
9 Le résultat est une arborescence.
10
11
12 \subsection{L'algorithme}
13
14 \begin{enumerate}
15 \item Numérotons les sommets du graphe $G = (V,E)$ de $1$ à $n$.
16
17 \item Supposons que l'on s'intéresse aux chemins partant du sommet 1.
18
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.
20
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 :
22
23 $$\left\{
24 \begin{array}{ll}
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\\
28 \end{array}
29 \right.$$
30
31 où $\delta (i,j)$ est le poids (la longueur) de l'arc $(i,j)$. Les $c_{i,j}$ doivent être strictement positifs.
32
33 \item On construit un autre vecteur $p$ pour mémoriser le chemin pour aller du sommet 1 au sommet voulu.
34
35 La valeur $p(i)$ donne le sommet qui précède $i$ dans le chemin.
36
37 \item On considère ensuite deux ensembles de sommets, $S$ initialisé à $\{1\}$ et $T$ initialisé à $\{2, 3, ..., n\}$.
38
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$.
40 \end{enumerate}
41
42 \subsection{Description de l'algorithme de Dijkstra}
43
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.
45
46 \begin{description}
47  \item[Initialisations :]
48 \begin{itemize}
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\}$.
52 \end{itemize}
53 \item[Itérations :] Tant que $T$ n'est pas vide faire :
54 \begin{itemize}
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
58 \begin{itemize}
59 \item $l(j) = l(i) + d(i,j)$
60 \item $p(j) = i$
61 \end{itemize}
62 \end{itemize}
63 \end{description}
64
65
66
67
68 \subsection{Exemple}
69
70 \begin{center}
71 \includegraphics[scale=0.7]{graphes/graphe1dij}
72 \end{center}
73
74
75 \begin{description}
76 \item[Initialisations]
77 \begin{itemize}
78 \item $S = \{1\}$ ;
79 \item $T = \{2, 3, 4, 5\}$ ;
80 \item $l = (0, 15, \infty, \infty, 4)$;
81 \item $p = (NIL, 1, NIL, NIL, 1)$.
82 \end{itemize}
83
84 \item[Première itération]
85 \begin{itemize}
86 \item $i = 5$ car $l(5) = min(15, \infty, \infty, 4) = 4$;
87
88 \item $S = \{1, 5\}$; $T = \{2, 3, 4\}$;
89
90 \item les successeurs de 5 dans $T$ sont 3 et 4;
91
92 \item $l(3)$ prend la nouvelle valeur $min(\infty; l(5) + d(5; 3)) = min(\infty; 4 + 7) = 11$; $p(3) = 5$;
93
94 \item $l(4)$ prend la nouvelle valeur $min(\infty ; l(5) + d(5; 4)) = 9$ ; $p(4) = 5$;
95
96 \item d'où les nouveaux vecteurs $l = (0, 15, 11, 9, 4)$ et p = $(NIL, 1, 5, 5, 1)$
97 \end{itemize}
98
99 \item[Deuxième itération]
100
101 \begin{itemize}
102 \item $i = 4$; $l(4) = 9$;
103
104 \item $S = \{1, 5, 4\}$; $T = \{2, 3\}$;
105
106 \item le seul successeur de 4 dans $T$ est 2;
107
108 \item $l(2)$ prend la nouvelle valeur $min(\infty; l(4) + d(4; 2)) = min(15; 9 + 3) = 12$; $p(2) = 4$;
109
110 \item d'où les nouveaux vecteurs $l = (0, 12, 11, 9, 4)$ et $p = (NIL, 4, 5, 5, 1)$
111 \end{itemize}
112
113 \item[Troisième itération]
114
115 \begin{itemize}
116 \item $i = 3$; $l(3) = 11$;
117
118 \item $S = \{1, 5, 4, 3\}$; $T = \{2\}$;
119
120 \item le seul successeur de 3 dans $T$ est 2;
121
122 \item $l(2)$ garde sa valeur car $min(12; l(3) + d(3; 2)) = min(12; 11 + 3) = 12$;
123
124 \item d'où les vecteurs inchangés $l = (0, 12, 11, 9, 4)$ et $p = (NIL, 4, 5, 5, 1)$
125 \end{itemize}
126
127 \item[Quatrième itération]
128
129 \begin{itemize}
130 \item $i = 2$; $l(2) = 12$;
131
132 \item $S = \{1, 5, 4, 3, 2\}$; $T=\{\}$; FIN.
133
134 \item $l = (0, 12, 11, 9, 4)$;
135
136 \item $p = (NIL, 4, 5, 5, 1)$.
137 \end{itemize}
138
139 \end{description}
140
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$.
142
143 \begin{center}
144 \includegraphics[scale=0.7]{graphes/graphe2dij}
145 \end{center}
146
147 \subsection{Exercices}
148
149 \begin{Exo}
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.
151 \end{Exo}
152
153
154 \begin{Exo}
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. 
156 \end{Exo}
157
158
159 \section{Méthode PERT}
160
161 \subsection{Présentation de la méthode}
162
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.
164
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.
166
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.
168
169
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!
171
172
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). 
174
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.
176
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).
178
179 Enfin, on supposera éliminés les arcs parallèles par l'introduction de tâches fictives.
180
181 \subsection{Algorithme du chemin critique}
182 \begin{description}
183 \item[Données :] Digraphe $G = (V, E)$, sans circuits, des activités avec leur durée $d_{ik}$.
184 \item[Résultat :]
185 \begin{itemize}
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. 
189 \end{itemize}
190 \item[Début :]
191 \begin{enumerate}
192 \item Calcul des dates de début au plus tôt (récurrence en avançant dans le projet)
193 \begin{itemize}
194 \item $d_1 := 0$
195 \item Pour $k := 2$ à $n$ faire $d_k := max\{d_j + d_{jk} | j \in P(k)\}$
196 \end{itemize}
197 \item Calcul des dates de fin au plus tard (récurrence en reculant dans le projet)
198 \begin{itemize}
199 \item $j_n := d_n$
200 \item Pour $k := n-1$ à 1 faire $j_k := min\{j_j - d_{kj} | j \in S(k)\}$
201 \end{itemize}
202 \end{enumerate}
203 \item[Fin.]
204 \end{description}
205
206 \begin{Notation}
207 $P(i) = \{k \in V | (k, i) \in E\}$ est l'ensemble des sommets prédécesseurs de $i$.
208 \end{Notation}
209
210 \begin{Notation}
211 $S(i) = \{k \in V | (i, k) \in E\}$ est l'ensemble des sommets successeurs de $i$.
212 \end{Notation}
213
214
215 \subsection{Définitions}
216
217 \begin{Def}[Sommet critique]
218 Un sommet $i$ est \emph{critique}\index{sommet!critique} si $d_i = j_i$.
219 \end{Def}
220
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$.
223 \end{Def}
224
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.
227 \end{Def}
228
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.
231 \end{Def}
232
233
234 \subsection{Exemple}
235
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.
237
238
239 \begin{center}
240 \includegraphics[scale=0.7]{graphes/pert1}
241 \end{center}
242
243 \begin{center}
244 \begin{tabular}{|c|c|c|}
245 \hline
246 Tâches & Précédences & Durée [jours] \\
247 \hline
248 A & - & 3 \\
249 \hline
250 B & - & 9 \\
251 \hline
252 C & - & 5\\
253 \hline
254 D & A & 8 \\
255 \hline
256 E & B & 4 \\
257 \hline
258 F & B & 7\\
259 \hline
260 G & B & 20\\
261 \hline
262 H & C, F & 6\\
263 \hline
264 I & D, E & 5\\
265 \hline
266 \end{tabular}
267 \end{center}
268
269
270
271 \subsection{Exercices}
272 \begin{Exo}
273 Refaites le graphe des précédences de l'exemple en utilisant l'algorithme du chemin critique.
274 \end{Exo}
275
276
277 \begin{Exo}
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.
279
280 \begin{center}
281 \begin{tabular}{|c|c|c|c|}
282 \hline
283  & Tâches & Précédences & Durée [jours]\\
284 \hline
285 A & Enlèvement des portes & - & 1/2\\
286 \hline
287 B & Ponçage et peinture des portes & A & 3 \\
288 \hline
289 C & Pose des portes & B, J & 1/2 \\
290 \hline
291 D & Arrachage des papiers peints & - & 1\\
292 \hline
293 E & Tirage des fils électriques & D & 1 \\
294 \hline
295 F & Pose des prises & E, H, I & 1/2 \\
296 \hline
297 G & Ragréage des murs & E, A & 2\\
298 \hline
299 H & Peinture du plafond & G & 2\\
300 \hline
301 I & Pose des papiers peints & G & 3\\
302 \hline
303 J & Peinture des cadres & H, I & 1\\
304 \hline
305 K & Arrachage de la moquette & H, I, J & 1/2 \\
306 \hline
307 L & Ponçage du parquet & K & 1\\
308 \hline
309 M & Imprégnation et séchage du parquet & L, F & 4\\
310 \hline
311 N & Peinture du balcon & - & 2\\
312 \hline
313 O & Changement des protections solaires & N & 1\\
314 \hline
315 \end{tabular}
316 \end{center}
317
318 \begin{enumerate}
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. 
321 \end{enumerate}
322 \end{Exo}
323 \gsaut
324 \centerline{\x{Fin du Chapitre}}