code: public static <T> PopulationData<T> getPopulationData(List<EvaluatedCandidate<T>> evaluatedPopulation,
                                                            boolean naturalFitness,
                                                            int eliteCount,
                                                            int iterationNumber,
                                                            long startTime)
      {
          DataSet stats = new DataSet(evaluatedPopulation.size());
          for (EvaluatedCandidate<T> candidate : evaluatedPopulation)
          {
              stats.addValue(candidate.getFitness());
          }
          return new PopulationData<T>(evaluatedPopulation.get(0).getCandidate(),
                                       evaluatedPopulation.get(0).getFitness(),
                                       stats.getArithmeticMean(),
                                       stats.getStandardDeviation(),
                                       naturalFitness,
                                       stats.getSize(),
                                       eliteCount,
                                       iterationNumber,
                                       System.currentTimeMillis() - startTime);
      }
docs: Gets data about the current population, including the fittest candidate
  and statistics about the population as a whole.
  
  @param evaluatedPopulation Population of candidate solutions with their
  associated fitness scores.
  @param naturalFitness True if higher fitness scores mean fitter individuals, false otherwise.
  @param eliteCount The number of candidates preserved via elitism.
  @param iterationNumber The zero-based index of the current generation/epoch.
  @param startTime The time at which the evolution began, expressed as a number of milliseconds since
  00:00 on 1st January 1970.
  @param <T> The type of entity that is being evolved.
  @return Statistics about the current generation of evolved individuals.