ajout rapport fonction objectif et absences

This commit is contained in:
François Pelletier 2018-04-08 16:33:40 -04:00
parent f618018f9a
commit 8ffa49c578
6 changed files with 74 additions and 22 deletions

View file

@ -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/},
}

View file

@ -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}$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"

View file

@ -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}

View file

@ -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}

View file

@ -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);