L'objectif de ce problème est de concevoir un horaire de travail avec minimisation de la perte de profit en utilisant le solveur Choco 4 \cite{chocoSolver}.
\subsection{Constantes}
\label{sec:q2constantes}
Plusieurs constantes sont définies par l'énoncé du problème. On définit les périodes $t=1,\ldots,16$ de la journée comme étant des périodes de 30 minutes débutant à 9h00 et se terminant à 16h59.
On définit aussi ces constantes supplémentaires pour la création de contraintes, car Choco 4 ne permet pas d'effectuer d'opérations arithmétiques dans une contrainte.
On définit une matrice de variables $E_{N \times N_P}$ où $e_{ij}$ correspondant à une valeur booléenne prenant la valeur $1$ si l'employé $i$ travaille à la période $j$ et $0$ sinon.
Afin de résoudre le problème d'optimisation, on doit définir des variables supplémentaires, car les composantes de la fonction d'optimisation sont aussi exprimées sous forme de contraintes.
$e_{j}^{eff}$, le nombre d'employés effectif à la période $j$, et $e_{j}^{dist}$ la différence absolue entre le nombre d'employés effectif et souhaité à la période $j$.
La contrainte du nombre d'employés requis s'énonce comme suit: pour chaque période $i$, le nombre d'employés travaillant doit être supérieur ou égal au nombre d'employés minimum requis. Il s'agit d'une contrainte de type \textsc{Sum}.
Afin de représenter le motif correspondant à une journée de travail alternant les périodes de travail et celles de repos, on utilisera une contrainte de type \textsc{Regular} qui est paramétrée par un automate fini, c'est à dire une chaîne de caractère formant une expression régulière qui valide plusieurs contraintes définies par l'énoncé du problème.
Dans Choco 4, la contrainte \texttt{model.regular} prend en paramètre une séquence de variables entières à valider, et un automate fini défini par la classe \texttt{FiniteAutomaton}. Pour construire une instance de cette classe, on doit construire l'expression régulière en n'utilisant que des nombres comme valeurs. Comme nous avons choisi de représenter les différents états d'un employé par une variable boolenne, cette condition est satisfaite.
Dans Choco, les contraintes d'optimisation sont crées de la même façon que les contraintes de satisfaction. Cependant, une des variables ne sera pas une constante, mais un intervalle dans lequel la fonction d'optimisation va effectuer sa recherche.
Nous implémenterons le nombre de travailleurs effectifs $e_j^{eff}$ à la période $j$ en utilisant une contrainte \textsc{Sum}:
Nous implémenterons ensuite la différence entre le nombre de travailleurs effectifs et souhaités $e_j^{dist}$ à la période $j$ en utilisant une contrainte \textsc{Distance}: