internal override void Mutate()
 {
     /*L’opérateur de mutation consiste à changer la place d’un gène : on enlève un gène aléatoirement
      * et on le replace à un index tiré au sort. Cette mutation ne se fait que si on tire un nombre
      * inférieur au taux de mutation.*/
     if (Parameters.randomGenerator.NextDouble() < Parameters.mutationsRate)
     {
         int     index1 = Parameters.randomGenerator.Next(genome.Count); // Tirage d'une position au hazard.
         TSPGene g      = (TSPGene)genome.ElementAt(index1);             // On enregistre le gene tiré.
         genome.RemoveAt(index1);                                        // On retire ce géne du genome.
         int index2 = Parameters.randomGenerator.Next(genome.Count);     // On tire un gene au hazard.
         genome.Insert(index2, g);                                       // On insere notre 1er gene tiré a la position 2
     }
 }
        internal override double Evaluate()
        {
            int     totalKm = 0;
            TSPGene oldGene = null;

            foreach (TSPGene g in genome)
            {
                if (oldGene != null)
                {
                    totalKm += g.getDistance(oldGene);
                }
                oldGene = g;
            }
            totalKm += oldGene.getDistance((TSPGene)genome.FirstOrDefault());
            fitness  = totalKm;
            return(fitness);

            /*parcourir la liste des villes, et demander la distance entre les villes deux à deux.
             * Enfin, on n’oublie pas de rajouter la distance de la dernière à la première ville pour
             * boucler notre parcours.*/
        }
예제 #3
0
 internal int getDistance(TSPGene g)
 {
     return(TSP.getDistance(city, g.city));
     // int getDistance(City _city1, City _city2)
 }
예제 #4
0
 public TSPGene(TSPGene g)         //  soit grâce à un autre gène qu’il faudra copier (pour la reproduction).
 {
     city = g.city;
 }