From 9a71341993b8d4e72cdb836bf0a78b0394eb1697 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Pelletier?= Date: Sat, 3 Feb 2018 11:36:47 -0500 Subject: [PATCH] =?UTF-8?q?cette=20version=20donne=20une=20solution=20corr?= =?UTF-8?q?ecte=20avec=20la=20contrainte=20du=20nombre=20minimal=20d'emplo?= =?UTF-8?q?y=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tp/code/ProductionHoraire.java | 47 +++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/tp/code/ProductionHoraire.java b/tp/code/ProductionHoraire.java index 738c490..a7228ef 100644 --- a/tp/code/ProductionHoraire.java +++ b/tp/code/ProductionHoraire.java @@ -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 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(); } }