Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : algorithme génétique [ Algorithme / Maths ] (awall2954)

mardi 13 mai 2008 à 13:23:03 | algorithme génétique

awall2954


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

mardi 13 mai 2008 à 14:40:19 | Re : algorithme génétique

wamdeus

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!!!

mardi 13 mai 2008 à 14:57:20 | Re : algorithme génétique

awall2954

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<Integer> listchromosom = new ArrayList<Integer>();
        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;
    }



Cette discussion est classé dans : evaluation, clone, mutation, population, newpopulation


Répondre à ce message

Sujets en rapport avec ce message

méthode clone() qui foire :/ [ par OliV_25 ] lu a tousj'ai besoin de copier des objets et ce sur plusieurs niveau, j'ai donc voulu utiliser la méthode clone() mais elle marche pas à tous les coup Version d evaluation [ par super_toinou ] Bonjour, Je cherche comment faire pour créer une version d evaluation pour un gros logiciel. En effet, si je suis sous windows je peux allez écrire evaluation de la qualite de l'image mpeg2"methode de raudy schwartz" [ par hamaoui5 ] si qq a une idee sur la maniere avec la quelle je peux faire l'evaluation de la qualite de l'image mpeg2 avec la methode de raudy schwartz, en utilisa méthode clone() [ par elfourbos ] salut à tous programmeurs ....... mon problème se trouve au niveau de la méthode clone. En effet j'ai créer un package "monPackage" auquel se trouve u clonage [ par marilou ] Bonjour je voudrais cloner un objet récupéré dans une ArrayList mais je n'y arrive pas. J'ai implémenté une méthode : public MonObjet clone() et lors SWT Composite clone [ par curled_emisor ] Bonjour à tous, Ma question est donc comment faire pour copier le contenu d'un SWT Composite vers un autre SWT Composite Merci d'avance. Clone et Fenetre JAVA [ par CicinhoRaul ] Bonjour, excusez-moi de vous déranger une nouvelle fois mais j'aimerais savoir s'il est possible de cloner une fenetre(ou plutot un JPane Casting d'ArrayList, bug de compilateur ? [ par pumbaa666 ] Bonjour, j'ai un gros problème, j'essaye de faire une méthode générique qui clone en profondeur une ArrayList (donc qui clone chaque objet, pas seulem


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.