public Population evoluerPopulation(Population pop) { Population nouvellePopulation = new Population(pop.getTaillePopulation(), new GestionnaireChemin()); int elitismeOffset = 0; if (this.elitisme) { nouvellePopulation.sauvegarderCircuit(pop.getMeilleurChemin()); elitismeOffset = 1; } // On effectue le tournoi for (int i = elitismeOffset; i < nouvellePopulation.getTaillePopulation(); i++) { Chemin parent1 = selectionTournoi(pop); Chemin parent2 = selectionTournoi(pop); Chemin enfant = crossover(parent1, parent2); nouvellePopulation.sauvegarderCircuit(enfant); } // On fait muter les nouveux éléments ! for (int i = elitismeOffset; i < nouvellePopulation.getTaillePopulation(); i++) { this.muter(nouvellePopulation.getChemin(i)); } return(nouvellePopulation); }
public static void linqTest() { GestionnaireChemin gc = new GestionnaireChemin(); Chemin chemin = new Chemin(gc); Console.WriteLine("Evaluation du meilleur chemin, veuillez patienter ..."); // Initialisation de la population Population pop = new Population(NBPOPULATION, gc); //Console.WriteLine("Distance initiale = " + pop.getMeilleurChemin().getDistance()); // Evolution de la population sur 100 générations Algorithme ga = new Algorithme(gc); pop = ga.evoluerPopulation(pop); for (int i = 0; i < NBGENERATION; i++) { pop = ga.evoluerPopulation(pop); Console.WriteLine("Gen " + i + " : " + pop.getMeilleurChemin().getDistance()); } Console.WriteLine("Distance finale = " + pop.getMeilleurChemin().getDistance()); Chemin meilleurePopulation = pop.getMeilleurChemin(); }
public void muter(Chemin cheminAMuter) { Random rand = new Random(); for (int i = 0; i < cheminAMuter.tailleChemin(); i++) { if (rand.NextDouble() < tauxMutation) { double j = cheminAMuter.tailleChemin() * rand.NextDouble(); Ville ville1 = cheminAMuter.getVilleInChemin((int)i); Ville ville2 = cheminAMuter.getVilleInChemin((int)j); cheminAMuter.setVille((int)j, ville1); cheminAMuter.setVille(i, ville2); } } }
public Chemin crossover(Chemin parent1, Chemin parent2) { Chemin enfant = new Chemin(this.gc); Random rand = new Random(); int positionStart = (int)(rand.NextDouble() * parent1.tailleChemin()); int positionEnd = (int)(rand.NextDouble() * parent1.tailleChemin()); // On voit si on ajoute le parent 1 for (int i = 0; i < enfant.tailleChemin(); i++) { // On set la ville de l'enfant par le parent if (positionStart < positionEnd && i > positionStart && i < positionEnd) { enfant.setVille(i, parent1.getVilleInChemin(i)); } else if (positionStart > positionEnd) { if (!(i < positionStart && i > positionEnd)) { enfant.setVille(i, parent1.getVilleInChemin(i)); } } } for (int i = 0; i < parent2.tailleChemin(); i++) { if (!(enfant.contientVille(parent2.getVilleInChemin(i)))) { for (int j = 0; i < enfant.tailleChemin(); i++) { if (enfant.getVilleInChemin(j) == null) { enfant.setVille(j, parent2.getVilleInChemin(j)); } } } } return(enfant); }
public Chemin getMeilleurChemin() { try { Chemin meilleurCheminARenvoyer = this.lesCheminsRetenus[0]; for (int i = 1; i < this.lesCheminsRetenus.Count; i++) { if (meilleurCheminARenvoyer.getDistance() > this.lesCheminsRetenus[i].getDistance()) { meilleurCheminARenvoyer = this.lesCheminsRetenus[i]; } } return(meilleurCheminARenvoyer); } catch (Exception e) { Console.WriteLine("Erreur dans le meilleur chemin a renvoyer !"); } return(null); }
public void sauvegarderCircuit(Chemin cheminASauvegarder) { this.lesCheminsRetenus.Add(cheminASauvegarder); }