J'organise actuellement un évènement avec des étudiants de mon école.
J'ai pour cela responsabilité de créer des groupes d'élèves.
Afin de satisfaire tout le monde j'ai fait un sondage afin de savoir qui veut etre avec qui.
J'ai un petit problème afin de modéliser tout cela.
Il y a 157 étudiants, je n'ai pas de groupe limité, il faut au moins 2 personnes par groupe.
La sortie du sondage est une table de 157*157, avec des 1 quand un étudiant veut etre avec un autre.
Sachant que si étudiant A signale qu'il souhaite être avec un B, le B n'a pas obligatoirement signalé qu'il souhaitait etre avec l'élève A.
Je suis actuellement partie sur une optimisation PLNE (Programmation Linéaire en Nombre Entiers).
Entrée : la matrice des voeux
Variable d'optimisation : matrice d'affectation d'un élève à un groupe, matrice 157lignes*79colonnes (minimum de 2 personnes par groupe)
Fonction d'optimisation : c'est la que je bloque, pour le moment j'ai ca :
- Code: Tout sélectionner
sum(e1 in Etudiants,e2 in Etudiants,g in Groupes)
affectations[e1][g] * voeuxEtudiants[e1][e2] +
sum(e1 in Etudiants,e2 in Etudiants,g in Groupes)
affectations[e2][g] * voeuxEtudiants[e1][e2]
Contrainte d'optimisation :
- 1 étudiant n'appartient qu'a un seul groupe
- 2 étudiants mini par groupe
Je donne mon code entier, sachant que j'utilise IBM ILOG CPLEX Optimization Studio :
- Code: Tout sélectionner
int nbEtudiants = 157;
int nbGroupes = 79;
range Etudiants = 1..nbEtudiants;
range Groupes = 1..nbGroupes;
int voeuxEtudiants[Etudiants][Etudiants] = ...; (peuplé avec des 1 a l'intersection des vux, pas déchelle de volonté)
dvar boolean affectations[Etudiants][Groupes] in 0..1;
maximise
sum(e1 in Etudiants, e2 in Etudiants, g in Groupes)
affectations[e1][g] * voeuxEtudiants[e1][e2] +
sum(e1 in Etudiants, e2 in Etudiants, g in Groupes)
affectations[e2][g] * voeuxEtudiants[e1][e2];
subject to {
forall(e in Etudiants)
ctChaqueEtudiantNaQuunEtUnSeulGroupe:
sum(g in Groupes) affectations[e][g] == 1;
forall(g in Groupes)
ctMini2EtudiantsParGroupe:
sum(e in Etudiants) affectations[e][g] >= 2;
}
Si quelqu'un a une idée pour modéliser ce problème qui semble pourtant simple, je serais ravis
Merci bcp !
Gabriel
