docs: @Override
      public Collection<O> select(Arguments arguments, Population<O> population, Goal goal) {
          List<O> organisms = new ArrayList<>(population.getAll());
  
          List<Double> fitnesses = calculateAbsoluteFitnesses(organisms);
          double totalFitness = calculateTotalFitness(fitnesses);
          List<Double> probabilities = calculateNormalizedFitnesses(fitnesses, totalFitness);
          List<Double> accumulateds = calculateAccumulatedFitnesses(probabilities);
  
          List<SelectionItem> selections = new ArrayList<>();
          for (int i = 0; i < population.size(); i++) {
              selections.add(new SelectionItem(
                      i,
                      probabilities.get(i),
                      accumulateds.get(i)
              ));
          }
          Collections.sort(selections, goal.opposite()::compare);
  
          List<O> selected = new ArrayList<>(arguments.breedingPoolSize());
          for (int i = 0; i < arguments.breedingPoolSize(); i++) {
              selected.add(organisms.get(spinRoulette(selections)));
          }
  
          return selected;
      }