Hi there, I am bechmarking three different GA libraries (ECJ, JGAP, and GALib (C++)). The parameter file, the fitness function, and the my mutation function are at the end of this email. The length of chromosome is 600 and subpopulation size is 20. I am using default crossover function (source 0 and source 1 --> FitProportionateSelection). Fitness function is Kozafitness (it is easier for me to solve minimization problems). The other two libraries converge around 20,000 iterations. However, ECJ converges after 90,000 iterations. If I I wanna learn your instincts about convergence rate. Isn't it too slow? (Whether, I am coding something wrong or someone has the similar convergence rate problem for fitness value) Note: I am using my own mutation function because the bit selected for mutation should be changed from a value in the predefined vector. Thanks in advance, Safak -----------FITNESS FUNCTION----------------------------------- fitness = 0; for (i<genome.length){ fitness += (value of genome – (1/genome.length x i))2 } ----------PARAMETERS FILE--------------------------------------- parent.0 = simple.params verbosity = 0 stat = ec.GALIB.ES1.MyStat eval.problem = ec.GALIB.ES1.MyGAs pop.subpop.0.breeder = ec.Simple.SimpleBreeder pop.subpop.0.species.pipe = ec.GALIB.ES1.MyMutation pop.subpop.0.species.pipe.source.0 = ec.vector.breed.VectorCrossoverPipeline pop.subpop.0.species.pipe.source.0.source.0 = ec.select.FitProportionateSelection pop.subpop.0.species.pipe.source.0.source.1 = ec.select.FitProportionateSelection pop.subpop.0.species.pipe.source.0.toss = false pop.subpop.0.species = ec.vector.FloatVectorSpecies pop.subpop.0.species.min-gene = 0.0f pop.subpop.0.species.max-gene = 1.0f pop.subpop.0.species.ind = ec.vector.FloatVectorIndividual pop.subpop.0.species.genome-size = 600 pop.subpop.0.species.crossover-type = one pop.subpop.0.species.crossover-prob = 0.9 pop.subpop.0.species.fitness = ec.gp.koza.KozaFitness breed.elite.0 = 1 pop.subpop.0.size = 20 pop.subpop.0.file = initPop.params generations = 100000 function.delay = false #true pop.subpop.0.species.mutation-prob = 0.002 seed.0 = time pop.subpop.0.duplicate-retries = 0 ---------------------- MY MUTATION---------------------- package ec.GALIB.ES1; import ec.BreedingPipeline; import ec.EvolutionState; import ec.Individual; import ec.util.Parameter; import ec.vector.FloatVectorIndividual; import ec.vector.FloatVectorSpecies; import ec.vector.VectorDefaults; public class MyMutation extends BreedingPipeline{ public static final String P_MUTATION = "mutate"; public static final int NUM_SOURCES = 1; public RandomGenerator rg = new RandomGenerator(); @Override public int numSources() { // TODO Auto-generated method stub return NUM_SOURCES; } @Override public int produce(final int min, final int max, final int start, final int subpopulation, final Individual[] inds, final EvolutionState state, final int thread){ // TODO Auto-generated method stub int n=sources[0].produce(min, max, start, subpopulation, inds, state, thread); Parameter myBase = new Parameter("function"); if (!(sources[0] instanceof BreedingPipeline)){ for (int q=start;q<n+start;q++){ inds[q]=(Individual) inds[q].clone(); } } //initialize random number generator rg.SetState(state); rg.SetThread(thread); FloatVectorSpecies s = (FloatVectorSpecies)(inds [0].species); FloatVectorIndividual ind; for(int q=start;q<start+n;q++){ ind = (FloatVectorIndividual)inds[q]; if (s.mutationProbability>0.0){ if (state.random[thread].nextBoolean (s.mutationProbability)){ int a = state.random[0].nextInt(600); ind.genome[a]=(float)(rg.GetRandom (a)); } } (inds[q]).evaluated=false; } return n; } @Override public Parameter defaultBase() { // TODO Auto-generated method stub return VectorDefaults.base().push(P_MUTATION); } public class RandomGenerator{ int type = 0; // 0-->Gaussian, 1-->Cauchy int thread; EvolutionState state; float GetRandom(float a){ float rnum = 0.0f; int k = state.random[thread].nextInt(9); rnum = ES_Java_1._chromosomes[(int)a][k]; /*if (type == 0){ rnum = err*(float)state.random [thread].nextGaussian(); } else{ rnum=(float)Math.tan(3.1415926536f* (state.random[thread].nextFloat()-0.5f)); }*/ return rnum; } void SetState(final EvolutionState s){ state =s; } void SetThread(final int t){ thread = t; } } }