diff --git a/Rapport_de_session/bibliographie.bib b/Rapport_de_session/bibliographie.bib index 0327306..3ffe01f 100644 --- a/Rapport_de_session/bibliographie.bib +++ b/Rapport_de_session/bibliographie.bib @@ -56,5 +56,13 @@ year = {2017}, organization = {TASC - LS2N CNRS UMR 6241, COSLING S.A.S.}, timestamp = {Thu, 23 November 2017}, - url = {http://www.choco-solver.org }, + url = {http://www.choco-solver.org}, +} + +@manual{jdistlib, + author = {Roby Joehanes}, + title = {JDistlib: Java library of statistical distribution}, + year = {2018}, + timestamp = {Sun, 1 April 2018}, + url = {https://sourceforge.net/projects/jdistlib/}, } diff --git a/Rapport_de_session/generationabsences.tex b/Rapport_de_session/generationabsences.tex index cf49ee1..675a946 100644 --- a/Rapport_de_session/generationabsences.tex +++ b/Rapport_de_session/generationabsences.tex @@ -1,4 +1,36 @@ +\section{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. + +\begin{align} + \label{eq:scenarioabsence} + \vec{B}_{e,A} &= {b_{1,1},\ldots,b_{P,1},b_{1,2},\ldots,b_{P,2},\ldots,b_{1,J},\ldots,b_{P,J}} &\forall 1 \leq e \leq E_A +\end{align} +\begin{align} +\label{eq:matricetransition} + M &= \begin{bmatrix} + p(0,0)&1-p(0,0)\\ + 1-p(1,1)&p(1,1) + \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. + +\begin{align} +\mathbf{B}_A = + \begin{bmatrix} + \mathbf{B}_{1,A}\\ + \vdots\\ + \mathbf{B}_{E_A,A}\\ + \end{bmatrix}\\ + \mathbf{X}_{abs,A} = \mathbf{X}_A \cdot {B}_A +\end{align} + +On pourra répéter cette procédure plusieurs fois pour obtenir différents scénarios d'absences. + + %%% Local Variables: %%% mode: latex %%% TeX-master: "rapport_de_recherche" diff --git a/Rapport_de_session/modelisation.tex b/Rapport_de_session/modelisation.tex index e01aab2..5352a4e 100644 --- a/Rapport_de_session/modelisation.tex +++ b/Rapport_de_session/modelisation.tex @@ -27,24 +27,24 @@ Notre modèle considère deux types $A$ d'employés: les employés à temps plei A \in {FT,PT} \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 $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}: \begin{align} \label{eq:eftept} - E^{A} &= \frac{D^{TOT}}{h_{reg}^{A}}, &\forall A + E_{A} &= \frac{D^{TOT}}{h_{reg,A}}, &\forall A \end{align} -Les employés ont respectivement un salaire horaire de $S^{A}$ et encourent un frais fixe de $F^{A}$. Afin de représenter une plus faible productivité des employés à temps partiel, on pourra majorer artificiellement leur salaire horaire. +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. \subsection{Variables} \label{sec:variables} -On représente les horaires de travail par deux tableaux de variables booliennes $\mathbf{X}^{FT}$ et $\mathbf{X}^{PT}$ \eqref{tableauxvariables}. +On représente les horaires de travail par deux tableaux de variables booliennes $\mathbf{X}_{FT}$ et $\mathbf{X}_{PT}$ \eqref{tableauxvariables}. \begin{align} \label{tableauxvariables} - X^{A} &= \left( x_{e,j,p}^{A} \right) \in \N^{E^{A} \times J \times P} &\forall A\\ - 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 + X_{A} &= \left( x_{e,j,p,A} \right) \in \N^{E_{A} \times J \times P} &\forall A\\ + 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} \subsection{Énumération des horaires valides} @@ -58,35 +58,38 @@ Afin de réduire la taille du problème, la liste des horaires quotidiens valide \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$. +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. +L'horaire doit respecter le nombre de périodes travaillées sur la durée totale de l'horaire \eqref{eq:contrnbpertravaillees}. \begin{align} - \frac{h_{min}^{A}}{i^{A}} \leq \sum_{j=1}^{J} h_{j} \leq \frac{h_{max}^{A}}{i^{A}} + \label{eq:contrnbpertravaillees} + \frac{h_{min,A}}{i_{A}} \leq \sum_{j=1}^{J} h_{j} \leq \frac{h_{max,A}}{i_{A}} \end{align} -L'horaire de l'employé à temps partiel doit contenir un même nombre de jours dans les deux sous-périodes $j \in [p1_{min},p1_{max}]=[1,5]$ et $j \in [p2_{min},p2_{max}]=[8,12]$ du lundi au vendredi. +L'horaire de l'employé à temps partiel doit contenir un même nombre de jours dans les deux sous-périodes $j \in [p1_{min},p1_{max}]=[1,5]$ et $j \in [p2_{min},p2_{max}]=[8,12]$ du lundi au vendredi \eqref{eq:contrdeuxperiodes}. \begin{align} + \label{eq:contrdeuxperiodes} \sum_{j=p1_{min}}^{p1_{max}} h_{j} = \sum_{j=p2_{min}}^{p2_{max}} h_{j} \end{align} -L'horaire doit inclure le travail durant une fin de semaine sur deux. +L'horaire doit inclure le travail durant une fin de semaine sur deux \eqref{eq:contrfinsemaine}. \begin{align} + \label{eq:contrfinsemaine} 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}. L'expression régulière représentant cet automate prend la forme \texttt{[01]*1\{5,\}[01]*}. +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}. L'expression régulière représentant cet automate prend la forme \texttt{[01]*1\{5,\}[01]*}. \begin{figure}[ht] \centering \includegraphics[width=15cm]{maxconsecutif} - \caption{Automate fini d'un horaire où $j_{max}^{A} \leq 4$ n'est pas respecté} + \caption{Automate fini d'un horaire où $j_{max,A} \leq 4$ n'est pas respecté} \label{fig:automatemaxconsecutif} \end{figure} @@ -95,18 +98,18 @@ On obtient, pour chaque type de travailleur, une liste de vecteurs à laquelle o \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} +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} \begin{align} \label{eq:horairejourvalide} -\mathbf{H}^A &= \left( \vec{H}^{A} \right)\\ +\mathbf{H}_A &= \left( \vec{H}_{A} \right)\\ \label{eq:horairequotidienvalide} - \mathbf{Q}^A &= \begin{bmatrix} + \mathbf{Q}_A &= \begin{bmatrix} q_{1,1}& \cdots& q_{P,1}\\ \vdots&\ddots&\vdots\\ - q_{1,n_{hq}^A}&\cdots&q_{P,n_{hq}^A} + q_{1,n_{hq,A}}&\cdots&q_{P,n_{hq,A}} \end{bmatrix}\\ \label{eq:produithoraire} - \mathbf{V}^A &= \mathbf{H}^A \otimes \mathbf{Q}^A + \mathbf{V}_A &= \mathbf{H}_A \otimes \mathbf{Q}_A \end{align} \subsection{Contraintes} @@ -116,23 +119,29 @@ Chaque horaire d'employé doit d'abord correspondre à un horaire valide tel qu' \begin{align} \label{eq:contraintetableau} - \mathcal{C}_1 &: \textsc{Tableau}\left( \mathbf{V}^A, + \mathcal{C}_1 &: \textsc{Tableau}\left( \mathbf{V}_A, \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}\right) & \forall e \end{align} -La planification doit aussi satisfaire la demande en employés, en utilisant une contrainte \textsc{Sum}. +La planification doit aussi satisfaire la demande en employés, en utilisant une contrainte \textsc{Sum} \eqref{eq:contrsumemployes}. \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: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} \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} diff --git a/Rapport_de_session/rapport_de_recherche.pdf b/Rapport_de_session/rapport_de_recherche.pdf index 7203acf..d21216a 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 39ccdef..05fd03d 100644 --- a/Rapport_de_session/rapport_de_recherche.tex +++ b/Rapport_de_session/rapport_de_recherche.tex @@ -55,6 +55,8 @@ \newcommand{\Z}{\mathbb{Z}} % Commande personnelle, plus rapide pour tapper les ensembles \newcommand{\R}{\mathbb{R}} % Commande personnelle, plus rapide pour tapper les ensembles \usepackage{cprotect} % Pour pouvoir personaliser la légende des figures +\DeclareMathOperator*{\argmax}{arg\,max} +\DeclareMathOperator*{\argmin}{arg\,min} %---------------------------------------------------------------- \begin{document} diff --git a/Travail_de_session/InitialSchedules/ModelInitialSchedules.java b/Travail_de_session/InitialSchedules/ModelInitialSchedules.java index 370144f..a808835 100644 --- a/Travail_de_session/InitialSchedules/ModelInitialSchedules.java +++ b/Travail_de_session/InitialSchedules/ModelInitialSchedules.java @@ -144,6 +144,7 @@ public class ModelInitialSchedules { private void createModelObjectiveFunction() { + // Nombre total de périodes travaillées IntVar numberOfPartTimeEmployeesWorkingPeriods = chocoModelInitialSchedules.intVar( 0, this.maxPartTimeEmployee * this.myScheduleParameters.getWorkPeriodsPerSchedule(), true);