/**
   * Returns a new {@link NSGAII} instance.
   *
   * @param properties the properties for customizing the new {@code NSGAII} instance
   * @param problem the problem
   * @return a new {@code NSGAII} instance
   */
  private Algorithm newNSGAII(TypedProperties properties, Problem problem) {
    int populationSize = (int) properties.getDouble("populationSize", 100);

    Initialization initialization = new RandomInitialization(problem, populationSize);

    NondominatedSortingPopulation population = new NondominatedSortingPopulation();

    TournamentSelection selection = null;

    if (properties.getBoolean("withReplacement", true)) {
      selection =
          new TournamentSelection(
              2, new ChainedComparator(new ParetoDominanceComparator(), new CrowdingComparator()));
    }

    Variation variation = OperatorFactory.getInstance().getVariation(null, properties, problem);

    return new NSGAII(problem, population, null, selection, variation, initialization);
  }