On Jul 12, 2005, at 3:32 PM, Steve Butcher (Steve-O) wrote:
> Conceptually, a hill climber is a population of 1 who at each step is
> compared to the performance of a clone of itself that has undergone a
> random mutation.
I think generally a hill-climber has a population of two. I've had a
spirited debate with Paul Wiegand about the difference between
hill-climbing and the 1+1 ES, and it comes down to the assumption that
a hill-climber's mutator is "local" -- it cannot mutate to every
possible spot in space in a single jump.
Here's a 1+1 mutation-only ES for the ec/app/sum problem. It's using
VectorMutationPipeline which could in theory mutate to any point in
space, but you could replace it with a true "local" hill-climbing
mutator if you so desire.
parent.0 = ../../simple/simple.params
generations = 1000
pop.subpop.0.size = 2
es.mu.0 = 1
es.lambda.0 = 1
breed = ec.es.MuPlusLambdaBreeder
pop.subpop.0.fitness = ec.simple.SimpleFitness
pop.subpop.0.duplicate-retries = 0
pop.subpop.0.species = ec.vector.IntegerVectorSpecies
pop.subpop.0.species.ind =
ec.vector.IntegerVectorIndividual
pop.subpop.0.species.min-gene = 0
pop.subpop.0.species.max-gene = 100
pop.subpop.0.species.genome-size = 10
pop.subpop.0.species.mutation-prob = 0.1
pop.subpop.0.species.pipe = ec.vector.breed.VectorMutationPipeline
pop.subpop.0.species.pipe.source.0 = ec.es.ESSelection
eval.problem = ec.app.sum.Sum
As to simulated annealing: SA can be done, I think, using 1+1 as above,
but with a special ESSelection subclass. In a 1+1 ES,
MuPlusLambdaBreeder puts the "parent" in the top of the population
(state.population.subpops[subpop].inds[1]), and the "child" in the
bottom (state.population.subpops[subpop].inds[0]). What your SA
version of ESSelection needs to do is compare the two, and if the child
is better, the child is the one that gets returned by the selection
operation. Else flip a biased coin (using the generation number to
determine the temperature perhaps) and if it comes up heads, you still
return the child. Else return the parent.
So, to sum up:
- RMHC actually can already be done nicely in ECJ.
- SA would require an easily-written ESSelection subclass designed for
it. If you'd like to try that, it'd be an hour's work tops my guess,
and would be welcome.
- If you're fishing for packages to write in this vein, I think the
really crunchy items not yet written for ECJ are an Ant Colony
Optimization algorithm and a Particle Swarm Optimization package.
Sean
|