//Le tableau de la semaine k contient à l'indice i le groupe qui collera avec le colleur i public static List <int> Construit_semaine_k(List <Colleur> colleurs, List <Groupes> groupes, string Matière) { List <int> semaineK = new List <int>(); Groupes[] temp = new Groupes[groupes.Count]; Groupes[] temp2 = new Groupes[groupes.Count]; groupes.CopyTo(temp); groupes.CopyTo(temp2); List <Groupes> groupe_copy = temp.ToList(); List <Groupes> groupes2 = temp2.ToList(); List <(Colleur, int)> Colleurs_unmatched = new List <(Colleur, int)>(); for (int k = 0; k < colleurs.Count; k++) { bool matched = false; if (groupe_copy.Count == 0) { break; } for (int i = 0; i < groupe_copy.Count; i++) { bool faisable = Colle_possible(groupe_copy[i], colleurs[k]); if (faisable && !semaineK.Contains(groupe_copy[i].numéro)) { semaineK.Add(groupe_copy[i].numéro); groupes[i].indisponibilités_colles.Add(colleurs[k].Créneau); groupes.RemoveAt(i); groupe_copy.RemoveAt(i); matched = true; break; } } if (!matched) { Colleurs_unmatched.Add((colleurs[k], k)); semaineK.Add(-1); } } for (int i = 0; i < groupe_copy.Count; i++) { (Colleur colleur, int k) = Colleurs_unmatched[i]; for (int j = 0; j < semaineK.Count; j++) { if (semaineK[j] >= 0 && j < groupes2.Count && echange_colle(groupe_copy[i], groupes2[j], colleur, colleurs[j])) { int ancien = semaineK[j]; groupes2[j].indisponibilités_colles.Add(colleur.Créneau); semaineK[k] = ancien; semaineK[j] = groupe_copy[i].numéro; groupe_copy[i].indisponibilités_colles.Add(colleurs[j].Créneau); break; } } } while (semaineK.Count < colleurs.Count) { semaineK.Add(-1); } return(semaineK); }
//Fonction qui indique si une colle est possible pour le groupe spécifié avec le colleur spécifié public static bool Colle_possible(Groupes groupe, Colleur colleur) { foreach (Eleves membre in groupe.Membres) { if (membre.Has_horaire(colleur.Créneau, membre.indisponibilités)) { return(false); } } // return true; return(!(groupe.indisponibilités_colles.Contains(colleur.Créneau))); }
//Fonction qui mélange le groupe donné en argumant public static List <Groupes> shuffle_groupes(List <Groupes> groupes) { int n = groupes.Count; List <Groupes> shuffled = groupes.Select(book => book.Clone()).ToList(); while (n > 1) { n--; Random rng = new Random(); int k = rng.Next(n + 1); Groupes value = shuffled[k]; shuffled[k] = shuffled[n]; shuffled[n] = value; } return(shuffled); }
//Fonction qui permet l'explosion d'un groupe et sa répartition dans les autres groupes de la même LV1 public static void Explose_groupe_k(List <Groupes> liste_groupes, List <Groupes> groupe_langue, int k) { int nb_membres = groupe_langue[k].Get_count(); int nb_groupes_langues = groupe_langue.Count - 1; //on ne compte pas le groupe à dissoudre Groupes temp = groupe_langue[k]; groupe_langue.RemoveAt(k); int i = 0; while (i < nb_membres && temp.Get_count() > 0) { groupe_langue[i].Membres.Add(temp.Membres[0]); temp.Membres.RemoveAt(0); i++; i = i == nb_groupes_langues ? i = 0 : i; } liste_groupes.Remove(temp); }
//Fonction permettant de savoir s'il est possible déchanger deux colles public static bool echange_colle(Groupes groupe1, Groupes groupe2, Colleur colleur1, Colleur colleur2) //Groupe 1 et colleur 1 sont les défaillants { //On doit donc tester les combis groupe2 colleur1 et groupe1 colleur2 return(Colle_possible(groupe2, colleur1) && Colle_possible(groupe1, colleur2)); }
//Fonction qui construit le groupe d'indice k en triant selon les options. A tester. public static (Groupes, List <Eleves>) Construit_groupe_k_option(int k, List <Eleves> liste_élèves) { (int, List <int>) nb_occurence(List <Eleves> liste, string elem) { int s = 0; List <int> indice = new List <int>(); for (int i = 0; i < liste.Count; i++) { if (liste[i].options[0] == elem) { s++; indice.Add(i); } } return(s, indice); } int nb = 0; string OptionRetenue = liste_élèves[0].options[0]; List <int> indices = new List <int>(); (nb, indices) = nb_occurence(liste_élèves, OptionRetenue); int capacité; int surplus; (capacité, surplus) = nb % 3 == 0 ? (3, 0) : (nb / 3, nb % 3); if (surplus != 0 && capacité <= 3) { switch (nb) { case 4: capacité = 4; surplus = 0; break; case 5: capacité = 2; surplus = 3; break; case 7: capacité = 4; break; case 8: capacité = 4; surplus = 4; break; default: break; } } else if (capacité == 0) { capacité = surplus; } else { capacité = 3; } List <Eleves> members = new List <Eleves>(); members.Add(liste_élèves[0]); for (int i = 1; i < capacité; i++) { members.Add(liste_élèves[indices[i]]); } List <Eleves> àsuppr = new List <Eleves>(); àsuppr.Add(liste_élèves[0]); for (int i = 0; i < capacité; i++) { àsuppr.Add(liste_élèves[indices[i]]); } for (int i = 0; i < àsuppr.Count; i++) { liste_élèves.Remove(àsuppr[i]); } Groupes groupe = new Groupes(k, OptionRetenue, members, new List <string>()); return(groupe, liste_élèves); }