Simplification de l'algorithme de recouvrement.

Ajout des sections recouvrement d'horaire et résultats.
This commit is contained in:
Francois Berube\frabe 2018-04-13 17:51:55 -04:00
parent cb8a2f4fd2
commit fe0e3cb3a2
25 changed files with 1607 additions and 57 deletions

View file

@ -10,7 +10,7 @@ package AbsenceSchedules;
* @author frabe
*/
public class ParametersAbsencesSimulator {
public static double probPresence = 0.9;
public static double probPresence = 0.99;
public static final double probReturn = 0.50;
public static int numberAbsenceSimulations = 1000;
}

View file

@ -24,29 +24,29 @@ public class RecoveredSchedulesArray extends SchedulesArray{
}
private void recoverAbsenceScheduleOptimally() {
boolean[][] initialRecoveredScheduleOfPartTimeEmployees = this.getDeepCopyEmployeesSchedules(this.absenceSchedulesArray.partTimeSchedules);
boolean[][] initialRecoveredScheduleOfFullTimeEmployees = this.getDeepCopyEmployeesSchedules(this.absenceSchedulesArray.fullTimeSchedules);
boolean[][] currentRecoveredScheduleOfPartTimeEmployees = this.getDeepCopyEmployeesSchedules(this.absenceSchedulesArray.partTimeSchedules);
boolean[][] currentRecoveredScheduleOfFullTimeEmployees = this.getDeepCopyEmployeesSchedules(this.absenceSchedulesArray.fullTimeSchedules);
boolean[][] currentRecoveredScheduleOfFullTimeEmployees = this.getDeepCopyEmployeesSchedules(this.absenceSchedulesArray.fullTimeSchedules);
int remainingRecoveringAction = this.absenceSchedulesArray.numberOfRecoveringActionsToPerform;
int initialRemainingRecoveringAction = this.absenceSchedulesArray.numberOfRecoveringActionsToPerform;
int currentRemainingRecoveringAction = this.absenceSchedulesArray.numberOfRecoveringActionsToPerform;
boolean[][] alreadyRecoveredWorkPeriodByPartTimeEmployees = new boolean[this.getNumberPartTimeEmployee()][remainingRecoveringAction];
boolean[][] alreadyRecoveredWorkPeriodByFullTimeEmployees = new boolean[this.getNumberFullTimeEmployee()][remainingRecoveringAction];
boolean[][] alreadyRecoveredWorkPeriodByPartTimeEmployees = new boolean[this.getNumberPartTimeEmployee()][initialRemainingRecoveringAction];
boolean[][] alreadyRecoveredWorkPeriodByFullTimeEmployees = new boolean[this.getNumberFullTimeEmployee()][initialRemainingRecoveringAction];
initializeRecoveredWorkPeriodMatrix (alreadyRecoveredWorkPeriodByPartTimeEmployees, alreadyRecoveredWorkPeriodByFullTimeEmployees);
RecoveringActionComparator recoveringActionCostComparator = new RecoveringActionComparator();
ScheduleState initialScheduleState = new ScheduleState(currentRecoveredScheduleOfPartTimeEmployees, currentRecoveredScheduleOfFullTimeEmployees,
remainingRecoveringAction);
ScheduleState currentScheduleState = null;
boolean isSolutionFound = false;
boolean isAbsenceFound = remainingRecoveringAction != 0;
boolean isAbsenceFound = initialRemainingRecoveringAction != 0;
int numberBackTrack = 0;
int numberBackTrack = 1;
// Fouilles en profondeur en privilegiant les actions avec cout minimum. On marque les noeuds dejà visites pour avoir des fouilles differentes
while ( !isSolutionFound && isAbsenceFound) {
while ( !isSolutionFound && isAbsenceFound ) {
PriorityQueue<RecoveringAction> recoveringActionsOrderedByCost =
getPossibleRecoveringActions(currentRecoveredScheduleOfPartTimeEmployees, currentRecoveredScheduleOfFullTimeEmployees,
alreadyRecoveredWorkPeriodByPartTimeEmployees, alreadyRecoveredWorkPeriodByFullTimeEmployees, remainingRecoveringAction, recoveringActionCostComparator);
alreadyRecoveredWorkPeriodByPartTimeEmployees, alreadyRecoveredWorkPeriodByFullTimeEmployees, currentRemainingRecoveringAction, recoveringActionCostComparator);
if (recoveringActionsOrderedByCost.size() > 0){
RecoveringAction currentRecoveringAction;
if (recoveringActionsOrderedByCost.size() == 1){
@ -56,21 +56,17 @@ public class RecoveredSchedulesArray extends SchedulesArray{
currentRecoveringAction = chooseMinimalCostRecoveringActionRandomly(recoveringActionsOrderedByCost);
}
boolean[][] recoveredScheduleOfPartTimeEmployeesAfterAction = this.getDeepCopyEmployeesSchedules(currentRecoveredScheduleOfPartTimeEmployees);
boolean[][] recoveredScheduleOfFullTimeEmployeesAfterAction = this.getDeepCopyEmployeesSchedules(currentRecoveredScheduleOfFullTimeEmployees);
if (currentRecoveringAction.getClass().getName().equals("SchedulesRecovery.RecoveringActionPartTimeEmployee")) {
recoveredScheduleOfPartTimeEmployeesAfterAction[currentRecoveringAction.employee][currentRecoveringAction.workPeriod] = true;
alreadyRecoveredWorkPeriodByPartTimeEmployees[currentRecoveringAction.employee][remainingRecoveringAction-1] = true;
currentRecoveredScheduleOfPartTimeEmployees[currentRecoveringAction.employee][currentRecoveringAction.workPeriod] = true;
alreadyRecoveredWorkPeriodByPartTimeEmployees[currentRecoveringAction.employee][currentRemainingRecoveringAction-1] = true;
} else if (currentRecoveringAction.getClass().getName().equals("SchedulesRecovery.RecoveringActionFullTimeEmployee")) {
recoveredScheduleOfFullTimeEmployeesAfterAction[currentRecoveringAction.employee][currentRecoveringAction.workPeriod] = true;
alreadyRecoveredWorkPeriodByPartTimeEmployees[currentRecoveringAction.employee][remainingRecoveringAction-1] = true;
currentRecoveredScheduleOfFullTimeEmployees[currentRecoveringAction.employee][currentRecoveringAction.workPeriod] = true;
alreadyRecoveredWorkPeriodByPartTimeEmployees[currentRecoveringAction.employee][currentRemainingRecoveringAction-1] = true;
}
currentScheduleState = new ScheduleState(recoveredScheduleOfPartTimeEmployeesAfterAction, recoveredScheduleOfFullTimeEmployeesAfterAction,
remainingRecoveringAction - 1);
currentRemainingRecoveringAction--;
} else if (numberBackTrack > this.getNumberFullTimeEmployee() + this.getNumberPartTimeEmployee()) {
} else if (numberBackTrack % (this.getNumberFullTimeEmployee() + this.getNumberPartTimeEmployee()) == 0) {
//Si le nombre de retour au sommet atteint le nombre total d'employes, on reinitialize les matrices de noeuds visites.
initializeRecoveredWorkPeriodMatrix (alreadyRecoveredWorkPeriodByPartTimeEmployees, alreadyRecoveredWorkPeriodByFullTimeEmployees);
} else if (numberBackTrack > 10000) {
@ -79,27 +75,22 @@ public class RecoveredSchedulesArray extends SchedulesArray{
break;
} else{
// Lorsqu'on est bloque dans l'arbre de recherche, on revient au sommet de l'arbre et on recommence une nouvelle fouille.
currentScheduleState = initialScheduleState;
remainingRecoveringAction = currentScheduleState.remainingRecoveringAction;
currentRemainingRecoveringAction = initialRemainingRecoveringAction;
currentRecoveredScheduleOfPartTimeEmployees = this.getDeepCopyEmployeesSchedules(initialRecoveredScheduleOfPartTimeEmployees);
currentRecoveredScheduleOfFullTimeEmployees = this.getDeepCopyEmployeesSchedules(initialRecoveredScheduleOfFullTimeEmployees);
numberBackTrack++;
}
if (remainingRecoveringAction - 1 == 0){
if (currentRemainingRecoveringAction == 0){
isSolutionFound = true;
}
currentRecoveredScheduleOfPartTimeEmployees = currentScheduleState.currentRecoveredScheduleOfPartTimeEmployees;
currentRecoveredScheduleOfFullTimeEmployees = currentScheduleState.currentRecoveredScheduleOfFullTimeEmployees;
remainingRecoveringAction = currentScheduleState.remainingRecoveringAction;
}
if (isSolutionFound || !isAbsenceFound) {
this.fullTimeSchedules = currentRecoveredScheduleOfFullTimeEmployees;
this.partTimeSchedules = currentRecoveredScheduleOfPartTimeEmployees;
this.totalScheduleCost = EmployeeCostCalculator.getFullRecoveredScheduleCost(this, myParametersInitialSchedules);
} else {
this.totalScheduleCost = Integer.MAX_VALUE;
}

View file

@ -1,26 +0,0 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package SchedulesRecovery;
/**
*
* @author frabe
*/
public class ScheduleState {
boolean[][] currentRecoveredScheduleOfPartTimeEmployees;
boolean[][] currentRecoveredScheduleOfFullTimeEmployees;
int remainingRecoveringAction;
public ScheduleState(boolean[][] currentRecoveredScheduleOfPartTimeEmployees, boolean[][] currentRecoveredScheduleOfFullTimeEmployees,
int remainingRecoveringAction) {
this.currentRecoveredScheduleOfPartTimeEmployees = currentRecoveredScheduleOfPartTimeEmployees;
this.currentRecoveredScheduleOfFullTimeEmployees = currentRecoveredScheduleOfFullTimeEmployees;
this.remainingRecoveringAction = remainingRecoveringAction;
}
}