It is great that ecj now has a grammatical evolution implementation. But I
am having trouble replicating the results of a basic GE experiment. I am
wondering if anyone else has had this problem, can see any mistakes in what
I have done, or know of a reason for this.
I refer to the results of this paper, for the santa fe ant trail:
O'Neill M., Ryan C. Grammatical Evolution. IEEE Transactions on Evolutionary
Computation, Vol. 5 No.4, August 2001.
In this paper, over 100 runs, GE finds the correct code in approximately 90
of the runs. However, my results are consistently around the 25 mark.
I would normally put any discrepancies down to small differences in
implementation between O'Neill's code and ecj, but the results are so
dramatically different that it is probably not due to this.
My parameters are copied below. You will see I have tried to match the
grammar that they use, and use the same genetic operators in the pipeline.
Thanks for your help.
#Grammar file myant.grammar
<start> ::= <code>
<code> ::= <line> | (progn2 <code> <line>)
<line> ::= (if-food-ahead <line> <line>) | <op>
<op> ::= (left) | (right) | (move)
pop.subpop.0.size = 500
breed.elite.0 = 50
pop.subpop.0.species.genome-size = uniform
pop.subpop.0.species.min-initial-size = 5
pop.subpop.0.species.max-initial-size = 20
pop.subpop.0.species.pipe = ec.vector.breed.GeneDuplicationPipeline
pop.subpop.0.species.pipe.likelihood = 0.01
pop.subpop.0.species.pipe.source.0 = ec.vector.breed.VectorMutationPipeline
pop.subpop.0.species.pipe.source.0.likelihood = 1
pop.subpop.0.species.mutation-prob = 0.01
pop.subpop.0.species.pipe.source.0.source.0.prob = 1
pop.subpop.0.species.pipe.source.0.source.0.likelihood = 0.9
pop.subpop.0.species.pipe.source.0.source.0.source.1 = same
pop.subpop.0.species.pipe.source.0.source.0.toss = false
gp.fs.0.size = 5
gp.fs.0.func.0 = ec.app.ant.func.Left
gp.fs.0.func.0.nc = nc0
gp.fs.0.func.1 = ec.app.ant.func.Right
gp.fs.0.func.1.nc = nc0
gp.fs.0.func.2 = ec.app.ant.func.Move
gp.fs.0.func.2.nc = nc0
gp.fs.0.func.3 = ec.app.ant.func.IfFoodAhead
gp.fs.0.func.3.nc = nc2
gp.fs.0.func.4 = ec.app.ant.func.Progn2
gp.fs.0.func.4.nc = ncboth