Algorithme génétique

awall2954 Messages postés 11 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 9 janvier 2010 - Modifié le 9 nov. 2023 à 20:34
cs_ronii Messages postés 2 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 9 juin 2009 - 9 juin 2009 à 12:09

Bonjour,
je suis entrain de programmer un algorithme génétique pour la minimisation d'une fonction,
j'ai implémenter toutes les classes nécessaires mais mon probléme est que je dois garder la taille de la population (40 par exemple) d'une génération à une autre, les chromosomes sont ajouter dés leurs création dans un ArrayList mais lors de l'exécution la taille de la population s'explose aprés les opération génétiques voici un morceau de mon code de la classe principale:

public class MainClasse {
    public MainClasse(){}
   
    public static void main(String[] args){
        Population population;
        Population newPopulation;
        NetworkModel neuralNetwork;
        LearningData data;
        SelectionModel selection;
        FitnessFunction fitnessFunction;
        Evaluation evaluation;
        Crossover1 crossover;
        Mutation mutation;
        population = new Population(40,0.05f,0.5f);
        newPopulation = new Population(population.getPopulationSize());
        neuralNetwork = new Network(4,1);
        data = new LearningData("G:/Projet/datasets/project4.dat");
        data.learnData();
        fitnessFunction = new FitnessFunction(neuralNetwork, data);
        evaluation = new Evaluation(population, fitnessFunction);
        selection = new Tournement();
        crossover = new Crossover1();
        crossover.setFitnessFunction(fitnessFunction);
        mutation = new Mutation();
        population = (Population) evaluation.getGeneratedPop().clone();
        System.out.println("la taille de la pop apres evaluation est:"+population.getPopSize());
        //start of  algorithm
        for(int i = 0; i<2;i++){
            System.out.println("iteration number :"+i);
            System.out.println("la taille de la pop :"+population.getPopSize());
            selection.setPopulation(population);
            newPopulation = (Population) selection.doSelection().clone();
            System.out.println("les chromosome selectionner");
            for(int j=0; j<population.getPopSize(); j++){
                System.out.println("le chromosome N"+(int)(j+1)+" de fitness:"+newPopulation.getChromosome(j).getFitnessValue()+" de probSel:"+newPopulation.getChromosome(j).getSelectionProb()+" ProbCumul :"+newPopulation.getChromosome(j).getCumulSelectionP());
            }
            crossover.setPopulation(newPopulation);
            newPopulation = (Population) crossover.doCrossover().clone();
            mutation.setPopulation(newPopulation);
            mutation.doMutation();
            newPopulation = (Population) mutation.getMutedPop().clone();
            //population = (Population) newPopulation.clone();
            evaluation.setPopulation(newPopulation);
            newPopulation = (Population) evaluation.getGeneratedPop().clone();
            System.out.println("les chromosome apres crossover et mutation");
            for(int j=0; j<population.getPopSize(); j++){
                System.out.println("le chromosome N"+(int)(j+1)+" de fitness:"+newPopulation.getChromosome(j).getFitnessValue()+" de probSel:"+newPopulation.getChromosome(j).getSelectionProb()+" ProbCumul :"+newPopulation.getChromosome(j).getCumulSelectionP());
            }
            population = (Population) newPopulation.clone();
            newPopulation.removeAll();
            //newPopulation.removeAll();
    }
        population.populationTofile("G:/Projet/datasets/predict.dat");
        //end of learning algorithm
    }
}



aprés deux iterations la taille de la population devient 60 imaginez 100 iterations (20000)
Merci de me répondre si vous avez une idée sur comment contourner ce problème

3 réponses

awall2954 Messages postés 11 Date d'inscription mercredi 28 avril 2004 Statut Membre Dernière intervention 9 janvier 2010 1
Modifié le 9 nov. 2023 à 20:35

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;
    }
1
wamdeus Messages postés 46 Date d'inscription mercredi 2 janvier 2008 Statut Membre Dernière intervention 4 décembre 2008
13 mai 2008 à 14:40
Je dois avouer que la biologie c'est pas mon truc du tout mais la je comprend pas la question , tu veux garder le meme nombre de chromosome a chaque itération .?.? mais tu veut garde quelle chromosome .? ceux d'avant ou ceux d'apres
si c'est ceux d'apres je te conseil d'écraser l'arraylist de ta population de base  et mettre la population d'apres mais bon c'est a toi de me dire si j'ai bien compris

la seul chose qui arrive a la cheville de chuck norris ce sont ces chaussettes!!!
0
cs_ronii Messages postés 2 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 9 juin 2009
9 juin 2009 à 12:09
Bonjour awall2954, pour ton croisement tu as utilisé quel type?? PMX,UX,OX...
0
Rejoignez-nous