* @param calculateScore The score function.
* @return The NEAT EA trainer.
*/
public static TrainEA constructNEATTrainer(final NEATPopulation population,
final CalculateScore calculateScore) {
final TrainEA result = new TrainEA(population, calculateScore);
result.setSpeciation(new OriginalNEATSpeciation());
result.setSelection(new TruncationSelection(result, 0.3));
final CompoundOperator weightMutation = new CompoundOperator();
weightMutation.getComponents().add(
0.1125,
new NEATMutateWeights(new SelectFixed(1),
new MutatePerturbLinkWeight(0.02)));
weightMutation.getComponents().add(
0.1125,
new NEATMutateWeights(new SelectFixed(2),
new MutatePerturbLinkWeight(0.02)));
weightMutation.getComponents().add(
0.1125,
new NEATMutateWeights(new SelectFixed(3),
new MutatePerturbLinkWeight(0.02)));
weightMutation.getComponents().add(
0.1125,
new NEATMutateWeights(new SelectProportion(0.02),
new MutatePerturbLinkWeight(0.02)));
weightMutation.getComponents().add(
0.1125,
new NEATMutateWeights(new SelectFixed(1),
new MutatePerturbLinkWeight(1)));
weightMutation.getComponents().add(
0.1125,
new NEATMutateWeights(new SelectFixed(2),
new MutatePerturbLinkWeight(1)));
weightMutation.getComponents().add(
0.1125,
new NEATMutateWeights(new SelectFixed(3),
new MutatePerturbLinkWeight(1)));
weightMutation.getComponents().add(
0.1125,
new NEATMutateWeights(new SelectProportion(0.02),
new MutatePerturbLinkWeight(1)));
weightMutation.getComponents().add(
0.03,
new NEATMutateWeights(new SelectFixed(1),
new MutateResetLinkWeight()));
weightMutation.getComponents().add(
0.03,
new NEATMutateWeights(new SelectFixed(2),
new MutateResetLinkWeight()));
weightMutation.getComponents().add(
0.03,
new NEATMutateWeights(new SelectFixed(3),
new MutateResetLinkWeight()));
weightMutation.getComponents().add(
0.01,
new NEATMutateWeights(new SelectProportion(0.02),
new MutateResetLinkWeight()));
weightMutation.getComponents().finalizeStructure();
result.setChampMutation(weightMutation);
result.addOperation(0.5, new NEATCrossover());
result.addOperation(0.494, weightMutation);
result.addOperation(0.0005, new NEATMutateAddNode());
result.addOperation(0.005, new NEATMutateAddLink());
result.addOperation(0.0005, new NEATMutateRemoveLink());
result.getOperators().finalizeStructure();
if (population.isHyperNEAT()) {
result.setCODEC(new HyperNEATCODEC());
} else {
result.setCODEC(new NEATCODEC());
}
return result;
}