diff --git a/tp/code/ProductionHoraire.java b/tp/code/ProductionHoraire.java index 128a0ef..bc640a6 100644 --- a/tp/code/ProductionHoraire.java +++ b/tp/code/ProductionHoraire.java @@ -123,15 +123,15 @@ public class ProductionHoraire { // Constantes pour la contrainte du nombre minimum et maximum d'heures - IntVar IVMIN_H = model.intVar(MIN_H-1); - IntVar IVMAX_H = model.intVar(MAX_H-1); + IntVar MIN_H_TRAVAILLE = model.intVar(MIN_H-1); + IntVar MAX_H_TRAVAILLE = model.intVar(MAX_H-1); // Contrainte du motif d'horaire et du nombre minimum et maximum d'heures for (Integer i=0; i=", IVMIN_H).post(); - model.sum(LignesE[i], "<=", IVMAX_H).post(); + model.sum(LignesE[i], ">=", MIN_H_TRAVAILLE).post(); + model.sum(LignesE[i], "<=", MAX_H_TRAVAILLE).post(); } // Optimisation du nombre souhaité d'employés diff --git a/tp/question2.tex b/tp/question2.tex index 60280f0..dfcbfdc 100644 --- a/tp/question2.tex +++ b/tp/question2.tex @@ -11,37 +11,55 @@ Plusieurs constantes sont définies par l'énoncé du problème. On définit les \begin{itemize} \item $N$ = Nombre d'employés disponibles -\item $MIN_H$ = Nombre minimal de périodes de 30 minutes travaillées par l'employés, incluant la pause -\item $MAX_H$ = Nombre maximal de périodes de 30 minutes travaillées par l'employés, incluant la pause -\item $MIN_{PERIODE}$ = Nombre minimal de période dans le bloc de travail précédant et suivant la pause -\item $N_{REQUIS}(t)$ = Nombre d'employés requis à la période $t \in \lbrace 1,16 \rbrace$. -\item $N_{SOUHAITE}(t)$ = Nombre d'employés souhaités à la période $t \in \lbrace 1,16 \rbrace$. -\item $N_{PERIODE}$ = Nombre de périodes dans l'horaire. Constante initialisée à 16. +\item $MIN_H$ = Nombre minimal de périodes travaillées par l'employé, incluant la pause +\item $MAX_H$ = Nombre maximal de périodes travaillées par l'employé, incluant la pause +\item $MIN_{P}$ = Nombre minimal de période dans le bloc de travail précédant et suivant la pause +\item $e_j^{req}$ = Nombre d'employés requis à la période $j \in \lbrace 1,16 \rbrace$. +\item $e_j^{souh}$ = Nombre d'employés souhaités à la période $j \in \lbrace 1,16 \rbrace$. +\item $N_P$ = Nombre de périodes dans l'horaire. Constante initialisée à 16. \item $V_{PERTE}$ = Valeur de la perte lié à un écart d'un employé par rapport au nombre souhaité. Constante initialisée à 20. \end{itemize} -On définit aussi ces constantes pour simplifier les calculs. +On définit aussi ces constantes supplémentaires pour la création de contraintes, car Choco 4 ne permet pas d'effectuer d'opérations arithmétiques dans une contrainte. \begin{itemize} -\item $MAX_{PERIODE} = MAX_H-MIN_{PERIODE}-1$ = Nombre minimal de période dans le bloc de travail précédant et suivant la pause -\item $MAX_{PERIODE\_REPOS} = MAX_{PERIODE}-MIN_H-1$ = Nombre minimal de période dans le bloc de repos débutant ou terminant la journée +\item $MAX_P = MAX_H-MIN_P-1$ = Nombre maximal de périodes dans le bloc de travail précédant et suivant la pause. +\item $MAX_{PR} = MAX_P-MIN_H-1$ = Nombre maximal de périodes dans le bloc de repos débutant ou terminant la journée. +\item $MIN_{HT} = MIN_H-1$ = Nombre minimal de périodes travaillées par l'employé, excluant la pause +\item $MAX_{HT} = MAX_H-1$ = Nombre maximal de périodes travaillées par l'employé, excluant la pause \end{itemize} \subsection{Variables} \label{sec:q2variables} -On définit une matrice de variables $E_{N \times N_{PERIODE}}$ où $e_{i,j}$ correspondant à une valeur booléenne prenant la valeur $1$ si l'employé $i$ travaille à la période $j$ et $0$ sinon. +On définit une matrice de variables $E_{N \times N_P}$ où $e_{ij}$ correspondant à une valeur booléenne prenant la valeur $1$ si l'employé $i$ travaille à la période $j$ et $0$ sinon. -\begin{align*} - &e_{i,j} & \forall 1 \leq i \leq N, 1 \leq j \leq N_{PERIODE}\\ - &dom(e_{i,j}) = \lbrace 0,1 \rbrace & \forall 1 \leq i \leq N, 1 \leq j \leq N_{PERIODE} -\end{align*} +\begin{align} + \label{eq:v1} + &e_{ij} & \forall 1 \leq i \leq N, 1 \leq j \leq N_P\\ + &dom(e_{ij}) = \lbrace 0,1 \rbrace & \forall 1 \leq i \leq N, 1 \leq j \leq N_P\nonumber +\end{align} -Nombre total de variables: +Afin de résoudre le problème d'optimisation, on doit définir des variables supplémentaires, car les composantes de la fonction d'optimisation sont aussi exprimées sous forme de contraintes. -\begin{align*} - &N \times N_{PERIODE} -\end{align*} +$e_{j}^{eff}$, le nombre d'employés effectif à la période $j$, et $e_{j}^{dist}$ la différence absolue entre le nombre d'employés effectif et souhaité à la période $j$. +\begin{align} + \label{eq:v2} + e_{j}^{eff} &= \sum_{i=1}^{N} e_{ij} & \forall 1 \leq j \leq N_P\\ + \label{eq:v3} + e_{j}^{dist} &= \lvert e_{j}^{eff} - e_j^{souh} \rvert & \forall 1 \leq j \leq N_P +\end{align} + +\subsubsection{Nombre total de variables} +\label{sec:q2nbtotvar} + +Le nombre total de variables pour les définitions \eqref{eq:v1}, \eqref{eq:v2}, +\eqref{eq:v3} : + +\begin{align} + \label{eq:vartot} + N \times N_P + N_P + N_P &= (N+2) \times N_p \in \theta(N) +\end{align} \subsection{Contraintes} \label{sec:q2contraintes} @@ -49,28 +67,71 @@ Nombre total de variables: \subsubsection{Nombre d'employés requis} \label{sec:nbemployesreq} -La contrainte du nombre d'employés requis s'énonce comme suit: pour chaque période $i$, le nombre d'employés travaillant doit être supérieur ou égal au nombre d'employés minimum requis. Il s'agit d'une contrainte de type \texttt{SUM}. +La contrainte du nombre d'employés requis s'énonce comme suit: pour chaque période $i$, le nombre d'employés travaillant doit être supérieur ou égal au nombre d'employés minimum requis. Il s'agit d'une contrainte de type \textsc{Sum}. -\begin{align*} - &\sum_{i=1}^{N} e_{i,j} \geq N_{REQUIS}(j) & \forall 1 \leq j \leq N_{PERIODE} -\end{align*} +\begin{align} + \label{eq:q2c1} + &\sum_{i=1}^{N} e_{ij} \geq e_j^{req} & \forall 1 \leq j \leq N_P +\end{align} \subsubsection{Motif de la journée de travail} \label{sec:q2automatefini} -Afin de représenter le motif correspondant à une journée de travail alternant les périodes de travail et celles de repos, on utilisera une contrainte de type \texttt{REGULAR} qui est paramétrée par un automate fini, c'est à dire une chaîne de caractère formant une expression régulière qui valide plusieurs contraintes définies par l'énoncé du problème. +Afin de représenter le motif correspondant à une journée de travail alternant les périodes de travail et celles de repos, on utilisera une contrainte de type \textsc{Regular} qui est paramétrée par un automate fini, c'est à dire une chaîne de caractère formant une expression régulière qui valide plusieurs contraintes définies par l'énoncé du problème. Dans Choco 4, la contrainte \texttt{model.regular} prend en paramètre une séquence de variables entières à valider, et un automate fini défini par la classe \texttt{FiniteAutomaton}. Pour construire une instance de cette classe, on doit construire l'expression régulière en n'utilisant que des nombres comme valeurs. Comme nous avons choisi de représenter les différents états d'un employé par une variable boolenne, cette condition est satisfaite. Voici comment nous avons construit l'expression: \begin{itemize} -\item On débute par 0 ou plusieurs périodes de repos, allant jusqu'à $MAX_{PERIODE\_REPOS}$ -\item On a ensuite une période de travail d'au moins $MIN_{PERIODE}$ et au plus $MAX_{PERIODE}$ -\item On a ensuite une pause d'une durée d'une période -\item On a ensuite une période de travail d'au moins $MIN_{PERIODE}$ et au plus $MAX_{PERIODE}$ -\item On termine par 0 ou plusieurs périodes de repos, allant jusqu'à $MAX_{PERIODE\_REPOS}$ +\item On débute par un bloc de repos d'au moins 0 et au plus $MAX_{PR}$ périodes. +\item On a ensuite un bloc de travail d'au moins $MIN_P$ et au plus $MAX_P$ périodes. +\item On a ensuite un bloc de repos d'une durée d'une période. +\item On a ensuite un bloc de travail d'au moins $MIN_P$ et au plus $MAX_P$ périodes. +\item On termine par un bloc de repos d'au moins 0 et au plus $MAX_{PR}$ périodes. \end{itemize} +On obtient ainsi un automate fini défini par l'expression régulière suivante: +\begin{align} + \label{eq:q2fa} + {FA} = &0\lbrace 0,MAX_{PR} \rbrace\\ + &1 \lbrace MIN_P,MAX_P \rbrace\nonumber\\ + &0\nonumber\\ + &1 \lbrace MIN_P,MAX_P \rbrace\nonumber\\ + &0\lbrace 0,MAX_{PR} \rbrace\nonumber +\end{align} + +L'ensemble des contraintes pour le motif d'horaire peut donc s'écrire +\begin{align} + \label{eq:q2c2} + &\textsc{Regular}(\lbrace e_{i1},\ldots,e_{ij} \rbrace, FA) &\forall 1 \leq i \leq N +\end{align} + +\subsubsection{Nombre minimum et maximum de périodes travaillées par employé} +\label{sec:q2minmax} + +On utilise une contrainte \textsc{Sum} pour appliquer le nombre de périodes minimum et maximum devant être travaillées, pour chaque employé. + +\begin{align} + \label{eq:q2c3} + &MIN_{HT} \leq \sum_{j=1}^{N_P} e_{ij} \leq MAX_{HT} & \forall 1 \leq i \leq N +\end{align} + +\subsubsection{Nombre total de contraintes} +\label{sec:q2totcontr} + +Le nombre total de contraintes pour les définitions \eqref{eq:q2c1}, \eqref{eq:q2c2} et \eqref{eq:q2c3} est: +\begin{align} + \label{eq:conttot} + N_P + N + N &= N_P + 2N \in \theta(N) +\end{align} + + + +\subsection{Optimisation} +\label{sec:q2optimisation} + + + \subsection{Paramètres} \label{sec:q2parametres}