createNextGeneration method
void
createNextGeneration()
Implementation
void createNextGeneration() {
if (species.isEmpty) {
var progenitor = Genome(inputs, outputs);
for (int i=0;i<options.sizeOfGeneration;i++) {
var child = Genome.mutate(progenitor);
add(child);
}
} else {
Map<Genome, num> fitMap = <Genome, num>{};
for(var s in species.entries) {
var fittest = s.value.fittest;
fitMap[fittest] = fittest.fitness;
s.value.clear();
}
var fittest = fitMap.keys.fold<Genome>(
fitMap.keys.first,
(previousValue, element) => previousValue.fitness >= element.fitness ? previousValue : element
);
add(fittest);
int length = 1;
for (int i=0;i<(options.sizeOfGeneration * options.crossOverPercent).round(); i++) {
var firstChosen = fitMap.weightedChoice();
var remaining = Map<Genome, num>.from(fitMap);
remaining.removeWhere((key, value) => key == firstChosen);
var secondChosen = fitMap.weightedChoice();
var child = Genome.mutate(Genome.crossover(firstChosen, secondChosen));
add(child);
length++;
}
for (int i=length;i<options.sizeOfGeneration;i++) {
var chosen = fitMap.weightedChoice();
var child = Genome.mutate(chosen);
add(child);
}
species.removeWhere((key, value) => value.genomes.isEmpty);
}
}