Bonjour,
J'essaye d'implémenter un algo génétique mais j'ai un problème avec Collections.sort
Il me trie bien mes individus mais une seule fois, je ne comprends pas.
Voilà mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 public class Population { private List<Individu> pop = new ArrayList<Individu>(); .... // CONSTRUCTOR public Population(int taille, int nbIteration){ this.nbIteration = nbIteration; for(int i=0; i<taille; i++){ pop.add(new Individu()); } } // Fin constructor // ALGORITHME GENETIQUE public void algo_genetique(){ List<Individu> mutants = new ArrayList<Individu>(); List<Individu> meilleurs = new ArrayList<Individu>(); int k = 0; while(k < nbIteration){ for(int i=0; i<pop.size(); i++){ pop.get(i).getFitness(); } Collections.sort(pop); // Garde les N Meilleurs individuis selon leur rang (indice 0 étant le meilleur) meilleurs = meilleursIndividus(pourcentage); // Mutation mutants = mutation(meilleurs, tauxMutation); for(int i=0; i<mutants.size(); i++){ meilleurs.add(mutants.get(i)); } System.out.println("\nGeneration: " + k + " competence: " + meilleurs.get(0).getFitness() +"\n"); pop = meilleurs; k++; } }
et l'implementation de comparator
Quelqu'un pourrait m'aider à trouver ce qui cloche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 public class Individu implements Cloneable, Comparable<Individu>{ // Intervalle de solutions private int valMin = -25; private int valMax = 25; private double fitness = -1; private int[] genotype = new int[25]; // Constructeur1 public Individu(){ for(int i=0; i<25; i++){ int elt = (int)(Math.random() * ((valMax - valMin) + 1) + valMin ); this.genotype[i] = elt; } } // Constructeur Copie public Individu clone() throws CloneNotSupportedException{ Individu copie = (Individu)super.clone(); copie.genotype = new int[genotype.length]; System.arraycopy(genotype, 0, copie.genotype, 0 , genotype.length); return copie; } // Methodes public int compareTo(Individu ind) { double fit1 = ((Individu) ind).getFitness(); double fit2 = this.getFitness(); if (fit1 > fit2) return -1; else if(fit1 == fit2) return 0; else return 1; } public double getFitness() { if(this.fitness == -1) { this.fitness = Competence.getFitness(this); System.out.println("Calcul fitness de l'individu : "); this.afficheIndividu(); System.out.println("Calcul fitness => " + this.fitness); } //System.out.println("retourne fitness "); return this.fitness; } }
Merci.
Partager