private void calculateNewNiche() { setCurrentNiche(getCurrentNiche() + 1); VBPSO sub = mainSwarm.getClone(); sub.getTopology().clear(); yhead.setNicheID(getCurrentNiche()); yhead.setNeighbourhoodBest(yhead.getClone()); sub.getTopology().add(yhead); for (VBParticle p : mainSwarm.getTopology()) { if ((p.getDotProduct() > 0 && p.getRadius() < nicheRadius) || (p.getBestPosition().equals(yhead.getBestPosition()))) { p.setNicheID(getCurrentNiche()); p.setNeighbourhoodBest(yhead.getClone()); sub.getTopology().add(p); } } for (VBParticle p : sub.getTopology()) { mainSwarm.getTopology().remove(p); } VBParticle tmp = yhead.getClone(); while (sub.getTopology().size() < 3) { tmp.reinitialise(); tmp.setNeighbourhoodBest(yhead.getClone()); tmp.setPersonalBest(tmp.getPosition().getClone()); sub.getTopology().add(tmp); } subPopulationsAlgorithms.add(sub); }