diff --git a/Rapport_de_session/modelisation.tex b/Rapport_de_session/approche.tex similarity index 51% rename from Rapport_de_session/modelisation.tex rename to Rapport_de_session/approche.tex index 5d57bf4..6130b59 100644 --- a/Rapport_de_session/modelisation.tex +++ b/Rapport_de_session/approche.tex @@ -1,41 +1,29 @@ -\section{Modélisation} -\label{sec:modelisation} +\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 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. 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. \subsection{Paramètres} -\label{sec:parametres} +\label{sec:approcheparametres} -On considère une planification d'horaires de travail d'une durée de $J=14$ jours. Chaque journée est composée de $P=6$ périodes de travail, d'une durée de $\frac{24}{P}=4$ heures chacunes. La demande de travail pour la période $p$ de la journée $j$ est définie par $d_{p,j}$. La demande totale pour la durée de l'horaire de travail est définie par l'équation \eqref{eq:dtot}. +La durée de l'horaire est de $J$ jours de $P$ périodes, d'une durée de $\frac{24}{P}$ heures chacunes. La demande de travail pour la période $p$ de la journée $j$ est définie par $d_{p,j}$. La demande totale pour la durée de l'horaire de travail est définie par l'équation \eqref{eq:dtot}. \begin{align} \label{eq:dtot} - D^{TOT} = \sum_{p=1}^{P} \sum_{j=1}^{J} d_{p,j} + D_{tot} = \sum_{p=1}^{P} \sum_{j=1}^{J} d_{p,j} \end{align} -La demande de travail pour ces périodes est définie par le vecteur \eqref{eq:demandeinstance}. +On représente l'ensemble des types d'employés disponibles par $a \in \mathcal{A}$. Les employés travaillent entre $h_{min,a}$ et $h_{max,a}$ heures. On définit le nombre d'heures de repos minimal $r_{min,a}$ et le nombre maximal de journées consécutives par $j_{max,a}$. -\begin{align} - \label{eq:demandeinstance} - \vec{d}_{p,\cdot} &= \begin{bmatrix}2&2&4&4&3&3\end{bmatrix} &\forall j \in \left[ 1,j \right] -\end{align} - -Notre modèle considère deux types $A$ d'employés: les employés à temps plein et les employés à temps partiel \eqref{typeemployes}. - -\begin{align} - \label{typeemployes} - A \in \lbrace FT,PT \rbrace -\end{align} - -Ils travaillent des périodes consécutives d'une durée de 8 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}=80$ heures par période de deux semaines et les employés à temps partiel travaillent entre $h_{min,PT}=32$ et $h_{max,PT}=64$ 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 leur maximum sera déterminé par les ratios \eqref{eq:eftept}: +Le nombre d'employé est variable. En tentant de résoudre le problème de satisfiabilité avec un nombre différent d'employés de chaque type, il est possible d'estimer une borne inférieure et une borne supérieure à ce nombre. On peut toutefois borner le maximum par les ratios suivants \eqref{eq:eftept}: \begin{align} \label{eq:eftept} - E_{FT} &= \frac{D^{TOT}}{h_{reg,FT}}, E_{PT} = \frac{D^{TOT}}{h_{min,PT}} + E_{a} &= \frac{D_{tot}}{h_{min,a}}, &\forall a \in \mathcal{A} \end{align} -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. +Enfin, chaque type d'employé a un salaire par période de $s_{a}$ et encourent un frais fixe de $f_{a}$. \subsection{Variables} \label{sec:variables} @@ -44,8 +32,8 @@ On représente les horaires de travail par deux tableaux de variables booliennes \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} On définit l'horaire s'appliquant à l'employé $e$ par $X_e$\eqref{eq:horaireemploye}. @@ -54,7 +42,7 @@ On définit l'horaire s'appliquant à l'employé $e$ par $X_e$\eqref{eq:horairee X_e &= \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}\\ + \end{bmatrix} \end{align} \subsection{Énumération des horaires valides} @@ -122,11 +110,11 @@ Chaque horaire d'employé $X_e$ doit d'abord correspondre à un horaire valide t \begin{align} \label{eq:contraintetableau} \mathcal{C}_1 &: \textsc{Tableau}\left( \mathbf{V}_A, - X_e \right) & \forall e\\ + X_e \right), &\forall e\\ \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\\ + \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:lex} - \mathcal{C}_3 &: \textsc{LexLessEq}(X_i,X_{i+1}) &\forall i \in [1,E^A-1],A + \mathcal{C}_3 &: \textsc{LexLessEq}(X_i,X_{i+1}), &\forall i \in [1,E^A-1],A \end{align} \subsection{Fonction objectif} @@ -139,9 +127,61 @@ La fonction objectif \eqref{eq:fonctionobjectif} que nous désirons minimiser es \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} + + + +\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. + +\begin{align} + \label{eq:scenarioabsence} + \vec{B}_{e,A} &= \left[ b_{1,1},\ldots,b_{P,1},b_{1,2},\ldots,b_{P,2},\ldots,b_{1,J},\ldots,b_{P,J} \right], &\forall 1 \leq e \leq E_A\\ + \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. + +\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. + +É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: + +\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 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. +\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. + + + + %%% Local Variables: %%% mode: latex %%% TeX-master: "rapport_de_recherche" %%% End: - diff --git a/Rapport_de_session/conclusion.tex b/Rapport_de_session/conclusion.tex index cf49ee1..4956bd9 100644 --- a/Rapport_de_session/conclusion.tex +++ b/Rapport_de_session/conclusion.tex @@ -1,4 +1,8 @@ +\section{Conclusion} +\label{sec:conclusion} + + %%% Local Variables: %%% mode: latex %%% TeX-master: "rapport_de_recherche" diff --git a/Rapport_de_session/description.tex b/Rapport_de_session/description.tex new file mode 100644 index 0000000..33ba45e --- /dev/null +++ b/Rapport_de_session/description.tex @@ -0,0 +1,42 @@ + +\section{Description du problème} +\label{sec:description} + +Nous présentons un problème de planification d'horaires de travail optimales et robustes. L'approche de modélisation proposée inclus des éléments d'incertitude au niveau de l'absentéisme des employés et de la possibilité d'un accroissement temporaire de la demande à tout instant. L'horaire optimal sélectionné doit minimiser les coûts de recouvrement des absences, en plus de permettre l'augmentation de la demande en employés tout en limitant le recours à du temps supplémentaire. Une fois que les scénarios d'incertitude sont générés, il faut effectuer un recouvrement au coût le plus faible, tout en respectant un ensemble de contraintes différent. + +\subsection{Instance considérée} +\label{sec:instanceconsideree} + +\subsubsection{Horaire initial} +\label{sec:descriptioninitial} + +On considère la planification d'un horaire de travail initial sur un cycle de 14 jours. Chaque journée est composée de six périodes de travail, d'une durée de quatre heures chacunes. Il y a deux types d'employés: des employés à temps plein ($FT$) qui travaillent 80 heures régulières par cycle et des employés à temps partiel ($PT$) qui travaillent entre 32 et 80 heures par cycle. Un niveau de demande de base est établi à deux employés pour les deux périodes de la matinée, quatre employés pour les deux périodes du milieu de la journée et trois employés pour les deux périodes de la soirée, pour la durée du cycle. + +Tous les employés, lorsqu'ils effectuent une journée de travail. sont présents durant deux périodes consécutives, pour une durée totale de huit heures. Les employés à temps plein débutent soit à la première, la troisième ou la cinquième période. Une période de repos minimale de 12 heures est requise entre deux séquences de travail. De plus, les employés ne travaillent jamais plus de 5 journées consécutives. Les employés à temps partiel travaillent le même nombre de jours du lundi au vendredi et tous les employés travaillent une fin de semaine sur deux. Dans cette instance, il n'y a pas de nombre limite d'employés de chaque type, il sera déterminé par l'horaire initial. + +Les employés ont un salaire régulier de 10\$/h. On ajoute 1\$/h par employé à temps partiel pour compenser une plus faible productivité. Les employés à temps plein ont un salaire de 15\$/h pour les heures supplémantaires. De plus, tous les employés encourent un frais fixe de 50\$ par cycle. + +\subsubsection{Incertitude} +\label{sec:descriptionincertitude} + + + +\subsubsection{Recouvrement} +\label{sec:descriptionrecouvrement} + +Une fois les scénarios d'incertitude générés pour chaque horaire initial, on appliquera les règles de recouvrement suivantes: + +\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 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" +%%% End: diff --git a/Rapport_de_session/discussion.tex b/Rapport_de_session/discussion.tex new file mode 100644 index 0000000..bbcf260 --- /dev/null +++ b/Rapport_de_session/discussion.tex @@ -0,0 +1,10 @@ + +\section{Discussion} +\label{sec:discussion} + + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "rapport_de_recherche" +%%% End: diff --git a/Rapport_de_session/experimentation.tex b/Rapport_de_session/experimentation.tex index 0520863..3f223f9 100644 --- a/Rapport_de_session/experimentation.tex +++ b/Rapport_de_session/experimentation.tex @@ -1,10 +1,12 @@ -\section{Démarche expérimentale} +\section{Protocole d'expérimentation} \label{sec:demarcheexp} \subsection{Production des horaires initiales} \label{sec:demarchehorairesinit} +L'instance de base pour la comparaison des différents résultats correspond au problème de satisfiabilité des contraintes de l'horaire initial. + 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/generationabsences.tex b/Rapport_de_session/generationabsences.tex deleted file mode 100644 index 675a946..0000000 --- a/Rapport_de_session/generationabsences.tex +++ /dev/null @@ -1,38 +0,0 @@ - -\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" -%%% End: - diff --git a/Rapport_de_session/introduction.tex b/Rapport_de_session/introduction.tex index 929988e..1312ced 100644 --- a/Rapport_de_session/introduction.tex +++ b/Rapport_de_session/introduction.tex @@ -1,7 +1,7 @@ \section{Introduction} \label{sec:Introduction} -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. +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}. diff --git a/Rapport_de_session/rapport_de_recherche.pdf b/Rapport_de_session/rapport_de_recherche.pdf index eddd380..926ab74 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 23e8129..a04fea4 100644 --- a/Rapport_de_session/rapport_de_recherche.tex +++ b/Rapport_de_session/rapport_de_recherche.tex @@ -69,13 +69,15 @@ \newpage \listoftables % Le package newclude mis en commentaire permet d'introduire une * pour éviter le saut de page entre les section + \include{introduction} -\include{modelisation} -\include{generationabsences} -\include{recouvrement} +\include{description} +\include{approche} \include{experimentation} \include{resultats} +\include{discussion} \include{conclusion} + \bibliography{bibliographie} \include{Annexe1} \end{document} diff --git a/Rapport_de_session/recouvrement.tex b/Rapport_de_session/recouvrement.tex index 5db8784..e69de29 100644 --- a/Rapport_de_session/recouvrement.tex +++ b/Rapport_de_session/recouvrement.tex @@ -1,30 +0,0 @@ -\section{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. Les règles régissant ce recouvrement sont les suivantes : -\bigskip -\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 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} -\bigskip -É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. -\bigskip -\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 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. -\end{itemize} -\bigskip -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. - -%%% Local Variables: -%%% mode: latex -%%% TeX-master: "rapport_de_recherche" -%%% End: - diff --git a/Rapport_de_session/resultats.tex b/Rapport_de_session/resultats.tex index ce67cf5..2c993fe 100644 --- a/Rapport_de_session/resultats.tex +++ b/Rapport_de_session/resultats.tex @@ -1,4 +1,4 @@ -\section{Résultats et Discussion} +\section{Résultats} \label{sec:RésultatsDiscussion} \subsection{Comparaison des modèles proposés} diff --git a/Travail_de_session/MainClass.java b/Travail_de_session/MainClass.java index 929f854..f089984 100644 --- a/Travail_de_session/MainClass.java +++ b/Travail_de_session/MainClass.java @@ -31,7 +31,7 @@ public class MainClass { List bankRecoveredSchedulesOrderedByMeanCost = GenerateOptimalRecoveredSchedules(listBankModifiedSchedules); -// SchedulesWindows.ShowSolutionResultsFrame initialSchedulesViewer = new SchedulesWindows.ShowSolutionResultsFrame(bankRecoveredSchedulesOrderedByMeanCost); + SchedulesWindows.ShowSolutionResultsFrame initialSchedulesViewer = new SchedulesWindows.ShowSolutionResultsFrame(bankRecoveredSchedulesOrderedByMeanCost); // int optimalFullTimeEmployee = bankRecoveredSchedulesOrderedByMeanCost.get(0).initialSchedulesArray.getNumberFullTimeEmployee(); // System.out.print(optimalFullTimeEmployee + " "); @@ -74,7 +74,7 @@ public class MainClass { SolverInitialSchedules mySolverPartTimeEmployeesInitialSchedules = new SolverInitialSchedules(myModelPartTimeEmployeesInitialSchedules); List myInitialPartTimeEmployeesSchedulesSolutions = mySolverPartTimeEmployeesInitialSchedules.findAllSolution(); -// mySolverPartTimeEmployeesInitialSchedules.printStatistics(); + mySolverPartTimeEmployeesInitialSchedules.printStatistics(); for (Solution CurrentPartTimeEmployeesSolution : myInitialPartTimeEmployeesSchedulesSolutions) { PartTimeEmployeeScheduleArray partTimeSchedulesArray = new PartTimeEmployeeScheduleArray(myModelPartTimeEmployeesInitialSchedules, CurrentPartTimeEmployeesSolution);