diff --git a/Rapport_de_session/Annexe1.tex b/Rapport_de_session/Annexe1.tex index 30f377a..48a47ef 100644 --- a/Rapport_de_session/Annexe1.tex +++ b/Rapport_de_session/Annexe1.tex @@ -1,70 +1,69 @@ +\begin{landscape} \section*{Annexe 1 : Horaires initiales générées par le modèle} \label{sec:AnnexeHoraires} -\newgeometry{margin=2cm} -\begin{landscape} \begin{table}[ht] \centering - \includegraphics[width=24cm]{Tables/InitialSchedule1.png} + \includegraphics[width=25cm]{Tables/InitialSchedule1.png} \caption{Horaire initiale ayant un ratio employés temps plein / employés temps partiel de 0.11.} \label{fig:InitialSchedule1} \end{table} -\thispagestyle{empty} + \clearpage \begin{table}[ht] \centering - \includegraphics[width=24cm]{Tables/InitialSchedule2.png} + \includegraphics[width=25cm]{Tables/InitialSchedule2.png} \caption{Horaire initiale ayant un ratio employés temps plein / employés temps partiel de 0.17.} \label{fig:InitialSchedule2} \end{table} -\thispagestyle{empty} + \clearpage \begin{table}[ht] \centering - \includegraphics[width=24cm]{Tables/InitialSchedule3.png} + \includegraphics[width=25cm]{Tables/InitialSchedule3.png} \caption{Horaire initiale ayant un ratio employés temps plein / employés temps partiel de 0.22.} \label{fig:InitialSchedule3} \end{table} -\thispagestyle{empty} + \clearpage \begin{table}[ht] \centering - \includegraphics[width=24cm]{Tables/InitialSchedule4.png} + \includegraphics[width=25cm]{Tables/InitialSchedule4.png} \caption{Horaire initiale ayant un ratio employés temps plein / employés temps partiel de 0.28.} \label{fig:InitialSchedule4} \end{table} -\thispagestyle{empty} + \clearpage \begin{table}[ht] \centering - \includegraphics[width=24cm]{Tables/InitialSchedule5.png} + \includegraphics[width=25cm]{Tables/InitialSchedule5.png} \caption{Horaire initiale ayant un ratio employés temps plein / employés temps partiel de 0.33.} \label{fig:InitialSchedule5} \end{table} -\thispagestyle{empty} + \clearpage \begin{table}[ht] \centering - \includegraphics[width=24cm]{Tables/InitialSchedule6.png} + \includegraphics[width=25cm]{Tables/InitialSchedule6.png} \caption{Horaire initiale ayant un ratio employés temps plein / employés temps partiel de 0.39.} \label{fig:InitialSchedule6} \end{table} -\thispagestyle{empty} + \clearpage \begin{table}[ht] \centering - \includegraphics[width=24cm]{Tables/InitialSchedule7.png} + \includegraphics[width=25cm]{Tables/InitialSchedule7.png} \caption{Horaire initiale ayant un ratio employés temps plein / employés temps partiel de 0.44.} \label{fig:InitialSchedule7} \end{table} -\thispagestyle{empty} + \clearpage \begin{table}[ht] \centering - \includegraphics[width=24cm]{Tables/InitialSchedule8.png} + \includegraphics[width=25cm]{Tables/InitialSchedule8.png} \caption{Horaire initiale ayant un ratio employés temps plein / employés temps partiel de 0.50.} \label{fig:InitialSchedule8} \end{table} -\thispagestyle{empty} + \clearpage \end{landscape} %%% Local Variables: diff --git a/Rapport_de_session/Annexe2.tex b/Rapport_de_session/Annexe2.tex index c9efab0..869149a 100644 --- a/Rapport_de_session/Annexe2.tex +++ b/Rapport_de_session/Annexe2.tex @@ -1,16 +1,32 @@ -\section*{Annexe 2 : Pseudo-Code de l'algorithme de recouvrement des horaires} +\section*{Annexe 2 : Pseudocode de l'algorithme de recouvrement des horaires} \label{sec:AnnexePseudo} -\pagebreak -\begin{landscape} +\begin{algorithm} + \DontPrintSemicolon + \KwData{nbEmployees, maxBacktrack, nbRecoveryActions, alreadyPerformedMatrix=False, currentRecoveredSchedule, solutionFound=0} + \KwResult{currentRecoveredSchedule} + \While{$\neg$solutionFound $\wedge$ nbBacktrack $<$ maxBacktrack}{ + \If{nbAvailRecoveryActions $>$ 0}{ + Choose minimum cost recoveryAction\; + \For{Employee and Work period}{ + Perform recoveryAction on currentRecoveredSchedule\; + Mark recoveryAction as performed in alreadyPerformed matrix\; + nbRecoveryActions-1\; + } + } + \Else{ + Update currentRecoveredSchedule\; + nbBacktrack+1\; + } + \If{nbAvailRecoveryActions=0}{ + solutionFound=True\; + \If{nbBacktrack mod nbEmployees = 0}{ + initialize alreadyPerformedMatrix\; + } + } + } +\caption{Algorithme de recouvrement} +\end{algorithm} -\begin{figure}[ht] - \centering - \includegraphics[width=25cm]{Figures/psedoCodeRecouvrement.png} - \caption{Pseudo-Code de l'algorithme de recouvrement des horaires.} - \label{fig:PseudoRecouvrement} -\end{figure} - -\end{landscape} %%% Local Variables: %%% mode: latex %%% TeX-master: "rapport_de_recherche" diff --git a/Rapport_de_session/Tables/statistiques.ods b/Rapport_de_session/Tables/statistiques.ods new file mode 100644 index 0000000..380e684 Binary files /dev/null and b/Rapport_de_session/Tables/statistiques.ods differ diff --git a/Rapport_de_session/approche.tex b/Rapport_de_session/approche.tex index 5c6f98d..1f11733 100644 --- a/Rapport_de_session/approche.tex +++ b/Rapport_de_session/approche.tex @@ -2,7 +2,7 @@ \section{Approche proposée} \label{sec:approcheproposee} -Ce problème sera modélisé à l'aide de la programmation par contraintes avec un objectif d'optimisation. Les différentes étapes suivies sont présentées à la Figure \ref{fig:etapes}. Le choix de cette méthodologie est basé sur différents travaux dans le domaine de la planification \cite{easton_schedule_2005, hur_real-time_2004, mac-vicar_real-time_2017}. On développe donc un ensemble de paramètres, de variables, de contraintes ainsi qu'une fonction objectif. +Ce problème sera modélisé à l'aide de la programmation par contraintes avec un objectif d'optimisation. Les différentes étapes suivies sont présentées à la figure \ref{fig:etapes}. Le choix de cette méthodologie est basé sur différents travaux dans le domaine de la planification \cite{easton_schedule_2005, hur_real-time_2004, mac-vicar_real-time_2017}. On développe donc un ensemble de paramètres, de variables, de contraintes ainsi qu'une fonction objectif. \begin{figure}[h] \centering @@ -14,23 +14,23 @@ Ce problème sera modélisé à l'aide de la programmation par contraintes avec \subsection{Paramètres} \label{sec:approcheparametres} -La durée de l'horaire est de $J$ jours de $P$ périodes, d'une durée de $\frac{24}{P}$ heures chacunes. La demande de travail est représentée par une matrice $\mathbf{D} \in \N^{p \times j}$ où la valeur associée à 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}. +La durée de l'horaire est de $J$ jours de $P$ périodes, d'une durée d’ $\frac{24}{P}$ heures chacune. La demande de travail est représentée par une matrice $\mathbf{D} \in \N^{p \times j}$ où la valeur associée à la période $p$ de la journée $j$ est définie par la valeur $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} -On représente l'ensemble des types d'employés disponibles par $a \in \mathcal{A}$. Les employés travaillent entre $h_{min,a}$ et $h_{max,a}$ heures. On définit le nombre d'heures de repos minimal $r_{min,a}$ et le nombre maximal de journées consécutives par $j_{max,a}$. +On représente l'ensemble des types d'employés disponibles $a \in \mathcal{A}$. Les employés travaillent entre $h_{min,a}$ et $h_{max,a}$ heures. On définit le nombre d'heures de repos minimal $r_{min,a}$ et le nombre maximal de journées consécutives par $j_{max,a}$. -Le nombre d'employé est variable. En tentant de résoudre le problème de satisfiabilité avec un nombre différent d'employés de chaque type, il est possible d'estimer une borne inférieure et une borne supérieure à ce nombre. On peut toutefois borner le maximum par les ratios suivants \eqref{eq:eftept}: +Le nombre d'employés est variable. En tentant de résoudre le problème de satisfiabilité avec un nombre différent d'employés de chaque type, il est possible d'estimer une borne inférieure et une borne supérieure à ce nombre. On peut toutefois borner le maximum par les ratios suivants \eqref{eq:eftept}: \begin{align} \label{eq:eftept} E_{a} &= \frac{d_{tot}}{h_{min,a}}, &\forall a \in \mathcal{A} \end{align} -Enfin, chaque type d'employé a un salaire par période de $s_{a}$ et encourent un frais fixe de $f_{a}$. +Enfin, chaque type d'employé a un salaire par période de $s_{a}$ et encourent des frais fixes de $f_{a}$. \subsection{Variables} \label{sec:variables} @@ -43,7 +43,7 @@ On représente les horaires de travail par deux tableaux $\mathbf{X}_{FT}$ et $\ 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, a \in \mathcal{A}\nonumber \end{align} -On définit l'horaire s'appliquant à l'employé $e$ de type $a$ par $X_{e,a}$\eqref{eq:horaireemploye}. +On définit l'horaire s'appliquant à l'employé $e$ de type $a$ par la matrice $X_{e,a}$\eqref{eq:horaireemploye}. \begin{align} \label{eq:horaireemploye} X_{e,a} &= \begin{bmatrix}x_{e,1,1,a}&\cdots&x_{e,1,J,a}\\ @@ -57,7 +57,7 @@ On définit l'horaire s'appliquant à l'employé $e$ de type $a$ par $X_{e,a}$\e 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}. -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$. 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 un vecteur $\vec{H}_{a} \in \N^{J}$ de variables booliennes $h_{j}$ formant un horaire d'une durée de $J$ journées pour un employé de type $a$. 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} @@ -78,7 +78,7 @@ L'horaire doit inclure le travail durant une fin de semaine sur deux \eqref{eq:c h_{6} &= h_{7} \wedge h_{13} = h_{14} \wedge h_{6} \neq h_{13} \end{align} -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'expression régulière représentant ces horaires est représentée à 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. +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: lorsqu’ une séquence de jours dont la longueur est supérieure à $j_{max,A}$. L'expression régulière représentant ces horaires est représentée à 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] \centering @@ -118,7 +118,7 @@ Chaque horaire d'employé $X_e$ doit d'abord correspondre à un horaire valide t \subsection{Génération des scénarios de demande excédentaire} \label{sec:scenariosdemande} -Chaque valeur $d_{p,j}$ de la matrice de demande peut être augmentée par une demande excédentaire, représentée par une variable aléatoire $D_{p,j}^{(exc)}$ dont la fonction de masse de probabilité est définie par \eqref{eq:masseprobdemande}. La librairie JDistLib \cite{jdistlib} est utilisée pour générer des valeurs aléatoires de cette variable. +Chaque valeur $d_{p,j}$ de la matrice de demande peut être augmentée par une demande excédentaire, représentée par une variable aléatoire $D_{p,j}^{(exc)}$ dont la fonction de masse de probabilités est définie par \eqref{eq:masseprobdemande}. La librairie JDistLib \cite{jdistlib} est utilisée pour générer des valeurs aléatoires de cette variable. \begin{align} \label{eq:masseprobdemande} @@ -132,12 +132,12 @@ Chaque valeur $d_{p,j}$ de la matrice de demande peut être augmentée par une d On obtient alors une matrice de demande modifiée $\mathbf{D}^{\prime}$ où $d_{p,j}^{\prime}=d_{p,j}+D_{p,j}^{(exc)}$. -On pourra répéter cette procédure plusieurs fois pour générer différentes matrices de demande de travail modifiées. +On pourra répéter cette procédure pour générer différentes matrices de demande de travail modifiées. Cette approche de simulation s'inspire des travaux de \cite{walsh_stochastic_2002} sans toutefois reprendre le modèle des variables stochastiques. \subsection{Génération de scénarios d'absences} \label{sec:scenariosabsences} -On génère des scénarios d'absences $\vec{B}_{e,A}$ indépendants pour chaque employé $e$ de type $A$ \eqref{eq:scenarioabsence} à l'aide d'une chaîne de Markov sur deux états ($0$: indisponible, $1$: disponible) ayant la matrice de transition \ref{eq:matricetransition} où $p(0,0)$ correspond à la probabilité de demeurer indisponible à la période suivante et $p(1,1)$, celle de demeurer disponible. Tout comme pour la génération des scénarios d'absence, on utilise JDistLib \cite{jdistlib} pour générer aléatoirement les valeurs de transition entre chaque période. +On génère des scénarios d'absences $\vec{B}_{e,A}$ indépendants pour chaque employé $e$ de type $A$ \eqref{eq:scenarioabsence} à l'aide d'une chaine de Markov sur deux états ($0$: indisponible; $1$: disponible) ayant pour matrice de transition \ref{eq:matricetransition} où $p(0,0)$ correspond à la probabilité de demeurer indisponible à la période suivante et $p(1,1)$, celle de demeurer disponible. Tout comme pour la génération des scénarios de demande, on utilise JDistLib \cite{jdistlib} pour générer aléatoirement les valeurs de transition entre chaque période. \begin{align} \label{eq:scenarioabsence} @@ -149,7 +149,7 @@ On génère des scénarios d'absences $\vec{B}_{e,A}$ indépendants pour chaque \end{bmatrix} \end{align} -On produit ensuite une matrice de présences $\mathbf{B}_A$ à l'aide de $\vec{B}_{e,A}$. Pour produire la grille horaire du scénario d'absence $\mathbf{X}_{abs,A}$, on effectue le produit de Hadamard entre la grille initiale et cette matrice. +On produit ensuite une matrice de présences $\mathbf{B}_A$ à l'aide du vecteur $\vec{B}_{e,A}$. Pour produire la grille horaire du scénario d'absence $\mathbf{X}_{abs,A}$, on effectue le produit de Hadamard entre la grille initiale et cette matrice. \begin{align} \mathbf{B}_A &= @@ -166,18 +166,18 @@ On pourra répéter cette procédure plusieurs fois pour obtenir différents sc \subsection{Recouvrement des horaires} \label{sec:Recouvrement} -Une fois les absences et les nouveaux vecteurs de demande de travail générés dans chacune des horaires initiales, un algorithme de recouvrement local des horaires est lancé sur chacune des simulations. Celui-ci est semblable à celui utilisé dans des travaux portant sur un problème semblable \cite{hur_real-time_2004, mac-vicar_real-time_2017}. Cette étape permettra de trouver des coûts de recouvrement moyens pour chacune des horaires initiales et ainsi, trouver laquelle correspond au coût de recouvrement le plus faible. +Une fois les absences et les nouveaux vecteurs de demande de travail générés dans chacun des horaires initiaux, un algorithme de recouvrement local des horaires est lancé sur chacune des simulations. Celui-ci est semblable à celui utilisé dans des travaux portant sur un problème semblable \cite{hur_real-time_2004, mac-vicar_real-time_2017}. Cette étape permettra de trouver des couts de recouvrement moyens pour chacune des horaires initiaux et ainsi, trouver laquelle correspond au cout de recouvrement le plus faible. -Étant donné que chaque recouvrement influence les recouvrements subséquents en raison des contraintes définies à la section \ref{sec:descriptionrecouvrement}, ce problème est NP-complet. Le nombre de noeuds de l'arbre de recherche permettant de trouver le coût de recouvrement minimal varie donc de façon exponentielle avec le nombre d'absences et d'augmentation de demande de travail. Pour éviter que le temps de calcul soit trop important pour cette phase de recouvrement, une fouille partielle de l'arbre de recherche est effectuée par des «plonges» successives dans l'arbre de recherche. Le pseudo-code associé à cet algorithme est présenté à l'Annexe 2. L'algorithme de recouvrement a les caractéristiques suivantes: +Étant donné que chaque recouvrement influence les recouvrements subséquents en raison des contraintes définies à la section \ref{sec:descriptionrecouvrement}, ce problème est NP-complet. Le nombre de n{\oe}uds de l'arbre de recherche permettant de trouver le cout de recouvrement minimal varie donc de façon exponentielle avec le nombre d'absences et d'augmentation de demande de travail. Pour éviter que le temps de calcul soit trop important pour cette phase de recouvrement, une fouille partielle de l'arbre de recherche est effectuée par des «plonges» successives dans l'arbre de recherche. Le pseudocode associé à cet algorithme est présenté à l'annexe 2. L'algorithme de recouvrement a les caractéristiques suivantes: \begin{itemize} -\item Les «plonges» successives sont guidées par un heuristique qui choisit l'action de recouvrement ayant le coût minimum à chacun des noeuds. Si plusieurs actions correspondent à ce coût minimum, cette dernière est choisie de façon aléatoire, ce qui permet de mieux explorer l'arbre de recherche. +\item Les «plonges» successives sont guidées par une euristique qui choisit l'action de recouvrement ayant le cout minimum à chacun des noeuds. Si plusieurs actions correspondent à ce cout minimum, cette dernière est choisie de façon aléatoire, ce qui permet de mieux explorer l'arbre de recherche. \item Lors de ces «plonges» successives dans l'arbre de recherche, chaque action de recouvrement, caractérisée par un employé donné recouvrant à une période de travail donné, est marquée dans une matrice de noeuds visités pour éviter de refaire cette action lors d'une «plonge» subséquente. -\item Lorsqu'aucune action n'est possible sans que l'horaire ne soit complètement recouverte, on recommence une nouvelle fouille à partir du sommet de l'arbre. -\item Lorsqu'un certain nombre de retours arrières est atteint, on réinitialise la matrice des noeuds visités. L'algorithme permet aussi de s'arrêter après un nombre limite de retours arrières lorsqu'aucune solution n'est trouvée. +\item Lorsqu'aucune action n'est possible sans que l'horaire ne soit complètement recouvert, on recommence une nouvelle fouille à partir du sommet de l'arbre. +\item Lorsqu'un certain nombre de retours arrière est atteint, on réinitialise la matrice des noeuds visités. L'algorithme permet aussi de s'arrêter après un nombre limite de retours arrière lorsqu'aucune solution n'est trouvée. \end{itemize} -Bien que l'horaire de recouvrement obtenue par cet algorithme ne conduit pas au coût minimum dans tous les cas, celui-ci s'en approche. Cette façon de procéder a cependant l'avantage d'être beaucoup plus rapide qu'une fouille complète. Cela permet de compenser ce biais par rapport à l'optimalité, par un plus grand nombre de simulations effectuées. +Bien que l'horaire de recouvrement obtenu par cet algorithme ne conduit pas au cout minimum dans tous les cas, celui-ci s'en approche. Cette façon de procéder a cependant l'avantage d'être beaucoup plus rapide qu'une fouille complète. Cela permet de compenser ce biais par rapport à l'optimum, par un plus grand nombre de simulations effectuées. %%% Local Variables: %%% mode: latex diff --git a/Rapport_de_session/bibliographie.bib b/Rapport_de_session/bibliographie.bib index 536f2e1..321bb41 100644 --- a/Rapport_de_session/bibliographie.bib +++ b/Rapport_de_session/bibliographie.bib @@ -1,4 +1,3 @@ - @inproceedings{walsh_stochastic_2002, address = {Amsterdam, The Netherlands, The Netherlands}, series = {{ECAI}'02}, @@ -32,7 +31,7 @@ @article{parisio_two-stage_2015, title = {A two-stage stochastic programming approach to employee scheduling in retail outlets with uncertain demand}, - volume = {53}, + volume = 53, issn = {0305-0483}, doi = {10.1016/j.omega.2015.01.003}, abstract = {This paper describes an employee scheduling system for retail outlets; it is a constraint-based system that exploits forecasts and stochastic techniques to generate schedules meeting the demand for sales personnel. Uncertain scenarios due to fluctuating demand are taken into account to develop a stochastic operational optimization of staffing levels. Mathematically, the problem is stated as a mixed-integer linear programming problem. Simulations with store data belonging to a major Swiss retailer show the effective performance of the proposed approach. The schedule quality is assessed through comparison with a deterministic scheduling package, which has been used at several outlets in Switzerland.}, @@ -40,7 +39,7 @@ journal = {Omega}, author = {Parisio, Alessandra and Neil Jones, Colin}, month = jun, - year = {2015}, + year = 2015, keywords = {Stochastic programming, Decision making/process, Decision support systems, Integer programming, Operational/OR, Optimization, Resource management, Scheduling}, pages = {97--103} } diff --git a/Rapport_de_session/description.tex b/Rapport_de_session/description.tex index c91a9ea..bd7dc44 100644 --- a/Rapport_de_session/description.tex +++ b/Rapport_de_session/description.tex @@ -2,7 +2,7 @@ \section{Description du problème} \label{sec:description} -Nous présentons un problème de planification d'horaires de travail optimales et robustes. L'approche de modélisation proposée inclus des éléments d'incertitude au niveau de l'absentéisme des employés et de la possibilité d'un accroissement temporaire de la demande à tout instant. L'horaire optimal sélectionné doit minimiser les coûts de recouvrement des absences, en plus de permettre l'augmentation de la demande en employés tout en limitant le recours à du temps supplémentaire. Une fois que les scénarios d'incertitude sont générés, il faut effectuer un recouvrement au coût le plus faible, tout en respectant un ensemble de contraintes différent. +Nous présentons un problème de planification d'horaires de travail optimaux et robustes. L'approche de modélisation proposée inclut des éléments d'incertitude au niveau de l'absentéisme des employés et de la possibilité d'un accroissement temporaire de la demande à tout instant. L'horaire optimal sélectionné doit minimiser les couts de recouvrement des absences, en plus de permettre l'augmentation de la demande en employés tout en limitant le recours à des heures supplémentaires. Une fois que les scénarios aléatoires sont générés, il faut effectuer un recouvrement au cout le plus faible, tout en respectant un ensemble de contraintes différent. \subsection{Instance considérée} \label{sec:instanceconsideree} @@ -10,29 +10,27 @@ Nous présentons un problème de planification d'horaires de travail optimales e \subsubsection{Horaire initial} \label{sec:descriptioninitial} -On considère la planification d'un horaire de travail initial sur un cycle de 14 jours. Chaque journée est composée de six périodes de travail, d'une durée de quatre heures chacunes. Il y a deux types d'employés: des employés à temps plein ($FT$) qui travaillent 80 heures régulières par cycle et des employés à temps partiel ($PT$) qui travaillent entre 32 et 80 heures par cycle. Un niveau de demande de base est établi à deux employés pour les deux périodes de la matinée, quatre employés pour les deux périodes du milieu de la journée et trois employés pour les deux périodes de la soirée, pour la durée du cycle. +On considère la planification d'un horaire de travail initial sur un cycle de 14 jours. Chaque journée est composée de six périodes de travail, d'une durée de quatre heures chacune. Il y a deux types d'employés: à temps plein ($FT$) qui travaillent 80 heures régulières par cycle et à temps partiel ($PT$) qui travaillent entre 32 et 80 heures par cycle. Un niveau de demande de base sur deux périodes est établi à deux pour la matinée, quatre pour le milieu de la journée et trois pour la soirée, et ce pour la durée du cycle. -Tous les employés, lorsqu'ils effectuent une journée de travail. sont présents durant deux périodes consécutives, pour une durée totale de huit heures. Les employés à temps plein débutent soit à la première, la troisième ou la cinquième période. Une période de repos minimale de 12 heures est requise entre deux séquences de travail. De plus, les employés ne travaillent jamais plus de 5 journées consécutives. Les employés à temps partiel travaillent le même nombre de jours du lundi au vendredi et tous les employés travaillent une fin de semaine sur deux. Dans cette instance, il n'y a pas de nombre limite d'employés de chaque type, il sera déterminé par l'horaire initial. +Tous les employés, lorsqu'ils effectuent une journée de travail, sont présents durant deux périodes consécutives, pour une durée totale de huit heures. Les employés à temps plein débutent soit à la première, la troisième ou la cinquième période. Une période de repos minimale de 12 heures est requise entre deux séquences de travail. De plus, les employés travaillent une fin de semaine sur deux, mais jamais plus de 5 journées consécutives. Ceux à temps partiel travaillent le même nombre de jours du lundi au vendredi. -Les employés ont un salaire régulier de 10\$/h. On ajoute 1\$/h par employé à temps partiel pour compenser une plus faible productivité. Les employés à temps plein ont un salaire de 15\$/h pour les heures supplémantaires. De plus, tous les employés encourent un frais fixe de 50\$ par cycle. +Les employés ont un salaire de base de 10\$/h. On ajoute 1\$/h pour ceux à temps partiel afin de compenser une plus faible productivité. Les employés à temps plein ont un salaire de 15\$/h pour les heures supplémentaires. De plus, tous engagent des frais fixes de 50\$ par cycle. \subsubsection{Incertitude} \label{sec:descriptionincertitude} -On considère deux sources d'incertitude: les absences des employés et l'augmentation de la demande. Les employés ont une probabilité d'absence, à chaque période, variant entre $0$ et $0.1$. De plus, leur probabilité de retour à la période suivante, advenant une absence, est comprise dans l'ensemble . La probabilité associée à l'augmentation de la demande en employés est comprise dans l'ensemble $\lbrace 0, 0.25, 0.5, 0.75, 1 \rbrace$ pour un employé. On la multiplie par $0.2$ pour deux employés et $0.2^2$ pour trois employés supplémentaires. 10 scénarios d'augmentation sont générés et 100 scénarios d'absences le sont ensuite pour chacun, pour un total de 1000 simulations. +On considère deux sources d'incertitude: les absences des employés et l'accroissement de la demande. Cette approche s'inspire des travaux de \cite{parisio_two-stage_2015}. La fréquence d'absence, à chaque période, variant entre $0$ et $0.1$. De plus, leur probabilité de retour à la période suivante, advenant une absence, est comprise dans l'ensemble . La probabilité associée à l'augmentation de la demande en employés est comprise dans l'ensemble $\lbrace 0, 0.25, 0.5, 0.75, 1 \rbrace$ pour un employé. On la multiplie par 0,2 pour deux employés et 0,04 pour trois employés supplémentaires. 10 scénarios d'augmentation sont générés et 100 d'absences le sont ensuite pour chacun, pour un total de 1000 simulations. \subsubsection{Recouvrement} \label{sec:descriptionrecouvrement} -Une fois les scénarios d'incertitude générés pour chaque horaire initial, on appliquera les règles de recouvrement suivantes: +Une fois les scénarios d'incertitude générés pour chaque horaire initial, on appliquera les règles de recouvrement suivantes, en considérant des périodes de quatre heures: \begin{itemize} -\item Le nombre maximal de périodes de travail par quart de travail est de 3, ce qui équivaut à 12 h. -\item Le nombre minimum de périodes non travaillées entre les quarts de travail est de 3, ce qui équivaut à 12 h. -\item Pour chaque horaire, le nombre maximal de périodes de travail après recouvrement des employés à temps partiel est de 20, ce qui équivaut à 80 h. -\item Pour chaque horaire, le nombre maximal de périodes de travail après recouvrement des employés à temps plein est de 30, ce qui équivaut 120 h. -\item Les employés à temps partiel n'ont pas droit au temps supplémentaire lors de leur recouvrement. De plus, ces derniers ne sont pas payés en cas d'absence. -\item Les employés à temps plein ont droit au temps supplémentaire pour chaque recouvrement effectué. De plus, ces derniers sont payés au taux régulier en cas d'absence. +\item Un maximum de trois périodes par quart de travail. +\item Un minimum de trois périodes de repos entre les quarts de travail. +\item Pour chaque horaire, un maximum de 20 périodes de travail après recouvrement des employés à temps partiel et de 30, pour ceux à temps plein. +\item Les employés à temps plein ont droit aux heures supplémentaires pour chaque recouvrement effectué. De plus, ces derniers sont payés au salaire horaire de base en cas d'absence. Par contre, les employés à temps partiel n'ont pas ces deux avantages. \end{itemize} %%% Local Variables: diff --git a/Rapport_de_session/etapes.pdf b/Rapport_de_session/etapes.pdf index 0a03691..30e76e8 100644 Binary files a/Rapport_de_session/etapes.pdf and b/Rapport_de_session/etapes.pdf differ diff --git a/Rapport_de_session/experimentation.tex b/Rapport_de_session/experimentation.tex index a281f5a..55c46b0 100644 --- a/Rapport_de_session/experimentation.tex +++ b/Rapport_de_session/experimentation.tex @@ -14,7 +14,6 @@ L'instance de base pour la comparaison des différents résultats correspond au \label{fig:ModelesProposes} \end{figure} - La première approche explorée est de construire un seul modèle de programmation par contraintes pour l'ensemble du problème. Ce modèle incluait les contraintes sur les horaires ainsi que celles pour tous les types d'employés dans un seul modèle. De plus, le nombre d'employé était aussi une variable qui était modélisée en utilisant la possibilité d'inclure un horaire n'ayant aucune période de travail. Cette approche a permis de confirmer que notre problème était satisfiable, mais qu'il était difficile d'obtenir une variété de solutions, ce qui était nécessaire pour la création des scénarios. Une fonction d'optimisation a aussi été proposée, mais la formulation du problème faisait en sorte qu'il est toujours plus efficace de maximiser le nombre d'employés à temps plein. Il a donc été choisi d'instancier le nombre d'employés de chaque type manuellement, de tester la satisfiabilité de l'instance dans chaque cas et ensuite de borner le nombre d'employés de chaque type. Ce choix est devenu notre seconde approche. diff --git a/Rapport_de_session/introduction.tex b/Rapport_de_session/introduction.tex index 09551a0..3cf4d0d 100644 --- a/Rapport_de_session/introduction.tex +++ b/Rapport_de_session/introduction.tex @@ -1,9 +1,9 @@ \section{Introduction} \label{sec:Introduction} -La planification d'horaires de travail est un enjeu important pour plusieurs industries et entités gouvernementales. Une mauvaise planification des ressources en fonction de la demande de travail d'une entreprise peut entraîner une diminution des profits en plus d'avoir des répercussions sur les dates de livraison de ses différents contrats. Parmi les raisons qui rendent cette tâche difficile, il y a les restrictions complexes provenant de la loi du travail, une variabilité de la demande de travail selon les période de l'année et une incertitude liée à l'absentéisme des employés. Il devient donc important de produire des horaires de travail permettant une flexibilité d'ajustement en fonction de la demande de travail et de l'absentéisme des employés, tout en minimisant le coût des salaires. +La planification d'horaires de travail est un enjeu important pour plusieurs entreprises et organisations publiques. Si elle est inadéquate, elle peut entrainer une diminution des profits en plus d'avoir des répercussions sur les dates de livraison de ses différents contrats. Parmi les raisons qui rendent cette tâche difficile, on dénombre les restrictions complexes de la loi sur les normes du travail, une variabilité saisonnière des besoins en main-d'oeuvre et une incertitude liée au taux d'absentéisme. Les horaires produits doivent permettre le rajustement selon les deux facteurs précédents, tout en minimisant le cout des salaires. -Le présent travail propose une approche stoechastique pour la génération d'horaires de travail robustes en fonction du taux d'absentéisme et du taux d'augmentation de la demande de travail. Une banque d'horaires valides est d'abord générée avec le solveur Choco de manière efficace et en prenant soin d'obtenir des horaires avec des différences importantes quant aux types d'employés (temps plein ou temps partiel) la caractérisant. Par la suite, ces différents horaires sont soumis à des simulations durant lesquelles sont générées des absences et des augmentations ponctuelles de la demande de travail. Un algorithme de recouvrement est ensuite utilisé pour combler les différentes plages horaires en déficit de main-d'oeuvre. Les coûts de recouvrement moyens de ces différents horaires modifiés serviront à évaluer la robustesse des horaires face aux probabilités d'absentéisme et d'augmentation de la demande. Enfin, des résultats montreront que cette méthode permet d'évaluer le ratio \texttt{employés temps plein / employés temps partiel} optimal en fonction des probabilités d'absentéisme et d'augmentation de la charge de travail. +Le présent rapport propose une approche stochastique pour la production d'horaires robustes en fonction du taux d'absentéisme et de la variabilité de la demande de travail. Une banque d'horaires valides est d'abord générée avec le solveur Choco de manière efficace et en prenant soin d'obtenir des différences importantes quant aux types d'employés (temps plein ou partiel). Par la suite, ces horaires variés sont soumis à une fonction qui génère des absences et des augmentations ponctuelles de la demande de travail. On utilise ensuite un algorithme de recouvrement pour combler les différentes périodes en déficit de main-d'{\oe}uvre. Les couts de recouvrement moyens de ces différents horaires modifiés serviront à évaluer la robustesse des horaires face aux probabilités d'absentéisme et d'augmentation de la demande. Enfin, des résultats montreront que cette méthode permet d'évaluer le ratio \texttt{temps plein / temps partiel} optimal en fonction de ces facteurs. %%% Local Variables: %%% mode: latex diff --git a/Rapport_de_session/rapport_de_recherche.pdf b/Rapport_de_session/rapport_de_recherche.pdf index 1e06678..dc0fe52 100644 Binary files a/Rapport_de_session/rapport_de_recherche.pdf and b/Rapport_de_session/rapport_de_recherche.pdf differ diff --git a/Rapport_de_session/rapport_de_recherche.tex b/Rapport_de_session/rapport_de_recherche.tex index 1412bbc..da45560 100644 --- a/Rapport_de_session/rapport_de_recherche.tex +++ b/Rapport_de_session/rapport_de_recherche.tex @@ -5,6 +5,7 @@ \usepackage[T1]{fontenc} % Précise la façon dont le document actuel est encodé \usepackage{setspace} \usepackage{datetime} +\usepackage[ruled,vlined,french]{algorithm2e} \usepackage[margin=2.5cm]{geometry} % Précise les marges du document \title{IFT-7020 Optimisation combinatoire - Rapport de recherche\\Session d'hiver 2018}% N'affecte pas la page titre, mais défini le nom de votre projet \author{François Bérubé et François Pelletier} % N'affecte pas la page titre, mais défini le nom de l'auteur(e) du projet @@ -43,7 +44,7 @@ \newtheorem{definition}{Définition} \usepackage{array} \usepackage{float} -\usepackage{lscape} +\usepackage{pdflscape} \usepackage{enumerate} % Pour mieux gérer la commande enumerate dans les sections \usepackage{graphicx} % Pour inclure des images \usepackage{color} % Pour inclure du texte en couleur