Cours GRF

This commit is contained in:
Némunaire 2012-05-14 11:26:17 +02:00
parent 98e42d4fc1
commit ee965d6137
6 changed files with 748 additions and 2 deletions

View File

@ -14,6 +14,8 @@
\usepackage{array}
\usepackage{tikz}
\usepackage{gantt}
\definecolor{dkgreen}{rgb}{0,0.6,0}
\definecolor{gray}{rgb}{0.5,0.5,0.5}
\definecolor{mauve}{rgb}{0.58,0,0.82}

View File

@ -4,4 +4,4 @@
\maketitle
\input{20120306}
\input{20120426-instructionselection}

View File

@ -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)$$

263
grf/gantt.sty Normal file
View File

@ -0,0 +1,263 @@
\ProvidesPackage{gantt}[2011/03/20 Some macros for drawing gantt diagrams using tkiz v.1.3]
% Some macros for drawing gantt diagrams using tkiz.
%
% Martin Kumm, 17.05.2010 (Version 1.0)
% Alan Munn, Martin Kumm, 14.03.2011 (Version 1.2)
% Andrés Silva Marambio, 20.03.2011 (Version 1.3)
%
% Update 20.03.2011, Version 1.3
%
% changes from v1.2:
% change \ProvidesPackage{gantt.sty} for \ProvidesPackage{gantt}
% add \bfseries for the command \ganttgroup
% add two newcommands for doing Gantt Milestones: \ganttmilestone and \ganttmilestonecon
% usage: \ganttmilestone[color=<color>]{label}{start} - Create a gantt milestone using a diamond
% usage: \ganttmilestonecon[color=<color>]{label}{start} - Create a gantt milestone using a diamond and conect with the previuos itemg
% fixed the issue when \ganttbarcon or \ganttmilestonecon connect in decimal positions
%
% Update 15.03.2011, Version 1.2
%
% changes from v1.1:
% px sizes has ben changed ot pt due to problems with some LaTeX distributions (thanks to Michael Kubovy and Loïc Le Guyader!)
% Correction of the text aligned in \titleelement (thanks to Josh Hykes!)
% \unitlength was changed to \ganttunitlength (thanks to Alan Munn!)
% \RequirePackage was added (thanks to Alan Munn!)
%
% Update 05.08.2010, Version 1.1
%
% changes from v1.0:
% \ganttbar and \ganttbarcon have been extended with the xkeyval syntax
% The pattern of the bar is now independent of the color and can be set by
% e.g. \ganttbar[pattern=horizontal lines,color=blue]{...}{1}{1}
% This syntax is incompatible with the previous ones!
% replace \ganttbar[<pattern>] with \ganttbar[pattern=<pattern>]
\RequirePackage{tikz,pgffor,xkeyval,ifthen,calc,forloop}
\usetikzlibrary{patterns}
\usetikzlibrary{arrows}
\newcounter{ganttnum}
\newcounter{ganttwidth}
\newlength{\ganttlastx}
\setlength{\ganttlastx}{0cm}
\newlength{\nextganttlastx}
\newlength{\gantttmpa}
\newlength{\gantttmpb}
\newlength{\ganttunitlength}
\setlength{\ganttunitlength}{1cm}
\newlength{\titleunitlength}
\setlength{\titleunitlength}{1cm}
\newcounter{gantttitlenum}
\define@key{ganttx}{xunitlength}{%
\setlength{\ganttunitlength}{#1}
}
\define@boolkey{ganttx}{drawledgerline}{}
\define@key{ganttx}{fontsize}{\def\ganttfontsize{#1}}
\define@key{ganttx}{titlefontsize}{\def\gantttitlefontsize{#1}}
\presetkeys{ganttx}{drawledgerline=false,xunitlength=1cm,titlefontsize=\small,fontsize=\normalsize}{}
\define@key{ganttbarx}{pattern}{\def\ganttbarpattern{#1}}
\define@key{ganttbarx}{color}{\def\ganttbarcolor{#1}}
\presetkeys{ganttbarx}{pattern=north west lines,color=black}{}
% The gantt environment draws the canvas of a gantt figure (realized as tikzpicture)
% The usage is \begin{gantt}[...]{no of Tasks to plot}{no of time slots}
% The optional argument [...] can be filled in a key=value syntax, using one or more of the following keys:
%
% xunitlength - length of one time slot (default: 1 cm)
% fontsize - fontsize of labels (default: \normalsize)
% titlefontsize - fontsize of title section (default: \small)
% drawledgerline - Switch to enable/disable the drawing of horizontal ledger lines (default value: false)
\newenvironment{gantt}[3][]{%
\begin{tikzpicture}[draw=black, yscale=.7,xscale=1]
\tikzstyle{time}=[coordinate]
\setkeys{ganttx}{#1}{%
\setcounter{ganttwidth}{#3}
\setcounter{ganttnum}{0}
\newcount\ganttx
\newcount\ganttheight
\ganttheight=#2 %define the number of Y ticks
\advance\ganttheight by 1
\def\ganttxstringtop{};
\def\ganttxstringbottom{};
\ganttx=0
\draw (0,0.5) node[above] {\ganttxstringtop} -- (0,1.4-\ganttheight) node[below] {\ganttxstringbottom};
\draw (\value{ganttwidth}*\ganttunitlength,0.5) node[above] {\ganttxstringtop} -- (\value{ganttwidth}*\ganttunitlength,1.4-\ganttheight) node[below] {\ganttxstringbottom};
%draw grid
\foreach \t in {1,2,...,\value{ganttwidth}}{
\ganttx=1
\multiply\ganttx by \t
\draw[dotted] (\ganttunitlength*\t,-0.5) node[above] {\ganttxstringtop} -- (\ganttunitlength*\t,1.4-\ganttheight) node[below] {\ganttxstringbottom};
}
%draw x axis
\draw[] (0,-#2+0.4) -- (\value{ganttwidth}*\ganttunitlength,-#2+0.4);
}
}{\end{tikzpicture}}
% ganttitle is the environment for drawing the title section
\newenvironment{ganttitle}[1][]{%
\setlength{\ganttlastx}{0 cm}
}{%
\setlength{\ganttlastx}{0 cm}
\addtocounter{ganttnum}{-1}%
}
% \titleelement draws one element of the title
% usage: \titleelement{label}{length}
\newcommand{\titleelement}[2]{
\setlength{\gantttmpa}{\ganttunitlength*#2}
\divide\gantttmpa by 2;
\draw (\the\ganttlastx,\value{ganttnum}) rectangle (\the\ganttlastx+#2*\ganttunitlength,\value{ganttnum}+0.6);
\node [text height=1.5ex,text depth=0.7ex] at (\the\ganttlastx+\the\gantttmpa,\value{ganttnum}+0.25) {%
\gantttitlefontsize #1%
};
\setlength{\ganttlastx}{\ganttlastx+\ganttunitlength*\real{#2}}
}
% \numtitle draws a numbered sequence of title elements
% usage: \numtitle{start number}{increment}{end number}{length of each title element}
\newcommand{\numtitle}[4]{
\forloop[#2]{gantttitlenum}{#1}{\(\value{gantttitlenum} < #3\) \or \(\value{gantttitlenum} = #3\)}%
{%
\titleelement{\thegantttitlenum}{#4}
}
}
% \ganttbar draws a single, unconnected bar for representing a task
% usage: \ganttbar[pattern=<pattern>,color=<color>]{label}{start}{length}
% where the optional comma separated arguments are:
% pattern - is a tikz pattern (e.g. north west lines (default), north east lines, crosshatch, crosshatch dots, grid, ...)
% color - a tikz color of the pattern (e.g. red, green blue gray, dark gray)
% for more information see the tikz documentation
\newcommand{\ganttbar}[4][]{
\setlength{\gantttmpa}{#3\ganttunitlength}
\setlength{\gantttmpb}{#4\ganttunitlength}
\setlength{\gantttmpb}{\gantttmpa+\gantttmpb}
\ifKV@ganttx@drawledgerline
\draw[dotted] (0,\value{ganttnum}-0.2) -- (\value{ganttwidth}*\ganttunitlength,\value{ganttnum}-0.2);
\fi
\node at (0,\value{ganttnum}) [anchor=base east] {%
\ganttfontsize #2%
};
\setkeys{ganttbarx}{#1}{%
\draw[pattern=\ganttbarpattern,pattern color=\ganttbarcolor] (\gantttmpa,\value{ganttnum}+0.1) rectangle (\gantttmpb,\value{ganttnum}+0.5);
}
\setlength{\ganttlastx}{\gantttmpb}
\addtocounter{ganttnum}{-1}
}
% \ganttcon draws an arrow between to bars with specified coordinates
% usage: \ganttcon{startx}{starty}{endx}{endy}
\newcommand{\ganttcon}[4]{
\draw[-latex,rounded corners=1pt] (#1\ganttunitlength,-#2+0.1 + 0.2) -- (#1\ganttunitlength+0.4*\ganttunitlength,-#2+0.1+0.2) -- (#1\ganttunitlength+0.4*\ganttunitlength,-#2-0.4+0.2) -- (#1\ganttunitlength-0.4*\ganttunitlength,-#2-0.4+0.2) -- (#1\ganttunitlength-0.4*\ganttunitlength,-#4+0.1+0.2) -- (#3\ganttunitlength,-#4+0.1+0.2);
}
% \ganttbarcon draws a single bar *and* connects the bar with the previous bar for
% consecutive tasks
% usage: \ganttbarcon[pattern=<pattern>,color=<color>]{label}{start}{length}
% where the optional pattern argument are the same as for \ganttbar
\newcommand{\ganttbarcon}[4][]{
\setlength{\nextganttlastx}{\the\ganttlastx+1\ganttunitlength}
\ifdim\nextganttlastx>#3\ganttunitlength
\draw[-latex,rounded corners=1pt] (\the\ganttlastx,\value{ganttnum}+1.1 + 0.2) -- (\the\ganttlastx+0.4*\ganttunitlength,\value{ganttnum}+1.1+0.2) -- (\the\ganttlastx+0.4*\ganttunitlength,\value{ganttnum}+0.6+0.2) -- (\the\ganttlastx-0.4*\ganttunitlength,\value{ganttnum}+0.6+0.2) -- (\the\ganttlastx-0.4*\ganttunitlength,\value{ganttnum}+0.1+0.2) -- (#3\ganttunitlength,\value{ganttnum}+0.1+0.2);
\else
\draw[-latex,rounded corners=1pt] (\the\ganttlastx,\value{ganttnum}+1.1 + 0.2) -- (\the\ganttlastx+0.4*\ganttunitlength,\value{ganttnum}+1.1+0.2) -- (\the\ganttlastx+0.4*\ganttunitlength,\value{ganttnum}+0.1+0.2) -- (#3\ganttunitlength,\value{ganttnum}+0.1+0.2);
\fi
\ganttbar[#1]{#2}{#3}{#4}
}
% \ganttgroup draws a bar to group tasks
% usage: \ganttgroup{label}{start}{length}
\newcommand{\ganttgroup}[3]{%
\setlength{\gantttmpa}{#2\ganttunitlength}
\setlength{\gantttmpb}{#3\ganttunitlength}
\setlength{\gantttmpb}{\gantttmpa+\gantttmpb}
\ifKV@ganttx@drawledgerline
\draw[dotted] (0,\value{ganttnum}-0.2) -- (\value{ganttwidth}*\ganttunitlength,\value{ganttnum}-0.2);
\fi
\node at (0,\value{ganttnum}) [anchor=base east] {%
\ganttfontsize\bfseries #1%
};
\fill[black] (\gantttmpa-0.14cm,\value{ganttnum}+0.2) rectangle (\gantttmpb+0.14cm,\value{ganttnum}+0.4);
\draw[diamond-diamond] (\gantttmpa-0.14cm,\value{ganttnum}+0.2) -- (\gantttmpb+0.14cm,\value{ganttnum}+0.2);
\setlength{\ganttlastx}{\gantttmpb}
\addtocounter{ganttnum}{-1}
}
% \ganttmilestone, draw a diamond to represent a milestone
% usage: \ganttgroup[fill=<color>]{label}{start}
% color - a tikz color of the pattern (e.g. red, green blue gray, dark gray)
% for more information see the tikz documentation
% Declaring layers to abvoid superposition when you connect a \ganttmileston with a task
\pgfdeclarelayer{background}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,main,foreground}
\newcommand{\ganttmilestone}[3][]{
\setlength{\gantttmpa}{#3\ganttunitlength}
\setlength{\gantttmpb}{0\ganttunitlength}
\setlength{\gantttmpb}{\gantttmpa+\gantttmpb}
\ifKV@ganttx@drawledgerline
\draw[dotted] (0,\value{ganttnum}-0.2) -- (\value{ganttwidth}*\ganttunitlength,\value{ganttnum}-0.2);
\fi
\node at (0,\value{ganttnum}) [anchor=base east] {%
\ganttfontsize #2%
};
\setkeys{ganttbarx}{#1}{%
\pgfonlayer{foreground}
\draw[diamond-, color=\ganttbarcolor] (\gantttmpa,\value{ganttnum}+0.1) -- (\gantttmpb,\value{ganttnum}+0.4);
\endpgfonlayer
}
\setlength{\ganttlastx}{\gantttmpb}
\addtocounter{ganttnum}{-1}
}
% \ganttmilestonecon draws a single diamond *and* connects the diamond with the previous task
% usage: \ganttmilestonecon[color=<color>]{label}{start}{length}
% where the optional color argument are the same as for \ganttbar and \ganttmilestone
\newcommand{\ganttmilestonecon}[3][]{
\setlength{\nextganttlastx}{\the\ganttlastx+1\ganttunitlength}
\ifdim\nextganttlastx>#3\ganttunitlength
\draw[-latex,rounded corners=1pt] (\the\ganttlastx,\value{ganttnum}+1.1 + 0.2) -- (\the\ganttlastx+0.4*\ganttunitlength,\value{ganttnum}+1.1+0.2) -- (\the\ganttlastx+0.4*\ganttunitlength,\value{ganttnum}+0.6+0.2) -- (\the\ganttlastx-0.4*\ganttunitlength-1.8,\value{ganttnum}+0.6+0.2) -- (\the\ganttlastx-0.4*\ganttunitlength-1.8,\value{ganttnum}+0.1+0.2) -- (#3\ganttunitlength-1.8,\value{ganttnum}+0.1+0.2);
%
\else
\draw[-latex,rounded corners=1pt] (\the\ganttlastx,\value{ganttnum}+1.1 + 0.2) -- (\the\ganttlastx+0.4*\ganttunitlength,\value{ganttnum}+1.1+0.2) -- (\the\ganttlastx+0.4*\ganttunitlength,\value{ganttnum}+0.1+0.2) -- (#3\ganttunitlength-1.8,\value{ganttnum}+0.1+0.2);
\fi
% \fi
\ganttmilestone[#1]{#2}{#3}
}
\endinput

View File

@ -140,7 +140,7 @@ Choisi le 2 octobre 2000 par le NIST. Il n'a pas de faille connue.
$\frac{\mathbb{Z}}{\mathbb{NZ}}$.
\end{itemize}
Évidemment, de nombreux calcul cryptographique se basent sur ce dernier point.
Évidemment, de nombreux calculs cryptographique se basent sur ce dernier point.
\section{Diffie Hellman (échange de clef sur un réseau public)}
@ -157,6 +157,15 @@ Un pirate peur retrouver $g^{a+b}$, mais pas $g^{a.b}$.\\
Cependant, cet algorithme est cassable par l'attaque de \emph{man in the
middle}.
\section{Système de El Gamal}
Alice génére un $a$ secret, puis calcul $g^a$ qu'elle publie.
Pour envoyer un message, B génére un $k$, puis calcul $g^{ak}$ puis chiffre le
message en faisant un XOR entre le message et $g^{ak}$. Il envoie ensuite le
message avec $g^k$. Seul Alice pourra alors déchiffrer le message puisqu'il est
nécessaire de connaître $a$.
\section{Génération de nombres premiers aléatoires}
La suite des aléas générés doir ressembler à une suite au hasard ; la suite des
@ -169,3 +178,46 @@ Les générateurs aléatoires purs (basés sur un phénomène aléatoire)~:
\item Trafic sur un réseau informatique~;
\item Checksum de la mémoire vive.
\end{itemize}
\section{À propos des ordres de grandeur}
Avec un processeur à 1GHz, il est possible de casser DES en un an avec une
seule machine. Avec un chiffrement AES, il faut compter plus de 20 milliards
d'années avec un milliard de supercalculateurs actuels.
Mais les ressources ne;cessaures au pirate croissent comme la racine carrée de
N.
\section{Théorème de Fermat}
Pour $p$ premier, $a\neq 0[p]$, on a $a^{p-1}\equiv 1[p]$.
\section{La fonction d'Euler}
$a$ est premier à $n$ si et seulement s'il est inversible dans
$\mathbb{Z}/n\mathbb{Z}$.
\section{Le théorème d'Euler}
Cas général du théorème de Fermat~: pour $a\in U_n$, on a $a^\Phi(n)\equiv
1[n]$. Mais on ne peut pas en conclure que pour tout
$a\in(\mathbb{Z}/n\mathbb{Z})a^{\Phi(n)+1\equiv a[n]}$.
\subsection{Cas particulier}
RSA se base sur un cas particulier du théorème d'Euler.
\section{RSA}
De quoi à-t-on besoin~:
\begin{itemize}
\item Addition, multiplication~;
\item Division modulo $\Phi(n)$ pour le calcul des clefs~;
\item Réduction modulo $n$~;
\item Exponentuation.
\end{itemize}
\subsection{Casser RSA~?}
Il faut prendre quelques précautions quand au choix des nombres premiers
choisis (ils doivent être suffisamment grands et ne pas être trop proche).

View File

@ -169,3 +169,113 @@ sont pas respectées.
\paragraph{Famine~:} un thread est en famine quand il attend indéfiniment une
ressources.
\chapter{Techniques de lock}
\section{Comment locker~?}
\subsection{Bloquer les interruptions et la mémoire}
\subsubsection{Interruptions}
Dans le code on déclenche des interruptions de temps en temps pour
changer de thread.
\subsubsection{Mémoire}
On bloque un espace mémoire le temps de faire une série d'opération.
\subsection{Test and set}
On swap 1 avec le contenu d'une adresse mémoire. Ensuite on lit le
contenu récupéré. S'il vaut 1, on continue de boucler. S'il vaut 0,
tout autre thread obtiendrait un 1 du fait que l'opération de swap est
atomique.
\subsection{Compare and swap}
On lui donne une adresse, une valeur de test, une nouvelle valeur.
Exemple~: $+=$, $-=$, \ldots
\subsection{Mutex}
C'est un verrou que l'on utilise comme valeur abstraite qui correspond
à une porte de toilette.
C'est implémenté à base de compare and swap.
\newline
Pthread n'utilise pas des mutex équitables, ni implémentés sous forme
de pile, ils sont réentrants et sont en attente passive.
\newline
L'attente passive c'est le fait de donner au kernel la charge de
réveiller le thread lorsqu'un autre syscall indiquant qu'il a fini
d'exécuter le code critique.
Du fait du nombre de syscall, il est intéressant de garder un spin
lock plutôt qu'un mutex.
\subsection{Barrière}
C'est un outil de synchronisation. Elle reste fermée tant qu'il n'y a
pas assez de monde pour rentrer. La barrière se referme derrière le
dernier.
Peut utilisé, sauf avec Cuda sur les cartes graphiques.
\subsection{Read/Write lock}
Répond au problème du lecteur/rédacteur.
Des thread lisent la zone mémoire et d'autre écrivent la zone
mémoire.
Lorsqu'il n'y a pas d'écriture, on peut lire sans gérer les
locks. Mais lorsqu'il y a de l'écriture, il peut arriver que l'on lise
le début de la réécriture puis l'ancien contenu écrit.
On a donc deux mutex~: un pour la lecture, un autre pour
l'écriture. Si le mutex d'écriture est actif, on attend systématique,
si le mutex de lecture est actif, on autorise les autres lecteure,
mais on attend pour faire les écritures.
\subsection{Variable de condition}
On associe une condition à un mutex. On boucle sur la condition, et on
wait (sans oublier de libérer le mutex) tant que la condition n'est
pas valide.
\subsection{Sémaphores}
On a un compteur protégé que l'on peut incrémenté ou
décrémenter. Quand ce compteur est supérieur ou égal à 0~: le
sémaphore est réveillé. Lorsqu'il est à 0 et qu'il est décrémenté, il
se met en sommeil.
Généralement, on utiliser les opérations P et V. P incrémente le
compteur et V le décrémente. Par défaut, on a une notion de pile.
\subsection{Moniteur}
L'avantage des moniteurs est de cacher l'utilisation des wait
Cela requiert d'avoir un langage objet.
\section{Le diner des philosophes}
On a 5 philosophes.
\section{Structure de données}
Les B-tree sont très adaptés au parallélisme.
Les listes doublement chaînées sont à l'inverse, le pire choix
possible.
\subsection{Structures non bloquantes}