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.*/ }
internal int getDistance(TSPGene g) { return(TSP.getDistance(city, g.city)); // int getDistance(City _city1, City _city2) }
public TSPGene(TSPGene g) // soit grâce à un autre gène qu’il faudra copier (pour la reproduction). { city = g.city; }