diff --git a/Rapport_de_session/Annexe2.tex b/Rapport_de_session/Annexe2.tex new file mode 100644 index 0000000..ac3b18f --- /dev/null +++ b/Rapport_de_session/Annexe2.tex @@ -0,0 +1,19 @@ + +\section{Annexe 2 : Pseudo-Code de l'algorithme de recouvrement des horaires} +\label{sec:AnnexePseudo} +\pagebreak +\begin{landscape} + +\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" +%%% End: + diff --git a/Rapport_de_session/Figures/Résultats.xlsx b/Rapport_de_session/Figures/Résultats.xlsx index a6b50f7..557b0d7 100644 Binary files a/Rapport_de_session/Figures/Résultats.xlsx and b/Rapport_de_session/Figures/Résultats.xlsx differ diff --git a/Rapport_de_session/Figures/modelesProposes.png b/Rapport_de_session/Figures/modelesProposes.png new file mode 100644 index 0000000..4256ce7 Binary files /dev/null and b/Rapport_de_session/Figures/modelesProposes.png differ diff --git a/Rapport_de_session/Figures/psedoCodeRecouvrement.png b/Rapport_de_session/Figures/psedoCodeRecouvrement.png new file mode 100644 index 0000000..4ce3d39 Binary files /dev/null and b/Rapport_de_session/Figures/psedoCodeRecouvrement.png differ diff --git a/Rapport_de_session/Figures/pseudo-code.pptx b/Rapport_de_session/Figures/pseudo-code.pptx new file mode 100644 index 0000000..e2be6a0 Binary files /dev/null and b/Rapport_de_session/Figures/pseudo-code.pptx differ diff --git a/Rapport_de_session/Figures/type de modèles.pptx b/Rapport_de_session/Figures/type de modèles.pptx new file mode 100644 index 0000000..6a93f4b Binary files /dev/null and b/Rapport_de_session/Figures/type de modèles.pptx differ diff --git a/Rapport_de_session/approche.tex b/Rapport_de_session/approche.tex index 6130b59..9e74101 100644 --- a/Rapport_de_session/approche.tex +++ b/Rapport_de_session/approche.tex @@ -2,7 +2,14 @@ \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. Le choix de cette méthodologie poursuit les différents travaux dans le domaine de la planification. 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 + \label{fig:etapes} + \includegraphics[]{etapes} + \caption{Étapes de la production d'horaires optimaux et robustes. **** J'ai modié le .dot, il faudrait le regénérer. Aussi, J'enlèverais la première étape, car elle est incluse dans l'étape 2.*****} +\end{figure} \subsection{Paramètres} \label{sec:approcheparametres} @@ -71,21 +78,12 @@ 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'automate fini pour cette contrainte lorsque $j_{max,A}=4$ est représenté à la Figure \ref{fig:automatemaxconsecutif}. - -\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. +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. \begin{figure}[!ht] \centering \fbox{\texttt{[01]*1\{5,\}[01]*}} - \caption{Expression régulière représentant l'automate fini} + \caption{Expression régulière représentant l'horaire des employés.} \label{fig:regexpautomate} \end{figure} @@ -117,25 +115,25 @@ Chaque horaire d'employé $X_e$ doit d'abord correspondre à un horaire valide t \mathcal{C}_3 &: \textsc{LexLessEq}(X_i,X_{i+1}), &\forall i \in [1,E^A-1],A \end{align} -\subsection{Fonction objectif} -\label{sec:fonctionobjectif} - -La fonction objectif \eqref{eq:fonctionobjectif} que nous désirons minimiser est le coût total des employés, ce qui équivaut à la somme des salaires et des coûts fixes pour chaque type d'employé. - -\begin{align} -\label{eq:fonctionobjectif} - \argmin_{\mathbf{X}} \sum_A \left(s_A\sum_{e=1}^{E_A} \sum_{p=1}^{P} \sum_{j=1}^J x_{e,p,j} + f_A \sum_{e=1}^{E_A} \left[{\sum_{p=1}^{P} \sum_{j=1}^J x_{e,p,j} > 0}\right] \right) -\end{align} - \subsection{Génération des scénarios de demande excédentaire} \label{sec:scenariosdemande} +Chaque période de travail est caractérisée par une demande de travail qui se traduit en un nombre d'employés qui travaille durant cette période. Ainsi, le vecteur de demande de travail VDT est un vecteur de dimension 1xJ qui est défini initialement pour permettre la production d'horaires initiaux valides. Durant l'étape de génération des scénarios de demande excédentaire, ce vecteur est modifié de la façon suivante en fonction d'une probailité d'augmentation de la demande de travail. La librairie JDistLib \cite{jdistlib} est utilisée pour générer des augmentations de la demande de travail de façon aléatoire. +Soit p la probabilité d'augmentation de la demande de travail. Pour chaque période de travail j, on a : + +\begin{itemize} +\item Une probabilité p d'avoir une augmentation de la demande de travail de 1 unité ($VDT_{j}$ += 1). +\item Une probabilité p/5 d'avoir une augmentation de la demande de travail de 2 unité ($VDT_{j}$ += 2). +\item Une probabilité p/25 d'avoir une augmentation de la demande de travail de 3 unité ($VDT_{j}$ += 3). +\end{itemize} + +On pourra répéter cette procédure plusieurs fois pour générer différents vecteurs de demande de travail modifiés. \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. 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 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. \begin{align} \label{eq:scenarioabsence} @@ -164,22 +162,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 générées dans chacune des horaires initiales, un algorithme de recouvrement des horaires est lancé sur chacune des simulations d'absence. Cette étape permettra de trouver des coûts de recouvrement moyens pour chancune des horaires initiales pour 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 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. -Étant donné que chaque recouvrement influence les recouvrements subséquents en raison de ces contraintes, 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. 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 fouilles en profondeur successives. 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 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: \begin{itemize} -\item Les fouilles en profondeur sont guidées par un heuristique basé sur le coût minimum des actions de recouvrement possibles à chacun des noeuds. Si plusieurs actions correspondent à ce coût minimum, cette dernière est choisie de façon aléatoire. -\item Lors de ces fouilles en profondeur, 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 afin de ne pas répéter la même fouille 2 fois. +\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 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 peut aussi s'arrêter après un nombre limite de retours arrières lorsqu'aucune solution n'est trouvée. +\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. \end{itemize} -Ainsi, l'horaire de recouvrement obtenue par cet algorithme ne conduit pas au coût minimum dans tous les cas, mais s'approche de ce dernier. Cette façon de procéder a cependant l'avantage d'être extrêmement rapide et permet de compenser ce biais par rapport à l'optimalité, par un plus grand nombre de simulations effectuées. - - - - +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. %%% Local Variables: %%% mode: latex diff --git a/Rapport_de_session/bibliographie.bib b/Rapport_de_session/bibliographie.bib index 3ffe01f..536f2e1 100644 --- a/Rapport_de_session/bibliographie.bib +++ b/Rapport_de_session/bibliographie.bib @@ -11,15 +11,13 @@ publisher = {IOS Press}, author = {Walsh, Toby}, year = {2002}, - pages = {111--115}, - file = {FS01-04-020.pdf:/home/francois/Zotero/storage/Y6SRJRY9/FS01-04-020.pdf:application/pdf} + pages = {111--115} } @article{chapados_retail_2014, title = {Retail store scheduling for profit}, volume = {239}, issn = {0377-2217}, - url = {http://www.sciencedirect.com/science/article/pii/S0377221714004561}, doi = {10.1016/j.ejor.2014.05.033}, abstract = {In spite of its tremendous economic significance, the problem of sales staff schedule optimization for retail stores has received relatively scant attention. Current approaches typically attempt to minimize payroll costs by closely fitting a staffing curve derived from exogenous sales forecasts, oblivious to the ability of additional staff to (sometimes) positively impact sales. In contrast, this paper frames the retail scheduling problem in terms of operating profit maximization, explicitly recognizing the dual role of sales employees as sources of revenues as well as generators of operating costs. We introduce a flexible stochastic model of retail store sales, estimated from store-specific historical data, that can account for the impact of all known sales drivers, including the number of scheduled staff, and provide an accurate sales forecast at a high intra-day resolution. We also present solution techniques based on mixed-integer (MIP) and constraint programming (CP) to efficiently solve the complex mixed integer non-linear scheduling (MINLP) problem with a profit-maximization objective. The proposed approach allows solving full weekly schedules to optimality, or near-optimality with a very small gap. On a case-study with a medium-sized retail chain, this integrated forecasting–scheduling methodology yields significant projected net profit increases on the order of 2–3\% compared to baseline schedules.}, number = {3}, @@ -29,15 +27,13 @@ month = dec, year = {2014}, keywords = {Constraint programming, Mixed integer programming, Retail, Shift scheduling, Statistical forecasting}, - pages = {609--624}, - file = {1-s2.0-S0377221714004561-main.pdf:/home/francois/Zotero/storage/6NFQP2JJ/1-s2.0-S0377221714004561-main.pdf:application/pdf} + pages = {609--624} } @article{parisio_two-stage_2015, title = {A two-stage stochastic programming approach to employee scheduling in retail outlets with uncertain demand}, volume = {53}, issn = {0305-0483}, - url = {http://www.sciencedirect.com/science/article/pii/S0305048315000055}, 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.}, urldate = {2018-02-24}, @@ -46,8 +42,50 @@ month = jun, year = {2015}, keywords = {Stochastic programming, Decision making/process, Decision support systems, Integer programming, Operational/OR, Optimization, Resource management, Scheduling}, - pages = {97--103}, - file = {parisio2015.pdf:/home/francois/Zotero/storage/K8B6NYRM/parisio2015.pdf:application/pdf} + pages = {97--103} +} + +@article{easton_schedule_2005, + title = {Schedule Recovery: Unplanned Absences in Service Operations*}, + volume = {36}, + issn = {0011-7315}, + doi = {10.1111/j.1540-5414.2005.00080.x}, + pages = {459--488}, + number = {3}, + journaltitle = {Decision Sciences}, + eprinttype = {jstor}, + eprint = {wj10.1111/j.1540-5414.2005.00080.x}, + author = {Easton, Fred F. and Goodale, John C.}, + date = {2005}, + keywords = {Labor And Staff Planning, Mathematical Programming/Optimization, Service Operations, Staff Planning, Workforce Scheduling} +} + +@article{hur_real-time_2004, + title = {Real-Time Work Schedule Adjustment Decisions: An Investigation and Evaluation}, + volume = {13}, + issn = {10591478}, + pages = {322--339}, + number = {4}, + journaltitle = {Production and Operations Management}, + eprinttype = {jstor}, + eprint = {proquest228763117}, + author = {Hur, Daesik and Mabert, Vincent and Bretthauer, Kurt}, + date = {2004}, + keywords = {Scheduling, 2600, 6100, 9130, Experimental/Theoretical, Goal Programming, Heuristic, Human Resource Planning, Management Science/Operations Research, Operations Research, Simulation, Workforce Planning} +} + +@article{mac-vicar_real-time_2017, + title = {Real-time recovering strategies on personnel scheduling in the retail industry}, + volume = {113}, + issn = {03608352}, + doi = {10.1016/j.cie.2017.09.045}, + pages = {589--601}, + journaltitle = {Computers \& Industrial Engineering}, + eprinttype = {jstor}, + eprint = {sciversesciencedirect\_elsevierS0360-8352(17)30461-8}, + author = {Mac-Vicar, Michael and Ferrer, Juan Carlos and Muñoz, Juan Carlos and Henao, César Augusto}, + date = {2017}, + keywords = {Labor Contingency, Multiskilling, Personnel Scheduling, Real-Time Adjustment, Retail Services, Workforce Flexibility} } @manual{choco, diff --git a/Rapport_de_session/conclusion.tex b/Rapport_de_session/conclusion.tex index 4956bd9..91b7016 100644 --- a/Rapport_de_session/conclusion.tex +++ b/Rapport_de_session/conclusion.tex @@ -2,6 +2,10 @@ \section{Conclusion} \label{sec:conclusion} +En conclusion, une approche stoechastique a été proposée pour la production d'horaires de travail optimaux. Par rapport à d'autres travaux portant sur un problème semblable, cette étude inclut l'élaboration d'un modèle avec une résolution en deux étapes qui s'est avéré efficace pour la production d'une banque d'horaires avec des ratios de type d'employés différents. Cette banque d'horaires a par la suite été soumise à des simulations, impliquant la génération d'absences et la modification de la demande de travail par une approche probabiliste. Enfin, un algorithme a été utilisé, sur chacune des horaires simulés, afin d'évaluer le coût associé à leur recouvrement. En générant un grand nombre de simulations et en calculant la moyenne des coûts de recouvrement, il a été possible d'évaluer précisément la robustesse des différents horaires face à l'absentéisme et aux variations de la demande de travail. De plus, l'approche proposée permet une grande flexibilité quant au type d'horaires produits et pourrait être adaptée à d'autres impondérables auxquels font face les entreprises. + +Quelques améliorations pourraient être apportées à l'approche actuelles. Tout d'abord, le principe de production d'horaires initiales en deux étapes aurait pu être étendu pour permettre la production d'horaires ayant des nombres d'employés différents. En effet, il aurait été intéressant de définir d'autres classes d'employés à temps partiel basées sur leur nombre d'heures travaillées (2, 3 ou 4). Ainsi, en ajoutant une étape intermédiaire pour définir un certain nombre d'employés provenant de ces différentes classes, il aurait été possible de jouer sur le nombre d'employés actifs tout en diminuant les tailles des instances à traiter par le solveur. Une autre limitation de cette étude est qu'elle ne prend pas en considération les effets négatifs de changements excessifs aux horaires de travail des différents employés. Ces effets négatifs aurait pu être traduits en coût et ajoutés au calcul du coût de recouvrement. Enfin, les valeurs de certains paramètres de cette étude sont fictifs et auraient pu être basés sur des études de cas réels. + %%% Local Variables: %%% mode: latex diff --git a/Rapport_de_session/description.tex b/Rapport_de_session/description.tex index 33ba45e..9294b2e 100644 --- a/Rapport_de_session/description.tex +++ b/Rapport_de_session/description.tex @@ -29,13 +29,12 @@ Une fois les scénarios d'incertitude générés pour chaque horaire initial, on \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 16, ce qui équivaut à 64 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. \end{itemize} - %%% Local Variables: %%% mode: latex %%% TeX-master: "rapport_de_recherche" diff --git a/Rapport_de_session/discussion.tex b/Rapport_de_session/discussion.tex deleted file mode 100644 index bbcf260..0000000 --- a/Rapport_de_session/discussion.tex +++ /dev/null @@ -1,10 +0,0 @@ - -\section{Discussion} -\label{sec:discussion} - - - -%%% Local Variables: -%%% mode: latex -%%% TeX-master: "rapport_de_recherche" -%%% End: diff --git a/Rapport_de_session/etapes.dot b/Rapport_de_session/etapes.dot index 97540d9..12374db 100644 --- a/Rapport_de_session/etapes.dot +++ b/Rapport_de_session/etapes.dot @@ -3,13 +3,14 @@ digraph etapes { graph [splines=false]; node[fontsize=10, color=black, shape=box, width=3, height=0.5]; - a[label="Générer les tableaux\nd'horaires valides"]; - b1[label="Générer les horaires initiales"]; - b2[label="Calculer le coût initial"]; - c1[label="Générer les scénarios d'absences"]; - c2[label="Calculer le coût\ndes absences"]; - d1[label="Générer les horaires\nde recouvrement optimales"]; - d2[label="Calculer le coût\nde recouvrement moyen"]; + a[label="Générer les tableaux\n d'horaires valides"]; + b1[label="Générer les horaires initiaux"]; + b2[label="Générer les scénarios d'absences et\n d'augmentation de la demande de travail"]; + c1[label="Générer les horaires\nde recouvrement optimales"]; + c2[label="Calculer le coût de recouvrement\n des horaires modifiés"]; + d1[label="Calculer le coût de recouvrement\n moyen pour chaque horaire initial"]; + d2[label="Déterminer les horaires optimaux \n basé sur le coût de recouvrement moyen"]; + {a -> b1}; {rank=same;b1 -> b2}; diff --git a/Rapport_de_session/experimentation.tex b/Rapport_de_session/experimentation.tex index 3f223f9..3572b75 100644 --- a/Rapport_de_session/experimentation.tex +++ b/Rapport_de_session/experimentation.tex @@ -7,6 +7,13 @@ L'instance de base pour la comparaison des différents résultats correspond au problème de satisfiabilité des contraintes de l'horaire initial. +\begin{figure}[ht] + \centering + \includegraphics[width=15cm]{Figures/modelesProposes.png} + \caption{Modèles proposés pour la génération des horaires initiaux.} + \label{fig:ModelesProposes} +\end{figure} + 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. diff --git a/Rapport_de_session/introduction.tex b/Rapport_de_session/introduction.tex index 1312ced..2958ff4 100644 --- a/Rapport_de_session/introduction.tex +++ b/Rapport_de_session/introduction.tex @@ -3,14 +3,7 @@ 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. -Le présent travail propose une approche pour la génération d'horaires de travail optimales et robustes en fonction du taux d'absentéisme et du taux d'augmentation de la demande de travail. Les différentes étapes suivies sont présentées à la Figure \ref{fig:etapes}. - -\begin{figure}[h] - \centering - \label{fig:etapes} - \includegraphics[]{etapes} - \caption{Étapes de la production d'horaires optimales et robustes} -\end{figure} +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 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. %%% Local Variables: %%% mode: latex diff --git a/Rapport_de_session/rapport_de_recherche.pdf b/Rapport_de_session/rapport_de_recherche.pdf index 926ab74..aa04d50 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 a04fea4..cf4902b 100644 --- a/Rapport_de_session/rapport_de_recherche.tex +++ b/Rapport_de_session/rapport_de_recherche.tex @@ -68,18 +68,22 @@ \listoffigures \newpage \listoftables +\newpage % Le package newclude mis en commentaire permet d'introduire une * pour éviter le saut de page entre les section -\include{introduction} -\include{description} -\include{approche} -\include{experimentation} -\include{resultats} -\include{discussion} -\include{conclusion} +\input{introduction} +\input{description} +\input{approche} +\input{experimentation} +\input{resultatsetdiscussion} +\input{conclusion} +\newpage \bibliography{bibliographie} -\include{Annexe1} +\newpage +\input{Annexe1} +\newpage +\input{Annexe2} \end{document} %%% Local Variables: diff --git a/Rapport_de_session/resultats.tex b/Rapport_de_session/resultats.tex deleted file mode 100644 index 2c993fe..0000000 --- a/Rapport_de_session/resultats.tex +++ /dev/null @@ -1,29 +0,0 @@ -\section{Résultats} -\label{sec:RésultatsDiscussion} - -\subsection{Comparaison des modèles proposés} - -\subsection{Résultats de l'étude de cas} -À l'aide du modèle de génération d'horaires en 2 phases, 8 horaires présentant des ratios employés temps plein / employés temps partiel différents ont été obtenus (voir Annexe 1). Puisque les 2 types d'employés ont des contraintes différentes quant au recouvrement de ces derniers, il a été possible de tester l'effet du taux d'absentéisme et de l'augmentation de la demande. L'effet de ces 2 paramètres sur le coût de recouvrement des 8 horaires sont présentés au Tableau \ref{table:TableauEffetsParametres}. Ces coûts de recouvrement sont présentés comme un ratio par rapport au coût de l'horaire optimale, soit celle ayant un nombre d'employé temps plein maximal. - -\begin{table}[ht] - \centering - \includegraphics[width=16cm]{Tables/TableaueffetsParametres.png} - \caption{Effet des probabilités d'absentéisme et d'augmentation de la demande de travail sur le coût moyen de recouvrement des horaires.} - \label{table:TableauEffetsParametres} -\end{table} - -Comme le montre ce tableau, pour une probabilité d'absentéisme nulle (sans absence), le coût des horaires augmente en fonction du nombre d'employé à temps partiel. Cela est dû au fait que ces employés ont un taux horaire régulier 20\% plus élevé que celui des employés à temps plein. De plus, pour tous les ratios de type employés, l'augmentation de la probabilité d'absentéisme et l'augmentation de la probabilité d'augmentation de la demande de travail sont associées à l'augmentation du coût de recouvrement des horaires. Cette augmentation de coûts est liée au temps supplémentatire des employés à temps plein (+50\%) ainsi que du taux horaire régulier supérieur des employés à temps partiel, lesquels sont privilégiés pour effectuer les recouvrements. Enfin, ces résultats démontrent que le ratio de type d'employés qui conduit à l'horaire avec un coût de recouvrement minimal varie selon les deux paramètres testés. En effet, lorsque le nombre d'absence et/ou la demande de travail supplémentaire augmente de façon importante, un nombre d'employés à temps partiel supérieur par rapport au nombre d'employés à temps plein permet d'obtenir un horaire au coût de recouvrement le plus faible. La prinpale raison est un diminution du temps supplémentaire effectué par les employés à temps plein. La Figure xx montre les ratios de type d'employés à privilégier pour la construction d'horaires en fonction des probabilités d'absence et d'augmentation de la demande de travail. - -\begin{table}[ht] - \centering - \includegraphics[width=16cm]{Figures/Mapping.png} - \caption{Proportion d'employés à temps plein optimale en fonction des probabilités d'absentéisme et d'augmentation de la demande de travail.} - \label{table:MappingRatioOptimal} -\end{table} - -%%% Local Variables: -%%% mode: latex -%%% TeX-master: "rapport_de_recherche" -%%% End: - diff --git a/Rapport_de_session/resultatsetdiscussion.tex b/Rapport_de_session/resultatsetdiscussion.tex new file mode 100644 index 0000000..457a0fb --- /dev/null +++ b/Rapport_de_session/resultatsetdiscussion.tex @@ -0,0 +1,29 @@ +\section{Résultats et Discussion} +\label{sec:RésultatsDiscussion} + +\subsection{Comparaison des modèles proposés} + +\subsection{Résultats de l'étude de cas} +À l'aide du modèle de génération d'horaires en 2 phases, 8 horaires présentant des ratios employés temps plein / employés temps partiel différents ont été obtenus (voir Annexe 1). Puisque les 2 types d'employés ont des contraintes différentes quant au recouvrement des différentes plages horaires, il a été possible de tester l'effet du taux d'absentéisme et de l'augmentation de la demande. L'effet de ces 2 paramètres sur le coût de recouvrement des 8 horaires sont présentés au Tableau \ref{table:TableauEffetsParametres}. Ces coûts de recouvrement sont présentés comme un ratio par rapport au coût de l'horaire optimale, soit celle ayant un nombre d'employé temps plein maximal. + +\begin{table}[ht] + \centering + \caption{Effet des probabilités d'absentéisme et d'augmentation de la demande de travail sur le coût moyen de recouvrement des horaires.} + \includegraphics[width=16cm]{Tables/TableaueffetsParametres.png} + \label{tableau:TableauEffetsParametres} +\end{table} + +Comme le montre ce tableau, pour une probabilité d'absentéisme nulle (sans absence), le coût des horaires augmente en fonction du nombre d'employé à temps partiel. Cela est dû au fait que ces employés ont un taux horaire régulier 10\% plus élevé que celui des employés à temps plein. De plus, pour tous les ratios de type employés, l'augmentation de la probabilité d'absentéisme et l'augmentation de la probabilité d'augmentation de la demande de travail sont associées à l'augmentation du coût de recouvrement des horaires. Cette augmentation de coûts est liée à l'augmentation des heures travaillées (hausse de la demande), au temps supplémentaire des employés à temps plein (+50\%) ainsi que du taux horaire régulier supérieur des employés à temps partiel, lesquels sont privilégiés pour effectuer les recouvrements. Enfin, ces résultats démontrent que le ratio de type d'employés qui conduit à l'horaire avec un coût de recouvrement minimal varie selon les deux paramètres testés. En effet, lorsque le nombre d'absence et/ou la demande de travail supplémentaire augmente de façon importante, un nombre d'employés à temps partiel supérieur par rapport au nombre d'employés à temps plein permet d'obtenir un horaire au coût de recouvrement le plus faible. La principale raison est une diminution du temps supplémentaire effectué par les employés à temps plein. La Figure \ref{fig:MappingRatioOptimal} montre les ratios de type d'employés à privilégier pour la construction des horaires en fonction des probabilités d'absence et d'augmentation de la demande de travail. + +\begin{figure}[ht] + \centering + \includegraphics[width=16cm]{Figures/Mapping.png} + \caption{Proportion d'employés à temps plein optimale en fonction des probabilités d'absentéisme et d'augmentation de la demande de travail.} + \label{fig:MappingRatioOptimal} +\end{figure} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "rapport_de_recherche" +%%% End: + diff --git a/Travail_de_session/SchedulesRecovery/RecoveredSchedulesArray.java b/Travail_de_session/SchedulesRecovery/RecoveredSchedulesArray.java index d37efec..1008e50 100644 --- a/Travail_de_session/SchedulesRecovery/RecoveredSchedulesArray.java +++ b/Travail_de_session/SchedulesRecovery/RecoveredSchedulesArray.java @@ -47,7 +47,7 @@ public class RecoveredSchedulesArray extends SchedulesArray{ int numberBackTrack = 1; // Fouilles en profondeur en privilegiant les actions avec cout minimum. On marque les noeuds dejà visites pour avoir des fouilles differentes - while ( !isSolutionFound && isModificationFound ) { + while ( !isSolutionFound && isModificationFound && numberBackTrack < 100000) { PriorityQueue recoveringActionsOrderedByCost = getPossibleRecoveringActions(currentRecoveredScheduleOfPartTimeEmployees, currentRecoveredScheduleOfFullTimeEmployees, alreadyRecoveredWorkPeriodByPartTimeEmployees, alreadyRecoveredWorkPeriodByFullTimeEmployees, currentRemainingRecoveringAction, recoveringActionCostComparator); @@ -80,14 +80,11 @@ public class RecoveredSchedulesArray extends SchedulesArray{ if (currentRemainingRecoveringAction == 0){ isSolutionFound = true; - } else if (numberBackTrack % (this.getNumberFullTimeEmployee() + this.getNumberPartTimeEmployee()) == 0) { + } + if (numberBackTrack % (this.getNumberFullTimeEmployee() + this.getNumberPartTimeEmployee()) == 0) { //Si le nombre de retour au sommet atteint le nombre total d'employes, on reinitialize les matrices de noeuds visites. initializeRecoveredWorkPeriodMatrix (alreadyRecoveredWorkPeriodByPartTimeEmployees, alreadyRecoveredWorkPeriodByFullTimeEmployees); - } else if (numberBackTrack > 100000) { - isSolutionFound = false; - System.out.println("No solution Found"); - break; - } + } } @@ -97,6 +94,7 @@ public class RecoveredSchedulesArray extends SchedulesArray{ this.totalScheduleCost = EmployeeCostCalculator.getFullRecoveredScheduleCost(this, myScheduleParameters); } else { + System.out.println("No solution Found"); this.totalScheduleCost = Integer.MAX_VALUE; }