cette version donne une solution correcte avec la contrainte du nombre minimal d'employés

This commit is contained in:
François Pelletier 2018-02-03 11:36:47 -05:00
parent 9798a6f3b8
commit 9a71341993

View file

@ -2,10 +2,15 @@ import java.nio.file.*;
import java.io.IOException;
import java.util.*;
import org.chocosolver.solver.Model;
import org.chocosolver.solver.variables.IntVar;
import org.chocosolver.solver.variables.BoolVar;
import org.chocosolver.solver.Solver;
import org.chocosolver.solver.search.limits.FailCounter;
public class ProductionHoraire {
public static final int N_PERIODE = 16;
public static void main(String[] args) {
String instancePath = args[0];
// lecture des lignes du fichier d'instance
@ -41,7 +46,7 @@ public class ProductionHoraire {
List<Integer> nbEmployesSouhaite = new ArrayList<>();
for (String s: strLigne3) {
Integer i = Integer.valueOf(s);
nbEmployesRequis.add(i);
nbEmployesSouhaite.add(i);
}
// Vérification du fichier d'instance
@ -51,12 +56,46 @@ public class ProductionHoraire {
System.out.println("MAX_H="+MAX_H.toString());
System.out.println("MIN_PERIODE="+MIN_PERIODE.toString());
System.out.println("nbEmployesRequis="+nbEmployesRequis.toString());
System.out.println("nbEmployesSouhaite="+nbEmployesRequis.toString());
System.out.println("nbEmployesSouhaite="+nbEmployesSouhaite.toString());
System.out.println("### Fin Validation Lecture Instance ###");
Model model = new Model("Production Horaire");
// Création d'une matrice de dimensions N x N_PERIODE de variables E(i,j) dont les domaines sont des variables binaires.
// E(i,j)=0 signifie que l'employé i est au repos à la période j.
// E(i,j)=1 signifie que l'employé i travaille à la période j.
BoolVar[][] LignesE = model.boolVarMatrix("E",N,N_PERIODE);
BoolVar[][] ColonnesE = new BoolVar[N_PERIODE][N];
for (int i = 0; i < N_PERIODE; i++) {
for (int j = 0; j < N; j++) {
ColonnesE[i][j] = LignesE[j][i];
}
}
// Contrainte du nombre requis d'employés
IntVar[] IVnbEmployesRequis = new IntVar[N_PERIODE];
for (int i=0; i < N_PERIODE; i++) {
IVnbEmployesRequis[i] = model.intVar(nbEmployesRequis.get(i));
model.sum(ColonnesE[i], ">=", IVnbEmployesRequis[i]).post();
}
// Contrainte du motif d'horaire
// Creation du solveur
Solver solver = model.getSolver();
// Résolution du modèle
solver.findSolution();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N_PERIODE; j++) {
System.out.print(LignesE[i][j].getValue());
System.out.print(" ");
}
System.out.println("");
}
solver.printStatistics();
}
}