File: model1.mod - Tab length: 1 2 4 8 - Lines: on off - No wrap: on off

/*********************************************
 * OPL 12.6.2.0 Model
 * Author: Hadrien
 * Creation Date: 11 nov. 2016 at 19:34:20
 *********************************************/
 
 int numgroups = 4; // Le nombre de groupes
 
 range runners = 1..3*numgroups; // Il y a 3*numgroups coureurs (on suppose que chaque groupe contient 3 coureurs)
 range groups = 1..numgroups;
 
 int score[runners] = [7,5,17,32,16,1,4,10,11,6,5,3]; // Les scores de chaque coureur

 dvar boolean assignment[runners][groups]; // assignment[r][g] == 1 ssi le coureur r est dans le groupe g
 dvar int minimumScore; // Le score du groupe de plus petit score total
 dvar int maximumScore; // Le score du groupe de plus grand score total
 dexpr int scoreTotal[g in groups] = sum ( r in runners ) (assignment[r][g] * score[r]); // Le score total de chaque groupe
 
 minimize maximumScore-minimumScore;

 subject to {
 
    // Chaque groupe contient 3 coureurs
    forall( g in groups )
        sum( r in runners ) assignment[r][g] == 3;
       
    // Chaque coureur est dans un seul groupe
    forall( r in runners )
        sum( g in groups ) assignment[r][g] == 1;
       
    // minimumScore est inferieur au score total de chaque groupe
    forall( g in groups )
        scoreTotal[g] >= minimumScore;
       
    // maximumScore est superieur au score total de chaque groupe
    forall( g in groups )
        scoreTotal[g] <= maximumScore;
 }
 
 execute DISPLAY {
  writeln("On repartit les ",3*numgroups," coureurs en ",numgroups," groupes de 3 :");
  for(var g in groups) {
    write("Groupe ",g," (score total = ",scoreTotal[g],"):");
    for(var r in runners) {
        if (assignment[r][g] == 1) {
            write(" ",r,"(",score[r],")");  
        }
    }
    writeln("");
  }
}