code: @Override
      protected List<EvaluatedCandidate<T>> nextEvolutionStep(List<EvaluatedCandidate<T>> evaluatedPopulation,
                                                              int eliteCount,
                                                              Random rng)
      {
          List<T> population = new ArrayList<T>(evaluatedPopulation.size());
  
          // First perform any elitist selection.
          List<T> elite = new ArrayList<T>(eliteCount);
          Iterator<EvaluatedCandidate<T>> iterator = evaluatedPopulation.iterator();
          while (elite.size() < eliteCount)
          {
              elite.add(iterator.next().getCandidate());
          }
          // Then select candidates that will be operated on to create the evolved
          // portion of the next generation.
          population.addAll(selectionStrategy.select(evaluatedPopulation,
                                                     fitnessEvaluator.isNatural(),
                                                     evaluatedPopulation.size() - eliteCount,
                                                     rng));
          // Then evolve the population.
          population = evolutionScheme.apply(population, rng);
          // When the evolution is finished, add the elite to the population.
          population.addAll(elite);
          return evaluatePopulation(population);
      }
docs: {@inheritDoc}