Example #1
0
  @Override
  public void performIteration(NichingAlgorithm alg) {
    Preconditions.checkState(
        alg.getOptimisationProblem() instanceof DeratingOptimisationProblem,
        "DeratingNichePSO can only be used with DeratingOptimisationProblem.");
    DeratingOptimisationProblem problem =
        (DeratingOptimisationProblem) alg.getOptimisationProblem();

    List<PopulationBasedAlgorithm> subswarms =
        List.<PopulationBasedAlgorithm>iterableList(alg.getPopulations());
    subswarms =
        onMainSwarm(Algorithms.<PopulationBasedAlgorithm>initialise())
            .andThen(phase1(alg))
            .andThen(onSubswarms(clearDeratingSolutions(problem)))
            .andThen(phase2(alg))
            .andThen(joinAndMerge(alg, subswarms))
            .f(
                NichingSwarms.of(
                    alg.getMainSwarm(), Collections.<PopulationBasedAlgorithm>emptyList()))
            ._2();

    problem.clearSolutions();
    problem.addSolutions(
        subswarms
            .map(Solutions.getPosition().o(Algorithms.<PopulationBasedAlgorithm>getBestSolution()))
            .toCollection());
    alg.setPopulations(Lists.newLinkedList(subswarms.toCollection()));
    alg.getMainSwarm().setOptimisationProblem(problem);
    // dont need to set the main swarm because it gets reinitialised
  }