예제 #1
0
        //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);
        }
예제 #2
0
 //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)));
 }
예제 #3
0
        //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);
        }
예제 #4
0
        //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);
        }
예제 #5
0
 //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));
 }
예제 #6
0
        //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);
        }