diff --git a/Rapport_de_session/experimentation.tex b/Rapport_de_session/experimentation.tex index cf49ee1..0520863 100644 --- a/Rapport_de_session/experimentation.tex +++ b/Rapport_de_session/experimentation.tex @@ -1,4 +1,18 @@ +\section{Démarche expérimentale} +\label{sec:demarcheexp} + +\subsection{Production des horaires initiales} +\label{sec:demarchehorairesinit} + +Une première approche pour la création des horaires initiaux fut de rassembler l'ensemble des contraintes pour la construction des horaires valides dans un seul modèle de programmation par contraintes. Seulement les horaires potentiels pour les employés à temps plein ont été encodés dans un tableau. Rapidement, nous avons conclu qu'il sera difficile d'obtenir plus d'une solution au modèle dans un temps raisonnable. Le tableau des horaires potentiels serait donc énuméré en utilisant deux programmes de contraintes, un pour chaque type d'employé. + +L'utilisation de différentes heuristiques de recherche a été explorée sommairement, mais la construction d'un vecteur contenant toutes les variables du problème étant une condition nécessaire pour l'appel d'heuristiques dans le solveur Choco, il s'est avéré difficile de mettre en oeuvre cette exploration. Il a donc été décidé de conserver l'heuristique de recherche par défaut de Choco. + +Cependant, afin d'obtenir un nombre de solutions suffisamment différentes pour effectuer des simulation et pouvoir comparer différents scénarios, il n'était pas possible d'utiliser ce programme, qui retournait un grand nombre de solutions très similaires. L'optimisation s'effectuera donc en deux étapes et de façon itérative. Les explorations précédentes nous permettent de fixer le nombre d'employés à temps plein et à temps partiel dans un intervalle restreint. Il est ainsi possible de fixer le nombre d'employés de chaque type et d'exécuter le programme d'optimisation avec ces nouvelles contraintes. Des solutions variées ont ainsi pu être obtenues, permettant la suite du processus de création d'horaires optimales et robustes. + + + %%% Local Variables: %%% mode: latex %%% TeX-master: "rapport_de_recherche" diff --git a/Rapport_de_session/modelisation.tex b/Rapport_de_session/modelisation.tex index 4406a65..5d57bf4 100644 --- a/Rapport_de_session/modelisation.tex +++ b/Rapport_de_session/modelisation.tex @@ -2,23 +2,24 @@ \section{Modélisation} \label{sec:modelisation} -%% TODO INTRODUIRE LA SECTION +Ce problème sera modélisé à l'aide de la programmation par contraintes avec un objectif d'optimisation. Le choix de cette méthodologie poursuit les différents travaux dans le domaine de la planification. On développe un ensemble de paramètres, de variables, de contraintes ainsi qu'une fonction objectif. \subsection{Paramètres} \label{sec:parametres} -\subsubsection{Horaire de travail et demande} -\label{sec:horairedemande} - -Nous considérons une planification d'horaires de travail d'une durée de $J$ jours. Chaque journée est composée de $P$ périodes de travail, d'une durée de $\frac{24}{P}$ heures chacunes. La demande de travail pour la période $p$ de la journée $j$ est définie par $d_{p,j}$. La demande totale pour la durée de l'horaire de travail est définie par l'équation \eqref{eq:dtot}. +On considère une planification d'horaires de travail d'une durée de $J=14$ jours. Chaque journée est composée de $P=6$ périodes de travail, d'une durée de $\frac{24}{P}=4$ heures chacunes. La demande de travail pour la période $p$ de la journée $j$ est définie par $d_{p,j}$. La demande totale pour la durée de l'horaire de travail est définie par l'équation \eqref{eq:dtot}. \begin{align} \label{eq:dtot} D^{TOT} = \sum_{p=1}^{P} \sum_{j=1}^{J} d_{p,j} \end{align} -\subsubsection{Employés} -\label{sec:modeleemployes} +La demande de travail pour ces périodes est définie par le vecteur \eqref{eq:demandeinstance}. + +\begin{align} + \label{eq:demandeinstance} + \vec{d}_{p,\cdot} &= \begin{bmatrix}2&2&4&4&3&3\end{bmatrix} &\forall j \in \left[ 1,j \right] +\end{align} Notre modèle considère deux types $A$ d'employés: les employés à temps plein et les employés à temps partiel \eqref{typeemployes}. @@ -27,11 +28,11 @@ Notre modèle considère deux types $A$ d'employés: les employés à temps plei A \in \lbrace FT,PT \rbrace \end{align} -Ils travaillent des périodes consécutives d'une durée $i_{A}$ heures. L'intervalle de travail des employés à temps plein doit cependant débuter à la première, troisième ou cinquième période. On définit aussi un nombre d'heures de repos minimal $r_{min,A}$ entre les périodes travaillées. Les employés à temps plein travaillent $h_{reg}^{FT}$ heures par période de deux semaines et les employés à temps partiel travaillent entre $h_{min}^{PT}$ et $h_{max}^{PT}$ heures durant cette même période. Les employés ne travaillent pas plus que $j_{max,A}$ journées consécutives. Le nombre d'employés $E$ de chaque type est variable et sera déterminé par les ratios \eqref{eq:eftept}: +Ils travaillent des périodes consécutives d'une durée de 8 heures. L'intervalle de travail des employés à temps plein doit cependant débuter à la première, troisième ou cinquième période. On définit aussi un nombre d'heures de repos minimal $r_{min,A}$ entre les périodes travaillées. Les employés à temps plein travaillent $h_{reg,FT}=80$ heures par période de deux semaines et les employés à temps partiel travaillent entre $h_{min,PT}=32$ et $h_{max,PT}=64$ heures durant cette même période. Les employés ne travaillent pas plus que $j_{max,A}$ journées consécutives. Le nombre d'employés $E$ de chaque type est variable et leur maximum sera déterminé par les ratios \eqref{eq:eftept}: \begin{align} \label{eq:eftept} - E_{A} &= \frac{D^{TOT}}{h_{reg,A}}, &\forall A + E_{FT} &= \frac{D^{TOT}}{h_{reg,FT}}, E_{PT} = \frac{D^{TOT}}{h_{min,PT}} \end{align} Les employés ont respectivement un salaire par période de $s_{A}$ et encourent un frais fixe de $f_{A}$ pour la durée de l'horaire. Afin de représenter une plus faible productivité des employés à temps partiel, on pourra majorer artificiellement leur salaire horaire. @@ -47,23 +48,21 @@ On représente les horaires de travail par deux tableaux de variables booliennes dom(x_{e,j,p,A}) &= \lbrace 0,1 \rbrace &\forall 1 \leq e \leq E_{A}, 1 \leq j \leq J, 1 \leq p \leq P\nonumber \end{align} +On définit l'horaire s'appliquant à l'employé $e$ par $X_e$\eqref{eq:horaireemploye}. +\begin{align} + \label{eq:horaireemploye} + X_e &= \begin{bmatrix}x_{e,1,1}&\cdots&x_{e,1,J}\\ + \vdots&\ddots&\vdots\\ + x_{e,P,1}&\cdots&x_{e,P,J} + \end{bmatrix}\\ +\end{align} + \subsection{Énumération des horaires valides} \label{sec:horairesvalides} Afin de réduire la taille du problème, la liste des horaires quotidiens valides pour un employé est générée, pour chaque type d'employés. Il s'agit de deux sous-problèmes de satisfaction pouvant aussi être résolus avec le solveur Choco \cite{choco}. L'énumération de toutes les solutions obtenues sera ensuite utilisée pour générer l'ensemble des tuples d'une contrainte \textsc{Tableau}. -\subsubsection{Paramètres} -\label{sec:horairesparametres} - -\subsubsection{Variables} -\label{sec:horairesvariables} - -On définit $\vec{H}_{A} \in \N^{J}$, un vecteur de variables booléennes $h_{j}$ formant un horaire d'une durée de $J$ journées pour un employé de type $A \in \lbrace FT, PT \rbrace$. - -\subsubsection{Contraintes} -\label{sec:horairescontraintes} - -L'horaire doit respecter le nombre de périodes travaillées sur la durée totale de l'horaire \eqref{eq:contrnbpertravaillees}. +On définit $\vec{H}_{A} \in \N^{J}$, un vecteur de variables booléennes $h_{j}$ formant un horaire d'une durée de $J$ journées pour un employé de type $A \in \lbrace FT, PT \rbrace$. L'horaire doit respecter le nombre de périodes travaillées sur la durée totale de l'horaire \eqref{eq:contrnbpertravaillees}. \begin{align} \label{eq:contrnbpertravaillees} @@ -86,28 +85,23 @@ L'horaire doit inclure le travail durant une fin de semaine sur deux \eqref{eq:c L'horaire doit respecter le nombre maximum de jours consécutifs travaillés autorisés. On utilise une contrainte \textsc{Regular} \guillemotleft réifiée \guillemotright pour représenter le non-respect de cette contrainte, c'est-à-dire lorsque qu'on retrouve une séquence de jours consécutifs dont la longueur est supérieure à $j_{max,A}$. L'automate fini pour cette contrainte lorsque $j_{max,A}=4$ est représenté à la Figure \ref{fig:automatemaxconsecutif}. -\begin{figure}[ht] +\begin{figure}[!ht] \centering \includegraphics[width=15cm]{maxconsecutif} \caption{Automate fini d'un horaire où $j_{max,A} \leq 4$ n'est pas respecté} \label{fig:automatemaxconsecutif} \end{figure} - - L'expression régulière représentant cet automate est représenté à la Figure \ref{fig:regexpautomate}. On obtient, pour chaque type de travailleur, une liste de vecteurs à laquelle on ajouter le vecteur nul, représentant la situation où l'employé est exclus de l'horaire. -\begin{figure}[ht] +\begin{figure}[!ht] \centering \fbox{\texttt{[01]*1\{5,\}[01]*}} \caption{Expression régulière représentant l'automate fini} \label{fig:regexpautomate} \end{figure} -\subsubsection{Ajout des périodes} -\label{sec:horaireajoutperiode} - -On considère la matrice des horaires quinzomadaires valides \eqref{eq:horairejourvalide} et la matrice des $n_{hq,A}$ horaires quotidiens valides \eqref{eq:horairequotidienvalide}, on obtient un tableau d'horaires par périodes travaillées valides $\mathbf{V}_A \in \N^{3}$ par le produit tensoriel \eqref{eq:produithoraire} +Enfin, en effectuant le produit tensoriel de la matrice des horaires quinzomadaires valides $h_{reg,FT}$ \eqref{eq:horairejourvalide} et de la matrice des $n_{hq,A}$ horaires quotidiens valides \eqref{eq:horairequotidienvalide}, on obtient un tableau d'horaires par périodes travaillées valides $\mathbf{V}_A \in \N^{3}$ \eqref{eq:produithoraire}. \begin{align} \label{eq:horairejourvalide} \mathbf{H}_A &= \left( \vec{H}_{A} \right)\\ @@ -124,29 +118,15 @@ On considère la matrice des horaires quinzomadaires valides \eqref{eq:horairejo \subsection{Contraintes} \label{sec:contraintes} -Chaque horaire d'employé $X_e$ doit d'abord correspondre à un horaire valide tel qu'établi à la section \ref{sec:horairesvalides}. Il doit donc satisfaire une contrainte \textsc{Tableau} \eqref{eq:contraintetableau}. - +Chaque horaire d'employé $X_e$ doit d'abord correspondre à un horaire valide tel qu'établi à la section \ref{sec:horairesvalides}. Il doit donc satisfaire une contrainte \textsc{Tableau} \eqref{eq:contraintetableau}. La planification doit aussi satisfaire la demande en employés, en utilisant une contrainte \textsc{Sum} \eqref{eq:contrsumemployes}. Afin de réduire la taille de l'arbre de recherche, nous imposons la contrainte de bris de symétrie suivante: les horaires des employés à temps plein, de même que les horaires des employés à temps partiel, doivent être dans un ordre lexicographique. On utilise alors la contrainte \textsc{LexLessEq} \eqref{eq:lex}. \begin{align} - X_e &= \begin{bmatrix}x_{e,1,1}&\cdots&x_{e,1,J}\\ - \vdots&\ddots&\vdots\\ - x_{e,P,1}&\cdots&x_{e,P,J} - \end{bmatrix}\\ \label{eq:contraintetableau} \mathcal{C}_1 &: \textsc{Tableau}\left( \mathbf{V}_A, - X_e \right) & \forall e -\end{align} - -La planification doit aussi satisfaire la demande en employés, en utilisant une contrainte \textsc{Sum} \eqref{eq:contrsumemployes}. - -\begin{align} + X_e \right) & \forall e\\ \label{eq:contrsumemployes} - \mathcal{C}_2 &: \sum_{A}\sum_{e=1}^{E_A} x_{e,p,j} = d_{p,j} & \forall 1 \leq p \leq P, 1 \leq j \leq J -\end{align} - -Afin de réduire la taille de l'arbre de recherche, nous imposons la contrainte de bris de symétrie suivante: les horaires des employés à temps plein, de même que les horaires des employés à temps partiel, doivent être dans un ordre lexicographique \eqref{eq:lex}. -\begin{align} + \mathcal{C}_2 &: \sum_{A}\sum_{e=1}^{E_A} x_{e,p,j} = d_{p,j} & \forall 1 \leq p \leq P, 1 \leq j \leq J\\ \label{eq:lex} - X_i &\leq X_{i+1} &\forall i \in [1,E^A],A + \mathcal{C}_3 &: \textsc{LexLessEq}(X_i,X_{i+1}) &\forall i \in [1,E^A-1],A \end{align} \subsection{Fonction objectif} @@ -160,10 +140,6 @@ La fonction objectif \eqref{eq:fonctionobjectif} que nous désirons minimiser es \end{align} - - - - %%% Local Variables: %%% mode: latex %%% TeX-master: "rapport_de_recherche" diff --git a/Rapport_de_session/rapport_de_recherche.pdf b/Rapport_de_session/rapport_de_recherche.pdf index 4c9a8b8..b20e8d2 100644 Binary files a/Rapport_de_session/rapport_de_recherche.pdf and b/Rapport_de_session/rapport_de_recherche.pdf differ