/* * Selects among the feasible and infeasible solutions * @param iterable This is the iterable container holding the solutions among which one must be selected * @return a PartialSelection holding the objects retrieved */ @Override public PartialSelection<E> on(Iterable<E> iterable) { E bestIndividual = iterable.iterator().next(); E temp; double difference; ArrayList feasibleEntities = new ArrayList(); ArrayList inFeasibleEntities = new ArrayList(); E winningIndividual; EuclideanDistanceMeasure euclideanDistanceMeasure = new EuclideanDistanceMeasure(); for (E current : iterable) { temp = (E) current.getClone(); constraint.enforce(temp); difference = euclideanDistanceMeasure.distance(temp.getPosition(), current.getPosition()); if (difference == 0) { feasibleEntities.add(current); } else { ExtendedIndividual newIndividual = new ExtendedIndividual(); newIndividual.setIndividual(current); newIndividual.setSumOfConstrainViolation(difference); inFeasibleEntities.add(newIndividual); } } if (feasibleEntities.size() > 0) { return Selection.copyOf(Arrays.asList(selectBestOfFeasible(feasibleEntities))); } return Selection.copyOf(Arrays.asList(selectBestOfInfeasible(inFeasibleEntities))); }
/* * Selects the individual with the lowest sum of constraint violation among a set of infeasible solutions *@param iterable The set of infeasible solutions *@return The best individual among these infeasible solutions */ protected E selectBestOfInfeasible(Iterable<ExtendedIndividual> iterable) { E bestIndividual = iterable.iterator().next().getIndividual(); ExtendedIndividual temp; double sumOfConstraintViolation = Double.POSITIVE_INFINITY; double sumPerDimension; Vector difference; for (ExtendedIndividual current : iterable) { sumPerDimension = current.getSumOfConstrainViolation(); if (sumPerDimension < sumOfConstraintViolation) { bestIndividual = (E) current.getIndividual().getClone(); sumOfConstraintViolation = sumPerDimension; } } return bestIndividual; }