Print

Print


On Jun 28, 2006, at 10:02 AM, Stefan Wappler wrote:

> I'm interested in initializing the initial population by using  
> randomly generated individuals at the one hand (using grow, half,  
> or uniform), and by reusing individuals from previous optimizations  
> on the other hand. Is this basically possible? Is there any  
> documentation about seeding?

Not much, but we're here.  What do you want to know?

It works like this:
1. ECJ cals Initializer.initialPopulation(...)
2. Initializer.initialPopulation(...) calls Population.populate(...)
3. Population(...) calls Subpopulation.populate(...)
4. Subpopulation.populate(...) either generates random individuals or  
loads from a file

All you have to do is make a subclass of Subpopulation, override the  
populate method to fill the subpopulation as you like, and set the  
parameter pop.subpop.n=your.new.SubpopulationClassname for each  
subpopulation n that your'e using (likely you're only using one, so n  
would be 0).  The existing code in Subpopulation.populate(...) is  
small and easy to understand.  Use it to roll your own.

> As far as I know, when specifying pop.subpop.0.file=$myFile the  
> initial population will be created from the individuals from the  
> given file. Why is it important to have the fitness value also  
> saved to this file? The current optimization could use a different  
> fitness function and hence this value would be irrelevant.

Because ECJ doesn't know if you need the fitness or not.  Almost  
certainly you *will* need the fitness, so throwing it out would be  
unwelcome.  In the case that you want a different fitness, you can  
just replace it on initialization; override  
Initializer.initialPopulation(...) to call super, and then change the  
fitness as you like.

> Furthermore, I'd like to have an initial population containing 50  
> individuals. The seeding file contains only 10 individuals. How can  
> I specify that the remaining 40 individuals shall be generated  
> using a built-in tree builder (such as grow)?

You can't: you'll need to write that code, but it's easy.  See the  
discussion above.

Sean