ajout rapport fonction objectif et absences
This commit is contained in:
parent
f618018f9a
commit
8ffa49c578
6 changed files with 74 additions and 22 deletions
|
@ -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/},
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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}
|
||||
|
||||
|
||||
|
||||
|
|
Binary file not shown.
|
@ -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}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue