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);
  }
}