Print

Print


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;
>   }
>   
>  }
> 
> 
> 
> }