// PAES.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.metaheuristics.paes; import jmetal.core.*; import jmetal.util.JMException; import jmetal.util.archive.AdaptiveGridArchive; import jmetal.util.comparators.DominanceComparator; import java.util.Comparator; /** * This class implements the PAES algorithm. */ public class PAES extends Algorithm { /** * Create a new PAES instance for resolve a problem * @param problem Problem to solve */ public PAES(Problem problem) { super (problem) ; } // Paes /** * Tests two solutions to determine which one becomes be the guide of PAES * algorithm * @param solution The actual guide of PAES * @param mutatedSolution A candidate guide */ public Solution test(Solution solution, Solution mutatedSolution, AdaptiveGridArchive archive){ int originalLocation = archive.getGrid().location(solution); int mutatedLocation = archive.getGrid().location(mutatedSolution); if (originalLocation == -1) { return new Solution(mutatedSolution); } if (mutatedLocation == -1) { return new Solution(solution); } if (archive.getGrid().getLocationDensity(mutatedLocation) < archive.getGrid().getLocationDensity(originalLocation)) { return new Solution(mutatedSolution); } return new Solution(solution); } // test /** * Runs of the Paes algorithm. * @return a <code>SolutionSet</code> that is a set of non dominated solutions * as a result of the algorithm execution * @throws JMException */ public SolutionSet execute() throws JMException, ClassNotFoundException { int bisections, archiveSize, maxEvaluations, evaluations; AdaptiveGridArchive archive; Operator mutationOperator; Comparator dominance; //Read the params bisections = ((Integer)this.getInputParameter("biSections")).intValue(); archiveSize = ((Integer)this.getInputParameter("archiveSize")).intValue(); maxEvaluations = ((Integer)this.getInputParameter("maxEvaluations")).intValue(); //Read the operators mutationOperator = this.operators_.get("mutation"); //Initialize the variables evaluations = 0; archive = new AdaptiveGridArchive(archiveSize,bisections,problem_.getNumberOfObjectives()); dominance = new DominanceComparator(); //-> Create the initial solution and evaluate it and his constraints Solution solution = new Solution(problem_); problem_.evaluate(solution); problem_.evaluateConstraints(solution); evaluations++; // Add it to the archive archive.add(new Solution(solution)); //Iterations.... do { // Create the mutate one Solution mutatedIndividual = new Solution(solution); mutationOperator.execute(mutatedIndividual); problem_.evaluate(mutatedIndividual); problem_.evaluateConstraints(mutatedIndividual); evaluations++; //<- // Check dominance int flag = dominance.compare(solution,mutatedIndividual); if (flag == 1) { //If mutate solution dominate solution = new Solution(mutatedIndividual); archive.add(mutatedIndividual); } else if (flag == 0) { //If none dominate the other if (archive.add(mutatedIndividual)) { solution = test(solution,mutatedIndividual,archive); } } /* if ((evaluations % 100) == 0) { archive.printObjectivesToFile("FUN"+evaluations) ; archive.printVariablesToFile("VAR"+evaluations) ; archive.printObjectivesOfValidSolutionsToFile("FUNV"+evaluations) ; } */ } while (evaluations < maxEvaluations); //Return the population of non-dominated solution archive.printFeasibleFUN("FUN_PAES") ; return archive; } // execute } // PAES