code: @Override
      protected List<EvaluatedCandidate<T>> nextEvolutionStep(List<EvaluatedCandidate<T>> evaluatedPopulation,
                                                              int eliteCount,
                                                              Random rng)
      {
          // Elite count is ignored.  If it's non-zero it doesn't really matter, but if assertions are
          // enabled we will flag it as wrong.
          assert eliteCount == 0 : "Explicit elitism is not supported for an ES, eliteCount should be 0.";
          
          // Select candidates that will be operated on to create the offspring.
          int offspringCount = offspringMultiplier * evaluatedPopulation.size();
          List<T> parents = new ArrayList<T>(offspringCount);
          for (int i = 0; i < offspringCount; i++)
          {
              parents.add(evaluatedPopulation.get(rng.nextInt(evaluatedPopulation.size())).getCandidate());
          }
  
          // Then evolve the parents.
          List<T> offspring = evolutionScheme.apply(parents, rng);
  
          List<EvaluatedCandidate<T>> evaluatedOffspring = evaluatePopulation(offspring);
          if (plusSelection) // Plus-selection means parents are considered for survival as well as offspring.
          {
              evaluatedOffspring.addAll(evaluatedPopulation);
          }
          EvolutionUtils.sortEvaluatedPopulation(evaluatedOffspring, fitnessEvaluator.isNatural());
          // Retain the fittest of the candidates that are eligible for survival.
          return evaluatedOffspring.subList(0, evaluatedPopulation.size());
      }
docs: This method performs a single step/iteration of the evolutionary process.
  @param evaluatedPopulation The population at the beginning of the process.
  @param eliteCount Ignored by evolution strategies.  Elitism is implicit in a (μ+λ)
  ES and undesirable for a (μ,λ) ES.
  @param rng A source of randomness.
  @return The updated population after the evolution strategy has advanced.