Simplification de l'algorithme de recouvrement.
Ajout des sections recouvrement d'horaire et résultats.
This commit is contained in:
parent
cb8a2f4fd2
commit
fe0e3cb3a2
25 changed files with 1607 additions and 57 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue