Пример #1
0
        private static List <Chemin> GenerateMutations(Generation gen, int mutationsNumber)
        {
            List <Chemin> result = new List <Chemin>();

            while (result.Count < mutationsNumber)
            {
                int rndCheminIndex = random.Next(gen.listeChemins.Count);

                //Choisir deux chemins randoms
                int rnd1 = random.Next(gen.listeChemins[rndCheminIndex].listeVilles.Count);
                int rnd2 = random.Next(gen.listeChemins[rndCheminIndex].listeVilles.Count);
                // Test pour être sûr d'avoir des randoms diff
                while (rnd2 == rnd1)
                {
                    rnd2 = random.Next(gen.listeChemins[rndCheminIndex].listeVilles.Count);
                }
                // faire une mutation
                List <Ville> newListVilles = new List <Ville>(gen.listeChemins[rndCheminIndex].listeVilles);
                // On stocke la 1e ville pour pas la perdre
                var tmp = gen.listeChemins[rndCheminIndex].listeVilles[rnd1];

                //On remplace la liste à l'index rnd1 avec le contenu à l'index rnd2 et l'index rnd2 celui contenu dans tmp
                newListVilles[rnd1] = newListVilles[rnd2];
                newListVilles[rnd2] = tmp;

                var newChemin = new Chemin(newListVilles);
                if (!result.Contains(newChemin))
                {
                    result.Add(newChemin);
                }
            }
            return(result);
        }
Пример #2
0
        private static List <Chemin> GenerateXOver(Generation gen, int XOversNumber)
        {
            //TODO : test number de Xover possible ???
            List <Chemin> result = new List <Chemin>();

            while (result.Count < XOversNumber)
            {
                //Choisir deux chemins randoms
                int rnd1 = random.Next(gen.listeChemins.Count);
                int rnd2 = random.Next(gen.listeChemins.Count);
                // Test pour être sûr d'avoir des randoms diff
                while (rnd2 == rnd1)
                {
                    rnd2 = random.Next(gen.listeChemins.Count);
                }

                // Choix de pivot aléatoire optimal
                int pivotStart    = ChoixDebutPivot(gen.listeChemins[rnd1], gen.listeChemins[rnd2]);
                int pivotPosition = random.Next(pivotStart, gen.listeChemins[0].listeVilles.Count);

                // Generation XOvers bruts
                List <Ville> newListVilles = new List <Ville>();
                for (int i = 0; i <= pivotPosition; i++)
                {
                    newListVilles.Add(gen.listeChemins[rnd1].listeVilles[i]);
                }
                for (int i = pivotPosition + 1; i < gen.listeChemins[0].listeVilles.Count; i++)
                {
                    newListVilles.Add(gen.listeChemins[rnd2].listeVilles[i]);
                }

                // Netoyage : Suppression des doublons dans la liste des villes
                var doublons  = new Chemin(newListVilles).GetDoublons();
                var remaining = new Chemin(newListVilles).GetRemaining(gen.listeChemins[0].listeVilles);

                // Normalement doublons.Count == remaining.Count
                if (doublons.Count != remaining.Count)
                {
                    Console.Error.WriteLine("Warning : doublons.Count != remaining.Count !");
                }

                // On parcours les doublons et on replace par les remainings
                for (int i = 0; i < doublons.Count; i++)
                {
                    newListVilles[newListVilles.LastIndexOf(doublons[i])] = remaining[i];
                }
                var newChemin = new Chemin(newListVilles);

                result.Add(newChemin);
            }
            return(result);
        }
Пример #3
0
        private static List <Chemin> GenerateRandomChemins(List <Ville> villes, int cheminsNumber)
        {
            List <Chemin> result = new List <Chemin>();

            while (result.Count < cheminsNumber)
            {
                Chemin newChemin = new Chemin(villes.OrderBy(a => Guid.NewGuid()).ToList());
                if (!result.Contains(newChemin))
                {
                    result.Add(newChemin);
                }
            }
            return(result);
        }
Пример #4
0
        private static int ChoixDebutPivot(Chemin c1, Chemin c2)
        {
            int pivot = 1;

            for (int i = 0; i < c1.listeVilles.Count - 1; i++)
            {
                if (c1.listeVilles[i] != c2.listeVilles[i])
                {
                    pivot = i;
                    break;
                }
            }
            return(pivot);
        }