Cours GRF
This commit is contained in:
parent
98e42d4fc1
commit
ee965d6137
6 changed files with 748 additions and 2 deletions
319
grf/cours.tex
319
grf/cours.tex
|
|
@ -432,3 +432,322 @@ courts en appliquant deux changements~:
|
|||
\item \textbf{À l'itération $k$~:} on remplace l'opération $\max$ par
|
||||
$\min$.
|
||||
\end{itemize}
|
||||
|
||||
%Deuxième cours
|
||||
\section{Problème d'orgonnancement de projets}
|
||||
|
||||
Le but est de trouver l'ordonnancement au plus tôt de toutes les tâches.
|
||||
|
||||
On représente généralement ce genre de problème sous la forme de diagrammes de
|
||||
Gantt calés à gauche.
|
||||
|
||||
Le deuxième objectif est de déterminer le chemin critique~: tout retard sur une
|
||||
tâche critique se représente sur la durée totale du projet.
|
||||
|
||||
POiur les tâches non-critiques, on peut calculer la marge totale et la marge
|
||||
libre.\\
|
||||
|
||||
Il existe deux méthodes principales pour calculer les crontraites de type
|
||||
\emph{potentiel}~: la méthode tâche et la méthode PERT (qui ne sera pas traitée
|
||||
dans ce cours).
|
||||
|
||||
Les seules contraintes sont du type~: \og la tâche B ne peut démarrer que 3
|
||||
jours après la tâche A\fg.
|
||||
|
||||
\paragraph{Remarque} les contraintes les plus dures ne sont pas prises en
|
||||
compte~: on parle de type cumulatif.
|
||||
|
||||
Lorsque les ressources sont limités, les interactions sont très fortes entre
|
||||
les tâches.
|
||||
|
||||
\subsection{Méthode portentiels-tâches}
|
||||
|
||||
\paragraph{Exemple} On a un problème à 7 tâches ($a$, $b$, $c$, $d$, $e$, $f$
|
||||
et $g$)~; les contraintes sont de type portentiel seulement.
|
||||
|
||||
Soit le tableau des contraintes suivantes~:
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\begin{tabular}{c|c|c}
|
||||
\textbf{Tâches} & \textbf{Durées} & \textbf{Contraintes}\\
|
||||
\hline
|
||||
$a$ & 6 & \\
|
||||
$b$ & 3 & \\
|
||||
$c$ & 6 & \\
|
||||
$d$ & 2 & $b$ achevée\\
|
||||
$e$ & 4 & $b$ achevée\\
|
||||
$f$ & 3 & $a$ et $d$ achevées\\
|
||||
$g$ & 1 & $c$, $e$ et $f$ achevées\\
|
||||
\end{tabular}
|
||||
\end{figure}
|
||||
|
||||
\subsubsection{Ordonancement au plus tôt -- Algorithme de Bellman}
|
||||
|
||||
On peut représenter le tableau des contraintes à l'aide d'un graphe, le graphe
|
||||
\emph{potentiels-tâches}, dans lequel~:
|
||||
|
||||
\begin{itemize}
|
||||
\item un sommet est associé à chaque tâche~;
|
||||
\item un sommet $\alpha$ que l'on associe au début du projet~;
|
||||
\item un sommet $\omega$ qui sera la fin du projet.
|
||||
\end{itemize}
|
||||
|
||||
On aura un arc $i,j$ si la tâche $j$ ne peut démarrer qu'après la tâche $i$. Il
|
||||
s'agit d'une contrainte d'antécédence entre tâches.
|
||||
|
||||
La valuation de l'arc $i,j$~: le plus souvent, c'est la durée de la tâche $i$.
|
||||
La tâche $j$ ne peut démarrer que lorsque la tâche $i$ est achevée~: entre le
|
||||
début de la tâche $j$ et le début de la tâche $i$ qui la précéde s'écoule le
|
||||
temps d'exécution de la tâche $i$.
|
||||
|
||||
\paragraph{Remarque} On peut rencontrer le contraire~: \og $j$ ne peut démarrer
|
||||
que 2 jours après le début de $i$\fg. Dans ce cas, l'arc $i,j$ sera valué par
|
||||
2.
|
||||
|
||||
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=3cm,
|
||||
thick,main node/.style={circle,fill=blue!20,draw,font=\sffamily\Large\bfseries}]
|
||||
\node[main node] (2) {$a$};
|
||||
\node[main node] (3) [below of=2] {$b$};
|
||||
\node[main node] (1) [left of=3] {$\alpha$};
|
||||
\node[main node] (4) [below of=3] {$c$};
|
||||
\node[main node] (5) [right of=3] {$d$};
|
||||
\node[main node] (6) [below of=5] {$e$};
|
||||
\node[main node] (7) [right of=5] {$f$};
|
||||
\node[main node] (8) [below of=7] {$g$};
|
||||
\node[main node] (9) [right of=7] {$\omega$};
|
||||
|
||||
\path[every node/.style={font=\sffamily\small}]
|
||||
(1) edge [right] node[right] {0} (2)
|
||||
edge [right] node[left] {0} (3)
|
||||
edge [right] node[left] {0} (4)
|
||||
(2) edge [right] node[right] {6} (7)
|
||||
(3) edge [right] node[right] {3} (5)
|
||||
edge [right] node[left] {3} (6)
|
||||
(4) edge [bend right] node[right] {6} (8)
|
||||
(5) edge [right] node[right] {2} (7)
|
||||
(6) edge [right] node[right] {4} (8)
|
||||
(7) edge [right] node[right] {3} (8)
|
||||
(8) edge [right] node[right] {1} (9)
|
||||
;
|
||||
\end{tikzpicture}
|
||||
|
||||
La durée minimale correspond au chemin le plug long entre $\alpha$ et
|
||||
$\omega$.
|
||||
|
||||
\subsubsection{Algorithme de Bellman}
|
||||
|
||||
On commence par dresser le tableau suivant~:
|
||||
|
||||
\hspace{-1cm}
|
||||
\begin{tabular}{|c|c|c|c|c|c|c|c|c|c|}
|
||||
\hline
|
||||
& {\color{mauve} 0} & {\color{dkgreen} 0} & {\color{dkgreen} 0} &
|
||||
{\color{dkgreen} 0} & {\color{red} 3} & {\color{red} 3} & {\color{red} 6} &
|
||||
{\color{red} 9} & {\color{red} 10} \\
|
||||
\hline
|
||||
Tâche & $\alpha$ & $a$ & $b$ & $c$ & $d$ & $e$ & $f$ & $g$ & $\omega$\\
|
||||
\hline
|
||||
Prédécesseurs & & {\color{mauve} 0} $\alpha$~: 0 & {\color{mauve} 0}
|
||||
$\alpha$~: 0 & {\color{mauve} 0} $\alpha$~: 0 & {\color{blue} 0} $b$~: 3 &
|
||||
{\color{blue} 0} $b$~: 3 & $\psi=$ {\color{blue} 0} $a$~: 6 & {\color{blue}
|
||||
0} $c$~: 6 & {\color{blue} 9} $g$~: 1\\
|
||||
&&&&&&& $\chi=$ {\color{blue} 3} $d$~: 2 & {\color{blue} 3} $e$~: 4&\\
|
||||
&&&&&&&& {\color{blue} 6} $f$~: 3&\\
|
||||
\hline
|
||||
\end{tabular}
|
||||
|
||||
\paragraph{Initialisation} Le projet démarre à la date 0. Il s'agit de la date
|
||||
de début au plus tôt de $\alpha$~; ici {\color{mauve} 0}.
|
||||
|
||||
\paragraph{Deuxième phase} {\color{mauve} Mmouvement de haut en bas.}\\
|
||||
Dès que l'on connaît une date de début au plus tôt (1\iere ligne du tableau),
|
||||
on la répercute dans la deuxième ligne du tableau partout où la tâche concernée
|
||||
apparaît.
|
||||
|
||||
\subparagraph{Ensuite} {\color{dkgreen} mouvement de bas en haut.}\\
|
||||
Dès que l'on connaît les dates de début au plus tôt de tous les prédécesseurs
|
||||
d'une tâche, on dit que la colonne est complète, et on calcule la date de
|
||||
dévbut au plus tôt de la tâche en tête de colonne (première ligne) par la
|
||||
formule de Bellman~:
|
||||
|
||||
$$t_j=\max[t_i+v_{ij}]\qquad i\in(\Gamma^{-1}(j))$$
|
||||
|
||||
Par exemple, dans la colonne $f$, $\psi$ et $\chi$ sont $t_i$ et 6 et 2 sont $v_{ij}$
|
||||
|
||||
\begin{itemize}
|
||||
\item $t_j$~: la date de début au plus tôt de $j$~;
|
||||
\item $v_{ij}$~: valuation de l'arc $(i,j)$~;
|
||||
\item $\Gamma^{-1}$~: prédécesseur de $j$.
|
||||
\end{itemize}
|
||||
|
||||
{\color{blue} Ensuite}
|
||||
|
||||
{\color{red} Ensuite}
|
||||
|
||||
\vspace{1.5em}
|
||||
|
||||
L'ordonnancement au plus tôt est donc la durée minimale du projet, soit la date
|
||||
au plus tôt de $\omega$ = 10~jours.
|
||||
|
||||
\begin{gantt}{8}{10}
|
||||
\begin{ganttitle}
|
||||
\numtitle{1}{1}{10}{1}
|
||||
\end{ganttitle}
|
||||
\ganttbar{$a$}{0}{6}
|
||||
\ganttbar{$b$}{0}{3}
|
||||
\ganttbar{$c$}{0}{6}
|
||||
\ganttbar{$d$}{3}{2}
|
||||
\ganttbar{$e$}{3}{4}
|
||||
\ganttbar{$f$}{6}{3}
|
||||
\ganttbar{$g$}{9}{1}
|
||||
\ganttcon{6}{1}{6}{6}
|
||||
\ganttcon{9}{6}{9}{7}
|
||||
\end{gantt}
|
||||
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.5cm,
|
||||
thick,main node/.style={circle,fill=blue!20,draw,font=\sffamily\Large\bfseries}]
|
||||
\node[main node] (1) {$\alpha$};
|
||||
\node[main node] (2) [right of=1] {$a$};
|
||||
\node[main node] (3) [right of=2] {$f$};
|
||||
\node[main node] (4) [right of=3] {$g$};
|
||||
\node[main node] (5) [right of=4] {$\omega$};
|
||||
|
||||
\path[every node/.style={font=\sffamily\small}]
|
||||
(1) edge [right] node[right] {0} (2)
|
||||
(2) edge [right] node[right] {6} (3)
|
||||
(3) edge [right] node[right] {3} (4)
|
||||
(4) edge [right] node[right] {1} (5)
|
||||
;
|
||||
\end{tikzpicture}
|
||||
\caption{Chemin critique}
|
||||
\end{figure}
|
||||
|
||||
\vspace{1.5em}
|
||||
|
||||
On s'intéresse à l'ordonancement au plud tard, pour calculer les marges de
|
||||
toutes les tâches non critiques.
|
||||
|
||||
\subparagraph{Hypothèse} La durée minimale du projet est respectée.
|
||||
|
||||
Pour les tâches croitiques, la date de début au plus tard est égale à la date
|
||||
de début au plus tôt.
|
||||
|
||||
Quelles sont les dates de début au plus tard des tâches non critiques~?
|
||||
|
||||
\vspace{1em}
|
||||
|
||||
\hspace{-1.5cm}
|
||||
\begin{tabular}{|c|c|c|c|c|c|c|c|c|c|}
|
||||
\hline
|
||||
& 0 & 0 & 1 & 3 & 4 & 5 & 6 & 9 & 10\\
|
||||
\hline
|
||||
Tâche & $\alpha$ & $a$ & $b$ & $c$ & $d$ & $e$ & $f$ & $g$ & $\omega$\\
|
||||
\hline
|
||||
Successeurs & {\color{blue} 0} $a$~: 0 & {\color{blue} 6} $f$~: 6 &
|
||||
{\color{blue} 4} $d$~: 3 & {\color{blue} 9} $g$~: 6 & {\color{blue} 6} $f$~:
|
||||
2 & {\color{blue} 9} $g$~: 4 & {\color{blue} 9} $g$~: 3 & {\color{blue} 10}
|
||||
$\omega$~: 1&\\
|
||||
& {\color{blue} 1} $b$~: 0 & & {\color{blue} 5} $e$~: 3 &&&&&&\\
|
||||
& {\color{blue} 3} $c$~: 0 &&&&&&&&\\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\vspace{1em}
|
||||
|
||||
Pour les tâches critiques~:
|
||||
$$t_a^*=t_a=0$$
|
||||
$$t_f^*=t_f=6$$
|
||||
$$t_g^*=t_g=9$$
|
||||
|
||||
Pour les tâches non-critiques~: la \emph{marge totale} = $M_i=t_i^*-t_i$, soit~:
|
||||
$$M_b=1$$
|
||||
$$M_c=3$$
|
||||
$$M_d=1$$
|
||||
$$M_e=2$$
|
||||
|
||||
La \emph{marge libre}, $m_i$, est le délai dont on peut retarder la tâche $i$
|
||||
sans conséquence sur ses successeurs.
|
||||
$$m_i=\min(t_j-t_i-v_{ij})\qquad j\in\Gamma(i)$$
|
||||
|
||||
$$m_b=\min_{d,e}\lbrace t_d-t_b-v_{bd};t_e-t_b-v_{be}\rbrace$$
|
||||
$$=\min_{d,e}\lbrace 3-0-3;3-0-3\rbrace=0$$
|
||||
|
||||
\subsubsection{Deuxième application~: algorithme de Ford}
|
||||
|
||||
Cet algorithme permet de trouver le chemin le plus long, ou le chemin le plus
|
||||
court entre un sommet particulier (la racine) et tous les autres sommets du
|
||||
graphe.
|
||||
|
||||
\paragraph{Initialisation} On numérote les sommets, le sommet racine prennant
|
||||
le numéro 1. On essaye de respecter autant que possible la numérotation
|
||||
topologique des sommets.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.5cm,
|
||||
thick,main node/.style={circle,fill=blue!20,draw,font=\sffamily\Large\bfseries}]
|
||||
\node[main node] (1) {$i$};
|
||||
\node[main node] (2) [right of=1] {$j$};
|
||||
|
||||
\path[every node/.style={font=\sffamily\small}]
|
||||
(1) edge [right] node[right] {} (2)
|
||||
;
|
||||
\end{tikzpicture}
|
||||
\caption{Représentation topologique~; ici $i<j$}
|
||||
\end{figure}
|
||||
|
||||
|
||||
Voir graphe page 106.
|
||||
|
||||
On cherche le chemin le plus court allant du sommet 1 vers tous les autres
|
||||
sommets.
|
||||
|
||||
\paragraph{Marquage des sommets} On affecte au sommet 1 la valeur $\lambda_1=0$
|
||||
et à tous les autres sommets la valeur $\lambda_i=+\infty$.
|
||||
|
||||
\begin{itemize}
|
||||
\item $\lambda_i$ évolue en cours d'algorithme~;
|
||||
\item le dernier $\lambda_i$ affecté à $i$ donne la longueur du chemin le
|
||||
plus court allant du sommet 1 au sommet $i$.
|
||||
\end{itemize}
|
||||
|
||||
\vspace{1em}
|
||||
|
||||
On examine à tour de rôle tous les arcs partant du sommet $i$, en commençant
|
||||
par $i=1$. Pour ne pas en oublier, on fait cet examen dans l'ordre croissant de
|
||||
l'extrémité $j$.
|
||||
\vspace{1em}
|
||||
Au moment de l'examen de l'arc $(i,j)$~: $v(i,j)$ est la valuation de l'arc
|
||||
$(i,j)$.
|
||||
|
||||
Si $v(i,j)<\lambda_i-\lambda_j$, alors on remplace $\lambda_j$ par
|
||||
$\lambda_i+v(i,j)$.
|
||||
|
||||
Si à un moment donné, on a $i>j$ et un changement de valeur pour $\lambda_j$,
|
||||
il faut recommencer une partie des opérations, en repartant du sommet $i=j$. On
|
||||
appel cela un retour en arrière.
|
||||
|
||||
|
||||
\subparagraph{Par exemple} examen de l'arc $(11,10)$.
|
||||
|
||||
Cet examen risque d'entraîner le changement de valeur de $\lambda_{10}$. Alors,
|
||||
il faut reprendre l'examen de l'arc $(10,13)$ avec la nouvelle valeur
|
||||
$\lambda_{10}$.
|
||||
|
||||
\subparagraph{Go~!} examen de l'arc $(1,2)$.
|
||||
$2 < \infty - 0$~? Oui $\Rightarrow$ on remplace $\lambda_2$ par
|
||||
$\lambda_1+v(1,2)=0+2=2$.
|
||||
|
||||
\subparagraph{Remarque} Dans cet exemple, pas de retour en arrière, bien qu'un arc
|
||||
ait ses extrêmités avec une numérotation non topologique. L'examen de l'arc
|
||||
$(11,10)$ n'a pas entraîné la modification de $\lambda_{10}$. On ne doit pas
|
||||
reaire l'examen de l'arc $(10,13)$.
|
||||
|
||||
\paragraph{Phase 2} identification du chemin solution.
|
||||
|
||||
On par de l'extrêmité terminale soit $i$. Le prédécesseur de $i$ est le sommet
|
||||
$i$ tel que~:
|
||||
$$\lambda_i-\lambda_{i'}=v(i',i)$$
|
||||
|
|
|
|||
Reference in a new issue