// 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); }