effectivement, je dois garder la taille de la population initiale.
le problème est lors du crossover je dois garder les deux meilleurs chromosomes parmi les parents et les enfants produits aprés avoir evalué les enfants.
j'explique un peu comment se fait le crossover :
je tire au hasard deux chromosomes parmi ceux qui sont aptes à se reproduire et je les croise ensuite j'évalue les enfants, aprés je trie les deux enfants et les parents dans une liste de quatre chromosomes suivant leurs fitness et j'en prend les deux meilleurs
voici un listing de la méthode crossover :
public Population doCrossover(){ newPop = new Population(oldPop.getPopSize()); newPop.setCrossoverProb(oldPop.getCrossoverProb()); newPop.setMutationProb(oldPop.getMutationProb()); //newPop = (Population) oldPop.clone(); Random rn = new Random(); ArrayList listchromosom = new ArrayList(); ArrayList<ChromosomeModel> listEnfParents; ArrayList<ChromosomeModel> list = new ArrayList<ChromosomeModel>(); listchromosom = listChromosome(); int indicePere, indiceMere,l=0; ChromosomeModel pere,mere; System.out.println("le nombre de chromosomes selectionne pr le crossover est :"+listchromosom.size()); for(int i = 0 ; i < listchromosom.size() ; i++){ System.out.println(listchromosom.get(i)); } for(int i =0 ; i < listchromosom.size()/2; i++){ indicePere = rn.nextInt(listchromosom.size()); indiceMere = rn.nextInt(listchromosom.size()); pere = oldPop.getChromosome(listchromosom.get(indicePere)); mere = oldPop.getChromosome(listchromosom.get(indiceMere)); if(pere.equals(mere)==false){ listEnfParents = new ArrayList<ChromosomeModel>(); l++; int k = (rn.nextInt(19)+1)*10; System.out.println("le pt de croisement est "+ k); ChromosomeModel enf1 = new Chromosom(oldPop.getChromosomeSize(0)); ChromosomeModel enf2 = new Chromosom(oldPop.getChromosomeSize(0)); enf1.setGenome(0, k-1, pere.getGenome(0,k-1)); enf1.setGenome(k, enf1.getChromosomeSize()-1, mere.getGenome(k,enf1.getChromosomeSize()-1)); enf2.setGenome(0, k-1, mere.getGenome(0,k-1)); enf2.setGenome(k, enf2.getChromosomeSize()-1, pere.getGenome(k,enf2.getChromosomeSize()-1)); enf1 = fitnessFunction.evaluateChromosome(enf1); enf2 = fitnessFunction.evaluateChromosome(enf2); enf1.setMere(listchromosom.get(indiceMere)); enf1.setPere(listchromosom.get(indicePere)); enf2.setMere(listchromosom.get(indiceMere)); enf2.setPere(listchromosom.get(indicePere)); listEnfParents.add(enf1); listEnfParents.add(enf2); listEnfParents.add(pere); listEnfParents.add(mere); //newPop.removeChromosome(oldPop.getChromosome(listchromosom.get(indicePere))); //newPop.removeChromosome(oldPop.getChromosome(listchromosom.get(indiceMere))); //oldPop.getChromosome(listchromosom.get(indicePere)).setCrossed(true); //oldPop.getChromosome(listchromosom.get(indiceMere)).setCrossed(true); list.add(pere); list.add(mere); listEnfParents = trierList(listEnfParents); System.out.println("le pere est :" +pere.toString()); System.out.println("la mere est :" +mere.toString()); newPop.addChromosome(listEnfParents.get(0)); newPop.addChromosome(listEnfParents.get(1)); System.out.println("l'enfant 1 du pere "+enf1.getPere()+" et mere "+enf1.getMere()+":" + enf1.toString()); System.out.println("l'enfant 1 fitness :"+enf1.getFitnessValue()); System.out.println("l'enfant 2 du pere "+enf2.getPere()+" et mere "+enf2.getMere()+":" + enf2.toString()); System.out.println("l'enfant 2 fitness :"+enf2.getFitnessValue()); } } System.out.println("le nombre de coisement :"+l); System.out.println("la taille de la newPop :"+newPop.getPopSize()); System.out.println("le nombre de chromosome a remove :"+list.size()); //for(int i = 0;i<oldPop.getPopSize(); i++){ //if(oldPop.getChromosome(i).isCrossed()==false) //newPop.addChromosome(oldPop.getChromosome(i)); //} l=0; oldPop.removeChromosoms(list); System.out.println("la taille de la oldPop apres remove :"+oldPop.getPopSize()); /*for(int i=0; i<oldPop.getPopSize(); i++){ if(!oldPop.getChromosome(i).isCrossed()) { newPop.addChromosome(oldPop.getChromosome(i)); l++; } }*/ System.out.println("le nombre de chromosome conserves :"+l); //for(int i=0; i<newPop.getPopSize(); i++) //{ //oldPop.addChromosome(newPop.getChromosome(i)); //} //System.out.println("la taille de pop avant croisement est :"+newPop.getPopSize()); for(int i=0;i<oldPop.getPopSize();i++){ //if(!oldPop.getChromosome(i).isCrossed()) newPop.addChromosome(oldPop.getChromosome(i)); } //System.out.println("la taille de pop apres croisement est :"+newPop.getPopSize()); //for(int i=0; i<newPop.getPopSize(); i++){ //newPop.getChromosome(i).setCrossed(false); //} for(int i=0; i<newPop.getPopSize(); i++) newPop.getChromosome(i).setCrossed(false); System.out.println("la taille de la population lors de sortie du crossove "+newPop.getPopSize()); return newPop; }