WIP modifications VariableDemand
This commit is contained in:
parent
177435db08
commit
ed45dbfc2c
12 changed files with 695 additions and 681 deletions
Rapport_de_session
Travail_de_session
InitialSchedules
ModelFullTimeEmployeesInitialSchedules.javaModelPartTimeEmployeesInitialSchedules.javaParametersInitialSchedules.java
MainClass.javaScheduleUtil
VariableDemandSchedules
File diff suppressed because it is too large
Load diff
Binary file not shown.
Binary file not shown.
|
@ -70,7 +70,7 @@ public class ModelFullTimeEmployeesInitialSchedules {
|
|||
transposeWorkPeriodsSchedulesOfFullTimeEmployees[workPeriod],
|
||||
this.fullTimeEmployeesPerWorkPeriods[workPeriod]).post();
|
||||
chocoModelInitialSchedules.arithm(this.fullTimeEmployeesPerWorkPeriods[workPeriod], "<=",
|
||||
this.myScheduleParameters.requiredWorkforce[workPeriod]).post();
|
||||
this.myScheduleParameters.getRequiredWorkForce(workPeriod)).post();
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -65,7 +65,7 @@ public class ModelPartTimeEmployeesInitialSchedules {
|
|||
transposeWorkPeriodsSchedulesOfPartTimeEmployees[workPeriod],
|
||||
this.partTimeEmployeesPerWorkPeriods[workPeriod]).post();
|
||||
chocoModelInitialSchedules.arithm(this.partTimeEmployeesPerWorkPeriods[workPeriod], "=",
|
||||
this.myScheduleParameters.requiredWorkforce[workPeriod]).post();
|
||||
this.myScheduleParameters.getRequiredWorkForce(workPeriod)).post();
|
||||
}
|
||||
|
||||
// Contrainte de bris de symétrie:
|
||||
|
|
|
@ -31,7 +31,7 @@ public class ParametersInitialSchedules {
|
|||
private final int maxConsecutiveWorkingHoursOfFullTimeEmployeesPerShiftWork = 12;
|
||||
private final int minConsecutiveNonWorkingHoursBetweenShiftWorksOfFullTimeEmployees = 12;
|
||||
|
||||
int[] requiredWorkforce;
|
||||
private int[] requiredWorkforce;
|
||||
int NbFullTimeSolutions;
|
||||
int NbPartTimeSolutions;
|
||||
Tuples enumerationWorkPeriodsSchedulesOfFullTimeEmployees;
|
||||
|
@ -79,7 +79,9 @@ public class ParametersInitialSchedules {
|
|||
}
|
||||
|
||||
public void setRequiredWorkforce(int[] vector) {
|
||||
this.requiredWorkforce = vector;
|
||||
for(int workPeriod=0;workPeriod<vector.length;workPeriod++) {
|
||||
this.requiredWorkforce[workPeriod] = vector[workPeriod];
|
||||
}
|
||||
}
|
||||
|
||||
public int getDaysPerSchedule() {
|
||||
|
|
|
@ -2,6 +2,9 @@ import AbsenceSchedules.*;
|
|||
import InitialSchedules.*;
|
||||
import ScheduleUtil.*;
|
||||
import SchedulesRecovery.*;
|
||||
import VariableDemandSchedules.BankVariableDemandSchedules;
|
||||
import VariableDemandSchedules.ParametersVariableDemandSimulator;
|
||||
import VariableDemandSchedules.VariableDemandSchedulesArray;
|
||||
import jdistlib.rng.MersenneTwister;
|
||||
import jdistlib.rng.RandomEngine;
|
||||
import org.chocosolver.solver.Solution;
|
||||
|
@ -10,6 +13,7 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
import java.util.PriorityQueue;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class MainClass {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
@ -24,17 +28,20 @@ public class MainClass {
|
|||
|
||||
List<SchedulesArray> initialSchedulesArrayList = generateInitialSchedules();
|
||||
|
||||
//List<BankVariableDemandSchedules> listBankVariableDemandSchedules = GenerateModifiedDemandSchedules(initialSchedulesArrayList);
|
||||
|
||||
List<BankAbsenceSchedules> listBankAbsenceSchedules = GenerateAbsencesSchedules(initialSchedulesArrayList);
|
||||
|
||||
List<BankRecoveredSchedules> bankRecoveredSchedulesOrderedByMeanCost = GenerateOptimalRecoveredSchedules(listBankAbsenceSchedules);
|
||||
|
||||
SchedulesWindows.ShowSolutionResultsFrame initialSchedulesViewer = new SchedulesWindows.ShowSolutionResultsFrame(bankRecoveredSchedulesOrderedByMeanCost);
|
||||
@SuppressWarnings("unused") SchedulesWindows.ShowSolutionResultsFrame initialSchedulesViewer = new SchedulesWindows.ShowSolutionResultsFrame(bankRecoveredSchedulesOrderedByMeanCost);
|
||||
|
||||
// int optimalFullTimeEmployee = bankRecoveredSchedulesOrderedByMeanCost.get(0).initialSchedulesArray.getNumberFullTimeEmployee();
|
||||
// System.out.println(optimalFullTimeEmployee + " ");
|
||||
// }
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private static List<SchedulesArray> generateInitialSchedules() {
|
||||
|
||||
// Trouver les horaires des employes a temps plein possibles pour different ratio templein/temps partiel
|
||||
|
@ -42,7 +49,7 @@ public class MainClass {
|
|||
|
||||
InitialSchedules.ParametersInitialSchedules myScheduleParameters = new InitialSchedules.ParametersInitialSchedules();
|
||||
|
||||
int minFullTimeEmployee = 2; //La solution avec 1 employes est trop lente
|
||||
int minFullTimeEmployee = 3; //La solution avec 1 employes est trop lente
|
||||
|
||||
int maxFullTimeEmployee = 9; //9 est le max d'employes a temps plein pour la presente requiredWorkforce
|
||||
|
||||
|
@ -90,6 +97,25 @@ public class MainClass {
|
|||
|
||||
}
|
||||
|
||||
private static List<BankVariableDemandSchedules> GenerateModifiedDemandSchedules(List<SchedulesArray> initialSchedulesArrayList) {
|
||||
RandomEngine r = new MersenneTwister(987654321);
|
||||
List<BankVariableDemandSchedules> listBankVariableDemandSchedules = new ArrayList<>();
|
||||
List<SchedulesArray> listVariableDemandSchedules = new ArrayList<>(); // to be removed
|
||||
for (SchedulesArray initialSchedule : initialSchedulesArrayList) {
|
||||
BankVariableDemandSchedules bankVariableDemandSimulations = new BankVariableDemandSchedules(initialSchedule);
|
||||
for (int simNum = 0; simNum < ParametersVariableDemandSimulator.numberVariableDemandSimulation ; simNum++){
|
||||
VariableDemandSchedulesArray variableDemandSchedule = new VariableDemandSchedulesArray(initialSchedule,r);
|
||||
listVariableDemandSchedules.add(variableDemandSchedule);
|
||||
bankVariableDemandSimulations.addVariableDemandSchedules(variableDemandSchedule);
|
||||
}
|
||||
listBankVariableDemandSchedules.add(bankVariableDemandSimulations);
|
||||
}
|
||||
// Pour afficher les horaires avec demande modifiée
|
||||
SchedulesWindows.ShowSchedulesFrame variableDemandSchedulesViewer = new SchedulesWindows.ShowSchedulesFrame(listVariableDemandSchedules,"Variable Demand Schedules");
|
||||
|
||||
return listBankVariableDemandSchedules;
|
||||
}
|
||||
|
||||
private static List<BankAbsenceSchedules> GenerateAbsencesSchedules(List<SchedulesArray> initialSchedulesArrayList) {
|
||||
|
||||
RandomEngine r = new MersenneTwister(123456789);
|
||||
|
|
|
@ -8,6 +8,8 @@ package ScheduleUtil;
|
|||
import AbsenceSchedules.AbsenceSchedulesArray;
|
||||
import InitialSchedules.ParametersInitialSchedules;
|
||||
import SchedulesRecovery.RecoveredSchedulesArray;
|
||||
import VariableDemandSchedules.VariableDemandSchedulesArray;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author frabe
|
||||
|
@ -28,6 +30,18 @@ public class EmployeeCostCalculator {
|
|||
}
|
||||
return totalCost;
|
||||
}
|
||||
|
||||
public static int getFullVariableDemandScheduleCost( VariableDemandSchedulesArray myVariableDemandSchedule, ParametersInitialSchedules myScheduleParameters) {
|
||||
int totalCost = 0;
|
||||
|
||||
/* Coût spécifique à une augmentation de la demande */
|
||||
for(int p=0;p<myScheduleParameters.getWorkPeriodsPerSchedule();p++){
|
||||
totalCost += (myVariableDemandSchedule.getInitialSchedulesArrayVariableDemand().myParametersInitialSchedules.getRequiredWorkForce(p)-myScheduleParameters.getRequiredWorkForce(p))*
|
||||
myScheduleParameters.getWorkingPeriodCostOfFullTimeEmployeesPaidAtRegularHourlyRate()*1.5;
|
||||
}
|
||||
totalCost += getFullInitialScheduleCost(myVariableDemandSchedule.getInitialSchedulesArray(),myScheduleParameters);
|
||||
return totalCost;
|
||||
}
|
||||
|
||||
public static int getFullAbsenceScheduleCost( AbsenceSchedulesArray myAbsenceSchedule, ParametersInitialSchedules myScheduleParameters) {
|
||||
int totalCost = 0;
|
||||
|
|
|
@ -55,10 +55,8 @@ public class SchedulesArray {
|
|||
this.myParametersInitialSchedules = myParametersInitialSchedules;
|
||||
this.myParametersInitialSchedules.setRequiredWorkforce(VariableDemandVector);
|
||||
|
||||
this.partTimeSchedules = pteisa;
|
||||
this.fullTimeSchedules = fteisa;
|
||||
|
||||
this.totalScheduleCost = EmployeeCostCalculator.getFullInitialScheduleCost(this, myParametersInitialSchedules);
|
||||
this.partTimeSchedules = getDeepCopyEmployeesSchedules(pteisa);
|
||||
this.fullTimeSchedules = getDeepCopyEmployeesSchedules(fteisa);
|
||||
}
|
||||
|
||||
protected boolean[][] getDeepCopyEmployeesSchedules(boolean[][] schedules) {
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package VariableDemandSchedules;
|
||||
|
||||
public class ParametersVariableDemandSimulator {
|
||||
public static final double lambda = 2;
|
||||
public static final int numberVariableDemandSimulation = 1000;
|
||||
public static final int numberVariableDemandSimulation = 1;
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ public class VariableDemandSchedulesArray extends SchedulesArray {
|
|||
public VariableDemandSchedulesArray(SchedulesArray initialSchedulesArray, RandomEngine r) {
|
||||
super(initialSchedulesArray);
|
||||
this.initialSchedulesArray = initialSchedulesArray;
|
||||
generateDemandSimulation();
|
||||
generateDemandSimulation(r);
|
||||
this.totalScheduleCost = EmployeeCostCalculator.getFullVariableDemandScheduleCost(this, myParametersInitialSchedules);
|
||||
}
|
||||
|
||||
|
@ -19,7 +19,7 @@ public class VariableDemandSchedulesArray extends SchedulesArray {
|
|||
int[] vd = new VariableDemandVector(this.myParametersInitialSchedules.getWorkPeriodsPerSchedule(), r).getVariableDemandVector();
|
||||
int[] adjd = new int[this.myParametersInitialSchedules.getWorkPeriodsPerSchedule()];
|
||||
for (int p = 0; p < this.myParametersInitialSchedules.getWorkPeriodsPerSchedule(); p++) {
|
||||
adjd[p] = this.myParametersInitialSchedules.getRequiredWorkForce(p) + vd[p];
|
||||
adjd[p] = /*this.myParametersInitialSchedules.getRequiredWorkForce(p) + */vd[p];
|
||||
}
|
||||
|
||||
this.initialSchedulesArrayVariableDemand = new SchedulesArray(
|
||||
|
@ -33,4 +33,8 @@ public class VariableDemandSchedulesArray extends SchedulesArray {
|
|||
public SchedulesArray getInitialSchedulesArrayVariableDemand() {
|
||||
return initialSchedulesArrayVariableDemand;
|
||||
}
|
||||
|
||||
public SchedulesArray getInitialSchedulesArray() {
|
||||
return initialSchedulesArray;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
package VariableDemandSchedules;
|
||||
|
||||
import jdistlib.Poisson;
|
||||
import jdistlib.Binomial;
|
||||
import jdistlib.rng.RandomEngine;
|
||||
|
||||
public class VariableDemandVector {
|
||||
private final int[] VariableDemandVector;
|
||||
private int[] VariableDemandVector;
|
||||
|
||||
VariableDemandVector(int length, RandomEngine r) {
|
||||
VariableDemandVector = new int[length];
|
||||
Poisson p1 = new Poisson(ParametersVariableDemandSimulator.lambda);
|
||||
Binomial p1 = new Binomial(1,0.5);
|
||||
p1.setRandomEngine(r);
|
||||
for (int i = 0; i < length; i++) {
|
||||
VariableDemandVector[i] = (int) p1.random();
|
||||
|
|
Loading…
Add table
Reference in a new issue