/**
   * Returns a new {@link SMPSO} instance.
   *
   * @param properties the properties for customizing the new {@code SMPSO} instance
   * @param problem the problem
   * @return a new {@code SMPSO} instance
   */
  private Algorithm newSMPSO(TypedProperties properties, Problem problem) {
    if (!checkType(RealVariable.class, problem)) {
      throw new FrameworkException("unsupported decision variable type");
    }

    int populationSize = (int) properties.getDouble("populationSize", 100);
    int archiveSize = (int) properties.getDouble("archiveSize", 100);
    double mutationProbability =
        properties.getDouble("pm.rate", 1.0 / problem.getNumberOfVariables());
    double distributionIndex = properties.getDouble("pm.distributionIndex", 20.0);

    return new SMPSO(problem, populationSize, archiveSize, mutationProbability, distributionIndex);
  }
  /**
   * Returns a new {@link OMOPSO} instance.
   *
   * @param properties the properties for customizing the new {@code OMOPSO} instance
   * @param problem the problem
   * @return a new {@code OMOPSO} instance
   */
  private Algorithm newOMOPSO(TypedProperties properties, Problem problem) {
    if (!checkType(RealVariable.class, problem)) {
      throw new FrameworkException("unsupported decision variable type");
    }

    int populationSize = (int) properties.getDouble("populationSize", 100);
    int archiveSize = (int) properties.getDouble("archiveSize", 100);
    int maxIterations = (int) properties.getDouble("maxEvaluations", 25000) / populationSize;
    double mutationProbability =
        properties.getDouble("mutationProbability", 1.0 / problem.getNumberOfVariables());
    double perturbationIndex = properties.getDouble("perturbationIndex", 0.5);
    double[] epsilon =
        properties.getDoubleArray("epsilon", new double[] {EpsilonHelper.getEpsilon(problem)});

    return new OMOPSO(
        problem,
        populationSize,
        archiveSize,
        epsilon,
        mutationProbability,
        perturbationIndex,
        maxIterations);
  }