361 lines
16 KiB
TeX
361 lines
16 KiB
TeX
\documentclass{article}
|
|
|
|
\usepackage[utf8]{inputenc}
|
|
\usepackage[T1]{fontenc}
|
|
\usepackage[frenchb]{babel}
|
|
\usepackage{tikz}
|
|
\usepackage{amsmath}
|
|
\usetikzlibrary{chains,positioning,matrix}
|
|
|
|
\newenvironment{enonce}{}{}
|
|
|
|
\begin{document}
|
|
|
|
\section{Partie théorique}
|
|
\subsection{Partie algorithmique}
|
|
|
|
\subsubsection{Exercice 1}
|
|
\begin{enonce}
|
|
Modélisation et résolution d'un problème d'ordonnancement par un problème de flot maximum :
|
|
ordonnancement avec coûts dépendants des dates de début.
|
|
\end{enonce}
|
|
|
|
|
|
|
|
\begin{figure}[h!]
|
|
\centering
|
|
\begin{tikzpicture}[node distance=3cm]
|
|
\node (J1) {$J_{1}$};
|
|
\node (J2) [above of=J1] {$J_{2}$};
|
|
\node (J3) [right of=J1] {$J_{3}$};
|
|
\draw[->] (J1) -- (J2);
|
|
\draw[->] (J1) -- (J3);
|
|
\draw[->] (J3) -- (J2);
|
|
\end{tikzpicture}
|
|
\caption{Graphe G}
|
|
\label{fig:graphe-g}
|
|
\end{figure}
|
|
|
|
\begin{enonce}
|
|
Construire le graphe $G*$ pour $n = 3$, $T = 5$, $p_1 = 1$, $p_2 = 2$, $p_3 = 1$,
|
|
$E = \{(1,2), (1,3), (3,2)\}$ et les coûts suivants :
|
|
|
|
\begin{figure}[h!]
|
|
\centering
|
|
\begin{tabular}{cccccc}
|
|
\hline
|
|
$i,t$ & 0 & 1 & 2 & 3 & 4\\
|
|
\hline
|
|
1 & 0 & 2 & 5 & 0 & 1\\
|
|
2 & 1 & 1 & 2 & 4 & -\\
|
|
3 & 1 & 10 & 2 & 3 & 3\\
|
|
\hline
|
|
\end{tabular}
|
|
\end{figure}
|
|
\end{enonce}
|
|
|
|
\begin{figure}[h!]
|
|
\centering
|
|
\colorlet{affectation}{green!50!black}
|
|
\colorlet{auxiliaire}{black}
|
|
\colorlet{précédence}{blue}
|
|
\begin{tikzpicture}[
|
|
affectation/.style = {
|
|
draw=affectation,
|
|
->
|
|
},
|
|
auxiliaire/.style = {
|
|
draw=auxiliaire,
|
|
->
|
|
},
|
|
précédence/.style = {
|
|
draw=précédence,
|
|
->
|
|
},
|
|
capacité/.style = {
|
|
fill=white,
|
|
font=\footnotesize
|
|
},
|
|
capacité affectation/.style = {
|
|
text=affectation,
|
|
capacité
|
|
},
|
|
capacité auxiliaire/.style = {
|
|
text=auxiliaire,
|
|
capacité
|
|
},
|
|
capacité précédence/.style = {
|
|
text=précédence,
|
|
capacité
|
|
}
|
|
]
|
|
|
|
\matrix[matrix of math nodes, nodes in empty cells, row sep=1cm, column sep=1cm] (m) {
|
|
& v_{1,0} & v_{1,1} & v_{1,2} & v_{1,3} & v_{1,4} & v_{1,5} & \\
|
|
s & v_{3,0} & v_{3,1} & v_{3,2} & v_{3,3} & v_{3,4} & v_{3,5} & t \\
|
|
& v_{2,0} & v_{2,1} & v_{2,2} & v_{2,3} & v_{2,4} & & \\
|
|
};
|
|
|
|
%% Penser a rajouter les J1, J2 et J3 a gauche du graphe.
|
|
|
|
\draw[affectation] (m-1-2)-- node[capacité affectation]{0} (m-1-3);
|
|
\draw[affectation] (m-1-3)-- node[capacité affectation]{2} (m-1-4);
|
|
\draw[affectation] (m-1-4)-- node[capacité affectation]{5} (m-1-5);
|
|
\draw[affectation] (m-1-5)-- node[capacité affectation]{0} (m-1-6);
|
|
\draw[affectation] (m-1-6)-- node[capacité affectation]{1} (m-1-7);
|
|
|
|
\draw[affectation] (m-2-2)-- node[capacité affectation]{1} (m-2-3);
|
|
\draw[affectation] (m-2-3)-- node[capacité affectation]{10} (m-2-4);
|
|
\draw[affectation] (m-2-4)-- node[capacité affectation]{2} (m-2-5);
|
|
\draw[affectation] (m-2-5)-- node[capacité affectation]{3} (m-2-6);
|
|
\draw[affectation] (m-2-6)-- node[capacité affectation]{3} (m-2-7);
|
|
|
|
\draw[affectation] (m-3-2)-- node[capacité affectation]{1} (m-3-3);
|
|
\draw[affectation] (m-3-3)-- node[capacité affectation]{1} (m-3-4);
|
|
\draw[affectation] (m-3-4)-- node[capacité affectation]{2} (m-3-5);
|
|
\draw[affectation] (m-3-5)-- node[capacité affectation]{4} (m-3-6);
|
|
|
|
\draw[auxiliaire] (m-2-1)-- node[capacité auxiliaire]{$\infty$} (m-1-2);
|
|
\draw[auxiliaire] (m-2-1)-- node[capacité auxiliaire]{$\infty$} (m-2-2);
|
|
\draw[auxiliaire] (m-2-1)-- node[capacité auxiliaire]{$\infty$} (m-3-2);
|
|
\draw[auxiliaire] (m-1-7)-- node[capacité auxiliaire]{$\infty$} (m-2-8);
|
|
\draw[auxiliaire] (m-2-7)-- node[capacité auxiliaire]{$\infty$} (m-2-8);
|
|
\draw[auxiliaire] (m-3-6)--(m-3-7.center)-- node[capacité auxiliaire]{$\infty$} (m-2-8);
|
|
|
|
\draw[précédence] (m-1-2)-- node[capacité précédence]{$\infty$} (m-2-3);
|
|
\draw[précédence] (m-1-3)-- node[capacité précédence]{$\infty$} (m-2-4);
|
|
\draw[précédence] (m-1-4)-- node[capacité précédence]{$\infty$} (m-2-5);
|
|
\draw[précédence] (m-1-5)-- node[capacité précédence]{$\infty$} (m-2-6);
|
|
\draw[précédence] (m-1-6)-- node[capacité précédence]{$\infty$} (m-2-7);
|
|
|
|
\draw[précédence] (m-2-2)-- node[capacité précédence]{$\infty$} (m-3-3);
|
|
\draw[précédence] (m-2-3)-- node[capacité précédence]{$\infty$} (m-3-4);
|
|
\draw[précédence] (m-2-4)-- node[capacité précédence]{$\infty$} (m-3-5);
|
|
\draw[précédence] (m-2-5)-- node[capacité précédence]{$\infty$} (m-3-6);
|
|
|
|
\draw[précédence] (m-1-2)-- node[capacité précédence,pos=0.3]{$\infty$} (m-3-3);
|
|
\draw[précédence] (m-1-3)-- node[capacité précédence,pos=0.3]{$\infty$} (m-3-4);
|
|
\draw[précédence] (m-1-4)-- node[capacité précédence,pos=0.3]{$\infty$} (m-3-5);
|
|
\draw[précédence] (m-1-5)-- node[capacité précédence,pos=0.3]{$\infty$} (m-3-6);
|
|
|
|
\end{tikzpicture}
|
|
\caption{Graphe G*}
|
|
\label{fig:graphe-g*}
|
|
\end{figure}
|
|
|
|
\subsubsection{Question 2}
|
|
\begin{enonce}
|
|
Montrer qu'il existe une coupe dans G* de capacité minimale de laquelle sort un et un seul arc d'affectation par job.
|
|
\end{enonce}
|
|
|
|
Démonstration par construction~:
|
|
On effectue un tri topologique sur le graphe des contraintes de précédence $G(\{J_1, \dots, J_n\}, E)$. Ce tri topologique nous donne un ensemble ordonné de n\oe uds $(J_{a1}, \dots, J_{an})$. On a donc~:
|
|
$$\forall J_{ai} \quad \not\exists \ j < i \quad | \quad \exists (J_{aj}, J_{ai}) \in E$$
|
|
On transforme ensuite $G$ en un graphe de flots à l'aide de l'algorithme fourni dans le sujet.
|
|
Considérons les arcs entre les $v_{ai,t}$~:
|
|
\begin{itemize}
|
|
\item Arcs d'affectation~: ces arcs sont entre des sommets $v_{ai,t}$ et $v_{aj,t'}$ avec $ai = aj$
|
|
\item Arcs de précédences~: ces arcs sont entre des sommets $v_{ai,t}$ et $v_{aj,t'}$ avec $ai < aj$, car grâce au tri topologique, il n'existe pas d'arcs entre des sommets $J_{ai}$ et $J_{aj}$ avec $aj < ai$, et de plus il n'y a pas de boucle (donc pas d'arc $(J_{ai},J_{ai})$ dans $G$, donc pas d'arc $(v_{ai,t}, v_{ai,t'})$ dans $G*$).
|
|
\item Arcs auxiliaires~: ces arcs ne sont pas entre des sommets $v_{ai,t}$.
|
|
\end{itemize}
|
|
On va créer une $(s-t)-\mathrm{coupe}$ minimale. Etant donné que cette coupe est minimale, aucun arc de capacité infinie n'a son origine dans $S$ et son extremité dans $\overline{S}$.
|
|
|
|
TODO~: Montrons que s'il s'agit d'une coupe minimale, il ne sort qu'un et qu'un
|
|
seul arc d'affectation par job. Il faut aussi montrer qu'il (il = ?) existe.
|
|
|
|
\subsubsection{Question 3}
|
|
TODO~: Attention à la phrase suivante, ce n'est pas tout à fait ce qu'on a montré dans l'exercice 2
|
|
|
|
Dans l'exercice précédent, on a montré que de toute coupe minimale sort un et un seul arc d'affectation par job.
|
|
|
|
On cherche à associer un ordonancement réalisable à toute coupe minimale.
|
|
|
|
On va construire cet ordonancement de la manière suivante~: à chaque
|
|
fois qu'un arc d'affectation $v_{i,t}, v_{i,t+1}$ traverse la coupe,
|
|
on exécute le job $i$ à l'instant $t$ dans l'ordonancement.
|
|
|
|
On cherche un ordonancement, une suite de paires
|
|
$(\text{tâche},\text{date de début})$ respectant les dépendances.
|
|
Autrement dit, chaque tâche apparaît après ses dépendances dans la
|
|
suite.
|
|
|
|
Comme chaque arc de précédence a une capacité finie, pour que la coupe
|
|
soit minimale, aucun arc de précédence ne doit sortir de la
|
|
coupe. Cela signifie qu'à chaque fois qu'on exécute un job (à
|
|
chaque fois qu'un arc d'affectation sort de la coupe), tous les arcs
|
|
de précédence entrants dans ce noeud ont leur extrémité déjà présente
|
|
dans la partie \og gauche \fg de la coupe
|
|
|
|
TODO~: on n'a pas prouvé
|
|
cela, on l'a prouvé pour tous les arcs sortants, mais pas les arcs entrants. Il faut
|
|
montrer qu'en partant de la source, on est obligié d'avoir tous les
|
|
arcs de précédence entrants et donc que toutes les tâches dont dépend
|
|
celle-là (?) ont été exécutées à un temps antérieur (antérieurement ?).
|
|
|
|
On cherche un ordonancement réalisable, c'est-à-dire pour lequel
|
|
toutes les tâches peuvent être menées à bout durant le temps
|
|
imparti.
|
|
|
|
La propriété énoncée dans l'exercice 2 nous indique que dans toute
|
|
coupe minimale, un et un seul arc d'affectation par job sort de la
|
|
coupe. Cela signifie que chaque job a commencé à être exécuté. Comme
|
|
il exite un noeud pour le job $j$ à l'instant (à un instant donné ?) $t$ si et seulement s'il
|
|
y a le temps de l'exécuter (\ogà chaque date de début possible\fg),
|
|
cela signifie que tous les jobs commencés ont eu le temps d'être
|
|
terminés et, comme nous venons de voir, que tous les jobs ont pu être
|
|
commencés - ils ont tous pu être terminés - et, par conséquent, l'ordonancement est
|
|
réalisable.
|
|
|
|
\subsubsection{Question 4}
|
|
|
|
On construit la coupe à partir de l'ordonancement de la même manière
|
|
qu'on a construit l'ordonancement à partir de la coupe dans l'exercice
|
|
précédent, mais en suivant l'algorithme dans l'autre sens.
|
|
|
|
Si on exécute le job $i$ à l'instant $t$ dans l'ordonancement, alors
|
|
tous les noeuds $v_{i,t'}$ avec $t' \leq t$ sont dans la partie \og
|
|
gauche\fg de la coupe. De plus, (sujet de verba manquante ?) s'appartient lui aussi à la partie
|
|
gauche de la coupe.
|
|
|
|
TODO~: et les arcs de précédence ? Prouver qu'aucun ne sort de la
|
|
coupe dans notre construction.
|
|
|
|
La capacité de cette coupe est la somme de la capacité de tous les
|
|
arcs qui sortent de la coupe, c'est-à-dire la somme des capacités des
|
|
arcs $v_{i,t}, v_{i,t+1}$. Comme la capacité de ces arcs est égale au
|
|
coût d'exécution de la tâche $i$ à l'instant $t$, on a bien égalité entre
|
|
la somme des capacités et la somme des coûts de démarrage des jobs,
|
|
donc la capacité de la coupe est égale au coût de l'ordonancement.
|
|
|
|
\subsection{Exercice 2}
|
|
|
|
Il existe un ensemble de chemins d'arcs disjoints de cardinal 3~:
|
|
|
|
$$
|
|
\begin{array}{ccccccc}
|
|
1 & \rightarrow & 2 & \rightarrow & 3 & \rightarrow & 6 \\
|
|
1 & \rightarrow & 3 & \rightarrow & 4 & \rightarrow & 6 \\
|
|
1 & \rightarrow & 4 & \rightarrow & 5 & \rightarrow & 6 \\
|
|
\end{array}
|
|
$$
|
|
|
|
Cherchons s'il en existe un de cardinal 4. Voici la liste des chemins
|
|
obtenue par un parcours en profondeur (en prennant toujours en premier
|
|
les sommets voisins avec le numéro le plus petit possible)~:
|
|
|
|
TODO~: numéroter les "équations"
|
|
$$
|
|
\begin{array}{ccccccccccc}
|
|
1 & \rightarrow & 2 & \rightarrow & 3 & \rightarrow & 4 & \rightarrow & 5 & \rightarrow & 6 \\
|
|
1 & \rightarrow & 2 & \rightarrow & 3 & \rightarrow & 4 & \rightarrow & 6 & & \\
|
|
1 & \rightarrow & 2 & \rightarrow & 3 & \rightarrow & 6 & & & & \\
|
|
1 & \rightarrow & 3 & \rightarrow & 4 & \rightarrow & 5 & \rightarrow & 6 & & \\
|
|
1 & \rightarrow & 3 & \rightarrow & 4 & \rightarrow & 6 & & & & \\
|
|
1 & \rightarrow & 3 & \rightarrow & 6 & & & & & & \\
|
|
1 & \rightarrow & 4 & \rightarrow & 5 & \rightarrow & 6 & & & & \\
|
|
1 & \rightarrow & 4 & \rightarrow & 6 & & & & & & \\
|
|
\end{array}
|
|
$$
|
|
|
|
Voyons les ensembles qui contiennent le chemin $A$~: On ne peut pas
|
|
prendre les chemins $B$ et $C$ car ils ont l'arc $(1,2)$ en commun
|
|
avec $A$. On ne peut pas prendre non plus les chemin $D$ et $G$ car
|
|
ils ont l'arc $(5,6)$ en commun avec $A$ ni le chemin $E$ à cause de
|
|
l'arc $(3,4)$. Il ne reste plus que les chemins $F$ et $H$ qu'on
|
|
pourrait peut-être prendre si on prend $A$, mais le cardinal de
|
|
l'ensemble serait alors 3, donc on n'améliorerait pas le résultat
|
|
existant. En conséquence, ce n'est pas la peine de chercher si ces chemins
|
|
sont \og compatibles\fg avec $A$.
|
|
|
|
Procédons de la même manière pour $B$ (sachant que $A$ ne peut pas
|
|
faire partie de l'ensemble). Si on a le chemin $B$, alors on ne peut
|
|
pas avoir~:
|
|
\begin{itemize}
|
|
\item $C$ (arc $(2,3)$),
|
|
\item $D$ (arc $(3,4)$),
|
|
\item $E$ (arc $(3,4)$),
|
|
\item $H$ (arc $(4,6)$).
|
|
\end{itemize}
|
|
À partir de ce moment, il ne reste plus que $F$ et $G$, l'ensemble
|
|
serait de cardinal 3, donc $B$ ne peut pas être dans un ensemble de
|
|
cardinal 4.
|
|
|
|
Passons à $D$ avec $A$ et $B$ exclus. On ne peut pas avoir~:
|
|
\begin{itemize}
|
|
\item $E$ (arc $(3,4)$),
|
|
\item $F$ (arc $(1,3)$),
|
|
\item $G$ (arc $(4,5)$).
|
|
\end{itemize}
|
|
Donc $D$ n'est pas dans l'ensemble.
|
|
|
|
Passons à $F$ avec $A,B,D$ exclus. On ne peut pas avoir~:
|
|
\begin{itemize}
|
|
\item $C$ (arc $(3,6)$),
|
|
\item $E$ (arc $(1,3)$).
|
|
\end{itemize}
|
|
Donc $F$ n'est pas dans l'ensemble.
|
|
|
|
Comme $A,B,D,F$ ne sont pas dans l'ensemble et que nous avons
|
|
seulement 8 candidats, la seule possibilité qui reste pour un ensemble
|
|
de cardinal 4 est $C,E,G,H$. Or, dans cet ensemble, l'arête $(1,4)$
|
|
est commune à $G$ et $H$, donc on ne peut pas construire un ensemble
|
|
de chemins d'arcs disjoints de taille 4 (donc pas de taille supérieure
|
|
à 4 non plus).
|
|
|
|
Conclusion~: Le nombre maximum de chemins d'arcs disjoints est 3.
|
|
|
|
|
|
|
|
\subsubsection{Exercice 3}
|
|
\begin{enonce}
|
|
Sur quelques réductions...
|
|
\end{enonce}
|
|
|
|
|
|
\subsubsection{Question 1}
|
|
\begin{enonce}
|
|
On vous demande de rappeler la réduction de SAT à 3-SAT.
|
|
\end{enonce}
|
|
|
|
\begin{enonce}
|
|
(a) Enoncer SAT et 3-SAT.
|
|
\end{enonce}
|
|
|
|
SAT est une abbrévation pour 'problème de satisfiabilité'. En logique propositionnelle, résoudre un problème SAT consiste à déterminer s'il existe une assignation des variables booléennes telle qu'une formule logique sous forme normale conjonctive s'évalue à vrai. Si tel est le cas, la formule est dite 'satisfiable', sinon elle est 'insatisfiable'. Etant donné le résultat booléen ('satisfiable' ou 'insatisfiable') de ce genre de problème, il s'agit bien d'un problème de décision.
|
|
|
|
On appelle 2-sat un problème dont chaque clause de la formule logique en question contient au plus 2 littéraux, 3-sat un problème SAT dans lequel chaque clause de la formule logique en question contient au plus 3 littéraux. Un problème 2-sat est NL-complet alors qu'un problème 3-sat est NP-complet.
|
|
|
|
Un exemple d'un problème 3-SAT est le suivant :
|
|
|
|
$(v_{1} \vee v_{2} \vee v_{3}) \wedge (v_{4} \vee v_{5} \vee v_{6}) \wedge (v_{7} \vee v_{8} \vee v_{9}) \wedge$ ...
|
|
|
|
où chaque v est une variable ou la négation d'une variable, chaque variable pouvant figurer plusieurs fois dans l'expression.
|
|
|
|
\begin{enonce}
|
|
(b) Définir la réduction.
|
|
\end{enonce}
|
|
|
|
En théorie de complexité, une 'réduction' est la transformation d'un problème en un autre problème. Selon la transformation utilisée, la réduction peut être utilisée afin de définir une classe de complexité à un ensemble de problèmes. Problème A est réductible à Problème B si les solutions au Problème B existe et donne des solutions au Problème A à chaque fois que A a des solutions. Par conséquent, la solution de A ne peut pas être plus difficile que la solution de B.
|
|
|
|
Il peut être utile de transformer d'autres types de problème en un type de problèmes que l'on sait résoudre et/ou de subdiviser le problème ne plusieurs problèmes que l'on sait résoudre, d'où le terme 'réduction'. De même, lorsque l'on a un problème qu'on a prouvé difficile à résoudre
|
|
|
|
Il peut être utile de résoudre un problème qui est similaire à un problème que l'on a déjà résolu. Dans ce cas, une méthodes efficace de résoudre le nouveau problème est de transformer chaque instance du nouveau problème en un instance d'un problème que l'on sait résoudre, résoudre chaque instance à l'aide de solutions existantes afin d'obtenir une solution finale.
|
|
|
|
Une autre application des 'réduction' est aux problèmes qui sont difficiles à résoudre. Lorsque l'on a un problème qui a été prouvé difficile à résoudre et que nous avons un nouveau problème similaire, nous pouvous faire l'hypothèse que le nouveau problème, lui aussi, est difficile à résoudre. Le raisonnement est l'inverse de celui des problèmes qui peuvent être résolu aisément.
|
|
|
|
Un exemple simple est de passer de la multiplication à la quadrature. Supposons que nous ne sommes capable que d'effectuer l'addition, la soustraction et la quadrature. Avec ces trois opérations, nous pouvons trouver le produit de deux nombres quelconques :
|
|
|
|
|
|
$(a + b) = \dfrac{(a + b)^2 - a^2 - b^2}{2}$
|
|
|
|
|
|
Lorsqu'il est possible de réduire un problème difficile en un problème que l'on sait résoudre, la difficulté demeure dans la réduction elle-même.
|
|
|
|
|
|
\begin{enonce}
|
|
(c) Justifier alors que 3-SAT est NP-complet (sachant que SAT est NP-complet).
|
|
\end{enonce}
|
|
|
|
|
|
\end{document}
|