code: @Override
    public void run() {
      population = createInitialPopulation() ;
      evaluatePopulation(population) ;
  
      evaluations = populationSize ;
  
      while (evaluations < maxEvaluations) {
        List<S> offspringPopulation = new ArrayList<>(populationSize);
        for (int i = 0; i < populationSize; i += 2) {
          List<S> parents = new ArrayList<>(2);
          parents.add(selectionOperator.execute(population));
          parents.add(selectionOperator.execute(population));
  
          List<S> offspring = crossoverOperator.execute(parents);
  
          mutationOperator.execute(offspring.get(0));
          mutationOperator.execute(offspring.get(1));
  
          offspringPopulation.add(offspring.get(0));
          offspringPopulation.add(offspring.get(1));
        }
  
        evaluatePopulation(offspringPopulation) ;
  
        List<S> jointPopulation = new ArrayList<>();
        jointPopulation.addAll(population);
        jointPopulation.addAll(offspringPopulation);
  
        Ranking<S> ranking = computeRanking(jointPopulation);
  
        population = crowdingDistanceSelection(ranking) ;
  
        evaluations += populationSize ;
      }
    }
docs: Run method