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