// NonDominatedSolutionList.java
//
// Author:
// Antonio J. Nebro <antonio@lcc.uma.es>
// Juan J. Durillo <durillo@lcc.uma.es>
//
// Copyright (c) 2011 Antonio J. Nebro, Juan J. Durillo
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package jmetal.util;
import jmetal.core.Solution;
import jmetal.core.SolutionSet;
import jmetal.util.comparators.DominanceComparator;
import jmetal.util.comparators.SolutionComparator;
import java.util.Comparator;
import java.util.Iterator;
import jmetal.util.comparators.EqualSolutions;
import jmetal.util.comparators.FitnessComparator;
/**
* This class implements an unbound list of non-dominated solutions
*/
public class NonDominatedSolutionList extends SolutionSet{
/**
* Stores a <code>Comparator</code> for dominance checking
*/
private Comparator dominance_ = new DominanceComparator();
/**
* Stores a <code>Comparator</code> for checking if two solutions are equal
*/
private static final Comparator equal_ = new EqualSolutions();
/**
* Constructor.
* The objects of this class are lists of non-dominated solutions according to
* a Pareto dominance comparator.
*/
public NonDominatedSolutionList() {
super();
} // NonDominatedList
/**
* Constructor.
* This constructor creates a list of non-dominated individuals using a
* comparator object.
* @param dominance The comparator for dominance checking.
*/
public NonDominatedSolutionList(Comparator dominance) {
super();
dominance_ = dominance;
} // NonDominatedList
/** Inserts a solution in the list
* @param solution The solution to be inserted.
* @return true if the operation success, and false if the solution is
* dominated or if an identical individual exists.
* The decision variables can be null if the solution is read from a file; in
* that case, the domination tests are omitted
*/
public boolean add(Solution solution){
if (solutionsList_.size() == 0) {
solutionsList_.add(solution);
return true ;
}
else {
Iterator<Solution> iterator = solutionsList_.iterator();
//if (solution.getDecisionVariables() != null) {
while (iterator.hasNext()){
Solution listIndividual = iterator.next();
int flag = dominance_.compare(solution,listIndividual);
if (flag == -1) { // A solution in the list is dominated by the new one
iterator.remove();
} else if (flag == 0) { // Non-dominated solutions
flag = equal_.compare(solution,listIndividual);
if (flag == 0) {
return false; // The new solution is in the list
}
} else if (flag == 1) { // The new solution is dominated
return false;
}
} // while
//} // if
//At this point, the solution is inserted into the list
solutionsList_.add(solution);
return true;
}
} // add
} // NonDominatedList