Print

Print


ECJ-INTEREST-L Digest - 21 Mar 2007 (#2007-17)
Hi all.
 
I have here a topic for discussion: REPLACEMENT. (Maybe it is just stupid beginner's question --- I am not an expert in all the features ECJ offers.)
 
In that part of ECJ I am at least a bit aware of, I miss a more explicit use of some replacement operator. By replacement I mean a procedure which takes an old population and a new offspring population as arguments, decides which of the populations members survive, and provides a new population from which the parents are selected in the next generation.
 
IMHO, the replacement is a standard part of any EA. The replacement in generational scheme simply returns the offspring population. In steady-state model (using a generational gap), the replacement should decide which members of the old population should be replaced by which members of the offspring population. Some evolutionary schemes need to preserve the parent-offspring relationship, so that offspring compete with parents for a space in new population.
 
How is the replacement implemented in the ECJ? Well, from what I know so far (correct me, if I am wrong):
 
1] ECJ in its simple package uses a generational replacement scheme, i.e. the offspring population becomes the new population automatically.
 
2] There is the steadystate.SteadyStateBreeder with its deselector methods which are in some sense similar to the replacement... but it seems that only one individual can replaced each generation. (No settings for generational gap?)
 
3] In some evolutionary schemes, the offspring compete with its parent for the place in population... e.g. in ec.de, this is done in DEStatistics!!! Why? Well, I know, its because the other statistics objects then work OK, but there should be deeper reasons to call it STATISTICS!
 
It seems to me that something conceptual is missing in ECJ --- the replacement. If we have selection classes, why do not we have replacement classes? The replacement operator seems to me pretty orthogonal to everything else in the EA, so that it deserves its own class plugable to many different evolutionary schemes. 
 
We could have replacements working on populations (taking the old and the offspring population and produce the new population) and replacements working on pipelines (which would allow us to do tournaments between parent and offspring). We could be able to specify the replacement types in parameter files and we would not have to write new breeder classes for that. We could have the right hooks for the statistics before and after replacements, etc.
 
Am I missing something? Is there a reason why this change or extension should not (or cannot) be made? Or is it actually implemented in some package I am not aware of? Maybe it would cause some backward compatibility problems, but anyway?
 
What are your opinions? Thanks a lot.
 
Petr Posik