@Override public Boolean f(PopulationBasedAlgorithm a, PopulationBasedAlgorithm b) { Particle p1 = (Particle) Topologies.getBestEntity(a.getTopology(), new SocialBestFitnessComparator()); Particle p2 = (Particle) Topologies.getBestEntity(b.getTopology(), new SocialBestFitnessComparator()); Vector v1 = ((Vector) p1.getBestPosition()).subtract((Vector) p1.getCandidateSolution()); Vector v2 = ((Vector) p2.getBestPosition()).subtract((Vector) p2.getCandidateSolution()); return v1.dot(v2) > 0; }
/** * Returns the new position * * @param particle The particle to update * @return the particle's new position */ @Override public Vector get(Particle particle) { particle.setPositionProvider(new LinearPositionProvider()); Vector solution = (Vector) particle.getCandidateSolution(); Vector pBest = (Vector) particle.getBestPosition(); Vector nBest = (Vector) particle.getNeighbourhoodBest().getBestPosition(); Set<Vector> solutions = new HashSet<Vector>(Arrays.asList(solution, pBest, nBest)); if (solutions.size() == 3) { return applyCrossover(particle, Lists.newLinkedList(solutions), mainCrossover); } Vector prevPos = (Vector) particle.getProperties().get(EntityType.PREVIOUS_SOLUTION); solutions.add(prevPos); if (solutions.size() == 3) { return applyCrossover(particle, Lists.newLinkedList(solutions), mainCrossover); } if (solutions.size() == 2) { return applyCrossover(particle, Lists.newLinkedList(solutions), alternateCrossover); } particle.setPositionProvider(new StandardPositionProvider()); return delegate.get(particle); }