Besides a possible bug in your code, there's three possibilities I can
think of:
1. There's a bug in ECJ or in JGAP or GALib with regard to the thing you
picked.
2. There's a difference in interpretation of your parameters among the
algorithms. Not knowing JGAP and GALib as well as ECJ, I cannot speak
for them.
3. Random number generators? JGAP and GALib both have bad RNG choices.
Could this have an effect?
Sean
Cem Safak SAHIN wrote:
> 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;
> }
>
> }
>
>
>
> }
|