// Mutation de quelques gènes de la population pour en produire de nouvelles
        public void Mutation(int nombreMutation)
        {
            int i = 0;

            while (i < nombreMutation)
            {
                Random       r           = new Random();
                int          randomIndex = r.Next(0, maGeneration.Count);
                Chemin       chemin      = maGeneration[randomIndex];
                List <Ville> mesVilles   = new List <Ville>(chemin.MesVilles);
                int          nombreVille = mesVilles.Count;
                int          indexVille1 = r.Next(0, nombreVille);
                int          indexVille2 = r.Next(0, nombreVille);

                while (indexVille2 == indexVille1)
                {
                    indexVille2 = r.Next(nombreVille);
                }
                List <Ville> resultVilles = Swap(mesVilles, indexVille1, indexVille2);
                Chemin       cheminFinal  = new Chemin(resultVilles);
                if (ComparerChemin(cheminFinal, maPopulation) == 0)
                {
                    maPopulation.Add(cheminFinal);
                    i++;
                }
            }
        }
        public int ComparerChemin(Chemin chemin, List <Chemin> maListe)
        {
            var cnt = from c in maListe
                      where c.ToString() == chemin.ToString()
                      select c;

            return(cnt.Count());
        }
        // Faire un mélange de la génération à l'aide d'un CrossOver
        public void XOver(int nombreCross)
        {
            for (int index = 0; index < nombreCross; index++)
            {
                int taille     = maGeneration[0].MesVilles.Count;
                int partition1 = taille / 2;

                List <Ville>  CrossVille    = new List <Ville>();
                List <Chemin> CrossChemin   = new List <Chemin>();
                List <Ville>  portionDroite = new List <Ville>();

                Random r            = new Random();
                int    nombreChemin = 2;
                int    randomIndex1 = r.Next(0, maGeneration.Count);

                Chemin chemin1 = maGeneration[randomIndex1];
                Chemin chemin2;
                CrossChemin.Add(chemin1);

                while (nombreChemin != 1)
                {
                    int randomIndex2 = r.Next(0, maGeneration.Count);
                    if (randomIndex2 != randomIndex1)
                    {
                        chemin2 = maGeneration[randomIndex2];
                        CrossChemin.Add(chemin2);
                        nombreChemin--;
                    }
                }

                for (int i = 0; i < partition1; i++)
                {
                    CrossVille.Add(CrossChemin[0].MesVilles[i]);
                    //resultVilles.Add(CrossChemin[0].MesVilles[i]);
                }

                for (int i = partition1; i < taille; i++)
                {
                    CrossVille.Add(CrossChemin[1].MesVilles[i]);
                    portionDroite.Add(CrossChemin[0].MesVilles[i]);
                }

                List <Ville> VillesDoublons = CheckDoublon(CrossVille);

                List <Ville> resultVilles = CheminSansDoublon(VillesDoublons, portionDroite, CrossVille);

                Chemin resultChemin = new Chemin(resultVilles);

                if (ComparerChemin(resultChemin, maPopulation) == 0)
                {
                    maPopulation.Add(resultChemin);
                }
            }
        }
        // Générer la première génration de population
        public void GetFirstGen()
        {
            int combinaisons = FirstGeneration;

            while (combinaisons != 0)
            {
                Chemin chemin = new Chemin(mesVilles.OrderBy(a => Guid.NewGuid()).ToList());
                if (ComparerChemin(chemin, maGeneration) == 0)
                {
                    maGeneration.Add(chemin);
                    combinaisons--;
                }
            }
        }
        public Chemin GetMeilleurCheminDeLaPopulation()
        {
            Chemin top = null;

            foreach (Generation gs in this.mesGenerations)
            {
                foreach (Chemin c in gs.GetGeneration)
                {
                    if (top is null)
                    {
                        top = c;
                    }
                    else
                    {
                        if (c.Score < top.Score)
                        {
                            top = c;
                        }
                    }
                }
            }
            return(top);
        }