// MutationLocalSearch.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.operators.localSearch;
import jmetal.core.Operator;
import jmetal.core.Problem;
import jmetal.core.Solution;
import jmetal.core.SolutionSet;
import jmetal.operators.mutation.Mutation;
import jmetal.util.JMException;
import jmetal.util.comparators.DominanceComparator;
import jmetal.util.comparators.OverallConstraintViolationComparator;
import java.util.Comparator;
import java.util.HashMap;
/**
* This class implements an local search operator based in the use of a
* mutation operator. An archive is used to store the non-dominated solutions
* found during the search.
*/
public class MutationLocalSearch extends LocalSearch {
/**
* Stores the problem to solve
*/
private Problem problem_;
/**
* Stores a reference to the archive in which the non-dominated solutions are
* inserted
*/
private SolutionSet archive_;
private int improvementRounds_ ;
/**
* Stores comparators for dealing with constraints and dominance checking,
* respectively.
*/
private Comparator constraintComparator_ ;
private Comparator dominanceComparator_ ;
/**
* Stores the mutation operator
*/
private Operator mutationOperator_;
/**
* Stores the number of evaluations_ carried out
*/
int evaluations_ ;
/**
* Constructor.
* Creates a new local search object.
* @param parameters The parameters
*/
public MutationLocalSearch(HashMap<String, Object> parameters) {
super(parameters) ;
if (parameters.get("problem") != null)
problem_ = (Problem) parameters.get("problem") ;
if (parameters.get("improvementRounds") != null)
improvementRounds_ = (Integer) parameters.get("improvementRounds") ;
if (parameters.get("mutation") != null)
mutationOperator_ = (Mutation) parameters.get("mutation") ;
evaluations_ = 0 ;
archive_ = null;
dominanceComparator_ = new DominanceComparator();
constraintComparator_ = new OverallConstraintViolationComparator();
} //Mutation improvement
/**
* Constructor.
* Creates a new local search object.
* @param problem The problem to solve
* @param mutationOperator The mutation operator
*/
//public MutationLocalSearch(Problem problem, Operator mutationOperator) {
// evaluations_ = 0 ;
// problem_ = problem;
// mutationOperator_ = mutationOperator;
// dominanceComparator_ = new DominanceComparator();
// constraintComparator_ = new OverallConstraintViolationComparator();
//} // MutationLocalSearch
/**
* Executes the local search. The maximum number of iterations is given by
* the param "improvementRounds", which is in the parameter list of the
* operator. The archive to store the non-dominated solutions is also in the
* parameter list.
* @param object Object representing a solution
* @return An object containing the new improved solution
* @throws JMException
*/
public Object execute(Object object) throws JMException {
int i = 0;
int best = 0;
evaluations_ = 0;
Solution solution = (Solution)object;
int rounds = improvementRounds_;
archive_ = (SolutionSet)getParameter("archive");
if (rounds <= 0)
return new Solution(solution);
do
{
i++;
Solution mutatedSolution = new Solution(solution);
mutationOperator_.execute(mutatedSolution);
// Evaluate the getNumberOfConstraints
if (problem_.getNumberOfConstraints() > 0)
{
problem_.evaluateConstraints(mutatedSolution);
best = constraintComparator_.compare(mutatedSolution,solution);
if (best == 0) //none of then is better that the other one
{
problem_.evaluate(mutatedSolution);
evaluations_++;
best = dominanceComparator_.compare(mutatedSolution,solution);
}
else if (best == -1) //mutatedSolution is best
{
problem_.evaluate(mutatedSolution);
evaluations_++;
}
}
else
{
problem_.evaluate(mutatedSolution);
evaluations_++;
best = dominanceComparator_.compare(mutatedSolution,solution);
}
if (best == -1) // This is: Mutated is best
solution = mutatedSolution;
else if (best == 1) // This is: Original is best
//delete mutatedSolution
;
else // This is mutatedSolution and original are non-dominated
{
//this.archive_.addIndividual(new Solution(solution));
//solution = mutatedSolution;
if (archive_ != null)
archive_.add(mutatedSolution);
}
}
while (i < rounds);
return new Solution(solution);
} // execute
/**
* Returns the number of evaluations maded
*/
public int getEvaluations() {
return evaluations_;
} // evaluations
} // MutationLocalSearch