\chapter{Connectivité dans un graphe} \section{Algorithme de Roy-Warshall} \paragraph{Exercice page 101} \tikzstyle{vertex}=[circle,fill=black!25,minimum size=20pt,inner sep=0pt] \tikzstyle{edge} = [draw,thick,-] \tikzstyle{weight} = [font=\small] \tikzstyle{selected edge} = [draw,line width=5pt,-,red!50] \tikzstyle{ignored edge} = [draw,line width=5pt,-,black!20] \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] (1) {A}; \node[main node] (2) [right of=1] {B}; \node[main node] (3) [right of=2] {C}; \node[main node] (4) [below of=2] {D}; \node[main node] (5) [below right of=3] {E}; \path[every node/.style={font=\sffamily\small}] (1) edge node[right] {$u_1$} (2) edge node[left] {$u_2$} (4) (2) edge node[left] {$u_3$} (3) (3) edge node[left] {$u_4$} (5) (4) edge node [left] {$u_5$} (3) edge node[left] {$u_6$} (5) ; \end{tikzpicture} Soit $M$ la \emph{matrice binaire} associée à un graphe. \[ M= \begin{bmatrix} 0 & 1 & 0 & 1 & 0\\ 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 0 & 1\\ 0 & 0 & 1 & 0 & 1\\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} \] \subsubsection{Représenter le graphe associé.} $M$ est la matrice $n\times n$ avec $n$ le nombre de sommets (ou n\oe uds) du graphe.\\ Ici, on a 5 sommets~: $A$, $B$, $C$, $D$ et $E$. $$m_{i,j}=1\Longleftrightarrow\exists\text{ un arc }(i,j)$$ \subsubsection{Donner la matrice d'incidence de ce graphe.} Soit la matrice $A$~: $n\times m$, avec $n$ le nombre de \emph{sommets} du graphe et $m$ le nombre \emph{d'arcs} du graphe. \[ M=\bordermatrix{~ & u_1 & u_2 & u_3 & u_4 & u_5 & u_6 \cr A & +1 & +1 & & & & \cr B & -1 & & +1 & & & \cr C & & & & +1 & -1 & \cr D & & -1 & & & +1 & +1 \cr E & & & & -1 & & -1 \cr} \] $a_{i,j}=+1$ si $i$ est à l'origine de l'arc $j$, $a_{i,j}=-1$ si $i$ est à l'extrêmité terminale de $j$, $a_{i,j}=0$ sinon. \subsubsection{Calculer $M^2$, $M^3$, $M^4$, \ldots et interpréter les termes non nuls de ces matrices.} \[ M^2= \begin{bmatrix} 0 & 0 & 2 & 0 & 1\\ 0 & 0 & 0 & 0 & 1\\ 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 1\\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} \] $a_{3,1}=2$, cela signifie qu'il existe deux chemins de longueur 2 reliant $A$ à $C$~: $ABC$ et $ADC$. $a_{5,1}=2$, cela signifie qu'il existe un chemin de longueur 2 reliant $A$ à $E$~: $ADE$. \[ M^3= \begin{bmatrix} 0 & 0 & 0 & 0 & 2\\ 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} \qquad M^4= \begin{bmatrix} 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} = M^n\quad\forall n\geq 4 \] Grâce à $M^3$, on voit qu'il n'existe que deux chemins de longueur trois reliant $A$ à $E$~: $ABCE$ et $ADCE$. Il n'existe pas de chemin plus grand que 3, car on a une matrice nulle pour $M^4$. \subsubsection{Calculer les puissances booléennes de $M$, soit $M^{\left[2\right]}$, $M^{\left[3\right]}$, $M^{\left[4\right]}$, \ldots} \[ M^{\left[2\right]}= \begin{bmatrix} 0 & 0 & 1 & 0 & 1\\ 0 & 0 & 0 & 0 & 1\\ 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 1\\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} \qquad M^3= \begin{bmatrix} 0 & 0 & 0 & 0 & 1\\ 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 \end{bmatrix} \] Dans ce cas, on dit qu'il existe au moins un chemin de longueur deux reliant les points où l'intersection dans la matrice n'est pas nulle.\\ On a perdu l'information du nombre de chemin, on sait seulement si un chemin existe ou non. \subsubsection{Calculer la fermeture réflexo-transitive du graphe.} $$B=I\dot{+}M\dot{+}M^{\left[2\right]}\dot{+}\ldots$$ \[ I= \begin{bmatrix} 1 & 0 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 0 & 1 \end{bmatrix}\text{ la matrice identitée} \] \paragraph{En clair~:} $B$ correspond en fait à un OU logique appliqué à l'ensemble des matrices. \[ B= \begin{bmatrix} 1 & 1 & 1 & 1 & 1\\ 0 & 1 & 1 & 0 & 1\\ 0 & 0 & 1 & 0 & 1\\ 0 & 0 & 1 & 1 & 1\\ 0 & 0 & 0 & 0 & 1 \end{bmatrix} \] Pour chacun des éléments non nuls de la matrice $B$, on peut dire qu'il existe au moin un chemin (de longueur indéterminée). La matrice $B$ permet donc de savoir si deux sommets sont interconnectés dans le graphe. \subsubsection{Algorithme de Roy-Warshall.} L'algorithme de Roy-Warshall permet de calculer $B$ sans calculer les produits matriciels. \subsection{Étapes} \begin{itemize} \item On calcul $B=I\dot{+}M$~; \item On calcul l'image de $B$ par l'opérateur $\theta_1$, soit $B=\theta_1(B)$~; \item On calcul l'image de $B$ par l'opérateur $\theta_2$~; \item Ainsi de suite, jusqu'à $\theta_n$. \end{itemize} \subsection{Opérateur $\theta_i$} \begin{itemize} \item On considère toutes les lignes de $B$ qui ont un 1 en colonne $i$~; \item On ajoute (addition booléenne $\dot{+}$) à chacune de ces lignes tous les 1 de la ligne $i$~; \end{itemize} \[ B=\theta_1(B)= \begin{bmatrix} 1 & \textbf{1} & 0 & 1 & 0\\ 0 & \textbf{1} & \textbf{1} & 0 & 0\\ 0 & \textbf{0} & 1 & 0 & 1\\ 0 & \textbf{0} & 1 & 1 & 1\\ 0 & \textbf{0} & 0 & 0 & 1 \end{bmatrix} \xrightarrow{\theta_2} \begin{bmatrix} 1 & 1 & \textbf{1} & 1 & 0\\ 0 & 1 & \textbf{1} & 0 & 0\\ 0 & 0 & \textbf{1} & \textbf{0} & \textbf{1}\\ 0 & 0 & \textbf{1} & 1 & 1\\ 0 & 0 & \textbf{0} & 0 & 1 \end{bmatrix} \xrightarrow{\theta_3} \begin{bmatrix} 1 & 1 & 1 & 1 & \textbf{1}\\ 0 & 1 & 1 & 0 & \textbf{1}\\ 0 & 0 & 1 & 0 & \textbf{1}\\ 0 & 0 & 1 & 1 & \textbf{1}\\ 0 & 0 & 0 & 0 & \textbf{1} \end{bmatrix} \] \paragraph{Exercice 2 page 101} \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] (1) {A}; \node[main node] (2) [right of=1] {B}; \node[main node] (3) [below right of=2] {C}; \node[main node] (4) [below left of=3] {D}; \node[main node] (6) [below left of=1] {F}; \node[main node] (5) [below right of=6] {E}; \path[every node/.style={font=\sffamily\small}] (1) edge [bend right] node[right] {} (2) edge [bend right] node[left] {} (6) (2) edge [bend right] node[left] {} (1) edge [loop] node {} (2) edge [bend left] node[left] {} (3) edge [bend left] node[left] {} (5) (3) edge [bend right] node[left] {} (4) (4) edge [right] node [left] {} (2) edge [bend right] node[left] {} (3) edge [bend left] node[left] {} (5) (5) edge [loop] node [left] {} (5) edge [bend left] node[left] {} (6) edge [bend left] node[left] {} (2) (6) edge node [left] {} (3) edge [bend right] node[left] {} (1) ; \end{tikzpicture} \subsubsection{Calculer les demi-degrés extérieurs et intérieurs des sommets du graphe} $\Gamma^+(A),\Gamma^+(B),\ldots$~; $\Gamma^+(A)={B,F}$, $\Gamma^+(B)={A,B,C,E}$, \ldots $\Gamma^-(A),\Gamma^-(B),\ldots$~; $\Gamma^-(A)={B,F}$, $\Gamma^+(B)={A,B,C,E}$, \ldots\\ $\Gamma^+$~: la liste des descendants immédiats de $i$ et $\Gamma^+$~: la liste des prédécesseurs immédiats de $i$.\\ \textbf{Le demi-degré intérieur} du sommet $i$ $\leftarrow d'(i)$~: le nombre de prédécesseurs immédiats de $i$, à l'exception de $i$ lui-même. \textbf{Le demi-degré extérieur} du sommet $i$ $\leftarrow d''(i)$~: le nombre de successeurs immédiats de $i$, à ;'exception de $i$ lui-même.\\ $\Gamma^+(A)={B,F}$~: $d''(A)=2$ $\Gamma^+(B)={A,B,D,E}$~: $d''(B)=3$ \subsubsection{Donner un exemple de chemin simple mais non élémentaire.} Un \textbf{chemin est simple} s'il ne passe qu'une fois par l'ensemble de ces arcs. Exemple~: $ABCDBE$. Un \textbf{chemin est élémentaire} s'il ne passe qu'une fois par l'ensemble de ces sommets. \subsubsection{Existe-il un circuit Hamiltonien dans ce graphe~?} Un \textbf{circuit} est un chemin qui se ferme sur lui-même. Un \textbf{circuit hamiltonien} est un circuit passant par tous les sommets du graphe. \subparagraph{Problème du voyageur de commerce} Le voyageur de commerce visite une fois et une seul chaque ville, puis retourne à la ville de départ. \section{Recherche de plus court chemin optimal} \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] (3) {C}; \node[main node] (1) [below left of=3] {A}; \node[main node] (2) [below right of=2] {B}; \node[main node] (4) [below of=3] {D}; \node[main node] (5) [right of=2] {E}; \path[every node/.style={font=\sffamily\small}] (1) edge node[right] {4} (3) edge node[left] {8} (4) (2) edge node[left] {2} (5) edge [bend left] node[left] {2} (4) (3) edge [bend left] node[left] {3} (2) edge [bend right] node[left] {4} (4) (4) edge [bend right] node [left] {-6} (3) edge [bend right] node[left] {1} (5) ; \end{tikzpicture} \subsection{Méthode matricielle} Pas de sommet source. Cette méthode donne en une seule exécution le chemin le plus court ou le chemin le plus long entre deux sommets. On cherche le chemin de valeur maximale reliant deux sommets. \subsubsection{Initialisation} On considère deux matrices $D_0$ et $\Pi_0$, de dimension $n\times n$, avec $n$ le nombre de sommets (ici 5). \[ D_0=\bordermatrix{~ & A & B & C & D & E \cr A & -\infty & -\infty & 4 & 8 & -\infty \cr B & -\infty & -\infty & -\infty & 2 & 2 \cr C & -\infty & 3 & -\infty & 4 & -\infty \cr D & -\infty & -\infty & -6 & -\infty & 1 \cr E & -\infty & -\infty & -\infty & -\infty & -\infty \cr} \qquad \Pi_0=\bordermatrix{~ & A & B & C & D & E \cr A & 1 & 1 & 1 & 1 & 1 \cr B & 2 & 2 & 2 & 2 & 2 \cr C & 3 & 3 & 3 & 3 & 3 \cr D & 4 & 4 & 4 & 4 & 4 \cr E & 5 & 5 & 5 & 5 & 5 \cr} \] $(D_0)_{i,j}=v_{i,j}=$ la valeur de l'arc $(i,j)$ si cet arc est présent\newline sinon $(D_0)_{i,j}=-\infty$\newline $(\Pi_{ij})=i$, $\forall j$. \subsubsection{À chaque étape $k\geq 1$} On calcule ma matrice $D_k$ obtenue en replaçant $(D_{k-1})_{i,j}$ par $\max\lbrace(D_{k-1})_{i,j}, x\rbrace$, $x$ correspond à la somme du $k$-ième terme de la ligne et du $k$-ième terme de la colonne où se trouve $(D_k)_{i,j}$. On itére pour $k=1,2,\ldots,n$. Ici $n=5\longmapsto$ on lit le résultat cherché par l'intermédiaire des matrices $(D_n, \Pi_n)$. \[ D_1=\bordermatrix{~ & A & B & C & D & E \cr A & -\infty & -\infty & 4 & 8 & -\infty \cr B & -\infty & -\infty & -\infty & 2 & 2 \cr C & -\infty & 3 & -\infty & \textbf{4} & -\infty \cr D & -\infty & -\infty & -6 & -\infty & 1 \cr E & -\infty & -\infty & -\infty & -\infty & -\infty \cr} \qquad \Pi_1=\bordermatrix{~ & A & B & C & D & E \cr A & 1 & 1 & 1 & 1 & 1 \cr B & 2 & 2 & 2 & 2 & 2 \cr C & 3 & 3 & 3 & \textbf{3} & 3 \cr D & 4 & 4 & 4 & 4 & 4 \cr E & 5 & 5 & 5 & 5 & 5 \cr} \] $\max\lbrace4,-\infty+8\rbrace$. La première colonne étant composée de $-\infty$, les deux matrices sont identiques. On a $D_0\equiv D_1$ et $\Pi_0\equiv \Pi_1$. \[ D_2=\bordermatrix{~ & A & B & C & D & E \cr A & -\infty & -\infty & 4 & 8 & -\infty \cr B & -\infty & -\infty & -\infty & 2 & 2 \cr C & -\infty & 3 & -\infty & \textbf{5} & \textbf{5} \cr D & -\infty & -\infty & -6 & -\infty & 1 \cr E & -\infty & -\infty & -\infty & -\infty & -\infty \cr} \qquad \Pi_2=\bordermatrix{~ & A & B & C & D & E \cr A & 1 & 1 & 1 & 1 & 1 \cr B & 2 & 2 & 2 & 2 & 2 \cr C & 3 & 3 & 3 & \textbf{2} & \textbf{2} \cr D & 4 & 4 & 4 & 4 & 4 \cr E & 5 & 5 & 5 & 5 & 5 \cr} \] Dans $\Pi_2$~: $(\Pi_2)_{i,j}=(\Pi)_{2,j}$ \[ D_3=\bordermatrix{~ & A & B & C & D & E \cr A & -\infty & \textbf{7} & 4 & \textbf{9} & \textbf{9} \cr B & -\infty & -\infty & -\infty & 2 & 2 \cr C & -\infty & 3 & -\infty & 5 & 5 \cr D & -\infty & \textbf{-3} & -6 & \textbf{-1} & 1 \cr E & -\infty & -\infty & -\infty & -\infty & -\infty \cr} \qquad \Pi_3=\bordermatrix{~ & A & B & C & D & E \cr A & 1 & \textbf{3} & 1 & \textbf{2} & \textbf{2} \cr B & 2 & 2 & 2 & 2 & 2 \cr C & 3 & 3 & 3 & 2 & 2 \cr D & 4 & \textbf{3} & 4 & \textbf{2} & 4 \cr E & 5 & 5 & 5 & 5 & 5 \cr} \] \[ D_4=\bordermatrix{~ & A & B & C & D & E \cr A & -\infty & 7 & 4 & 9 & \textbf{10} \cr B & -\infty & \textbf{-1} & \textbf{-4} & 2 & \textbf{3} \cr C & -\infty & 3 & \textbf{-1} & 5 & \textbf{6} \cr D & -\infty & -3 & -6 & -1 & 1 \cr E & -\infty & -\infty & -\infty & -\infty & -\infty \cr} \qquad \Pi_4=\bordermatrix{~ & A & B & C & D & E \cr A & 1 & 3 & 1 & 2 & \textbf{4} \cr B & 2 & \textbf{3} & \textbf{4} & 2 & \textbf{4} \cr C & 3 & 3 & \textbf{4} & 2 & \textbf{4} \cr D & 4 & 3 & 4 & 2 & 4 \cr E & 5 & 5 & 5 & 5 & 5 \cr} \] La dernière ligne étant composée de $=-\infty$, $D_5\equiv D_4$ et $\Pi_5\equiv\Pi_4$. \subsubsection{Lecture du résultat via $D_5$ et $\Pi_5$} On lit dans la case $(D_n)_{i,j}$ la valeur du chemin le plus long reliant $i$ à $j$. Exemple~: le chemin le plus long allant de $A$ à $E$ est de longueur 10.\\ $(\Pi_n)_{i,j}$ est le prédécesseur immédiat de $j$, soit $j'$. $(\Pi_n)_{i,j'}$ est le prédécesseur immédiat de $j'$, soit $j''$, \ldots \paragraph{Remarque} Le même algorithme procure également les chemins les plus courts en appliquant deux changements~: \begin{itemize} \item \textbf{Initialisation~:} on initialise la matrice à $+\infty$ au lieu de $-\infty$. \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 $ij$ 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)$$