Print

Print


Hello everyone,

I'm *very* new to ECJ, so my apologies if I have done something stupid.  
I would, however, very much appreciate someone telling me where I've 
gone wrong!

I have run the parity examples provided with ECJ and I'm confused with 
the results.  I have tried to reproduce some of the experiments in 
Koza's second book.  My expectation was that I could use the parity 
examples provided with ECJ to get similar results to chapter 6 of GPII 
which generally concludes that the use of ADFs is a good thing for this 
domain.

As I understand it there are two configuration scripts for even-n-parity 
in ECJ: one is for standard Koza-style GP (his first book), and the 
other is for standard Koza-style GP with ADFs (his second book).  The 
defaults are for even-4-parity with standard GP, and even-3-parity for 
GP with ADFs. 

I executed 500 runs (ECJ is really quite quick!) of the even-4-parity 
example with a population size of 500.  (I modified the population size 
by editing "pop.subpop.0.size" in ec/simple/simple.params.)   It 
produced a success rate of 32.4% (162/500 successful runs) by generation 50.

I then executed 500 runs of the even-4-parity problem but this time with 
ADFs.  This required a slight modification of the "adfs.params" file: I 
changed "eval.problem.bits" to 4, and "gp.fs.0.size" to 10, 
"gp.fs.1.size" to 10 and "gp.fs.2.size" to 11 (as per the instructions 
in the file).  Of the 500 runs only 3 (0.6%!!!) found a solution after 
50 generations.

So, to summarize, Standard GP scored 32.4% while GP with ADFs scored 
0.6%.  From Koza's second book on GP (page 181), this was not what I 
expected to get.  I expected GP with ADFs to outperform standard GP on 
this problem domain.  I sat around scratching my head trying to work out 
what I had done wrong, however nothing but hair came out ;o)

I've just repeated this process with even-3-parity, again with a 
population size of 500.  This time I did not modify adf.params from it's 
original source.  I followed the instructions in parity.params to reduce 
it from even-4 to even-3.  This time standard GP found a solution by 
generation 50 in 100% of the 100 runs I executed.  In comparison GP with 
ADFs found solutions in just 46% (46/100) of the runs.  Again this was 
not what I expected.  Page 177 of GPII tells me that I should expect 
ADFs to outperform Standard GP with a computational effort ratio of 
about 1.5.  The two computational efforts scores were 7,000 (for 
standard GP) and 161,203 (for ADFs), or a ratio of about 0.04.

I wondered if the issue was that I'd scaled down the population size.  
So I modified simple/simple.params (but still working with 
even-3-parity) so that the population size was now 16,000---just as Koza 
used.  I had some problems here with a "java.lang.OutOfMemoryError: Java 
heap space" exception, but sufficient runs completed anyway. 

Standard GP found solutions in 100% (84/84) of the runs that terminated 
normally (i.e. without the exception).  Every one of the solutions were 
found by generation 3, giving a minimum computational effort of 64,000.  
Koza's result was 96,000.

GP with ADFs also found solutions in 100% (96/96) of its normal runs.  
However this only happened by generation 9, giving a computational 
effort of 160,000.  In Koza's work ADFs beat Standard GP... not the 
other way around!

So from all this I'm left convinced that I've made some fundamental 
mistake in every one of these setups.  I've no idea what I'm doing wrong 
and would love some assistance!

I've searched the archives of this list and didn't see anything about 
this topic, but once again I apologize if this is obvious.

Thanks in advance,

Matthew Walker