@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 }