// PESA2.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.pesa2; import jmetal.core.*; import jmetal.encodings.variable.Permutation; import jmetal.operators.mutation.MutationFactory; import jmetal.operators.selection.PESA2Selection; import jmetal.util.JMException; import jmetal.util.archive.AdaptiveGridArchive; import problema.MainGreedy; import problema.Problema; import java.util.HashMap; /** * This class implements the PESA2 algorithm. */ public class PESA2 extends Algorithm{ /** * Constructor * Creates a new instance of PESA2 */ public PESA2(Problem problem) { super (problem) ; } // PESA2 /** * Runs of the PESA2 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 archiveSize, bisections, maxEvaluations, evaluations, populationSize; AdaptiveGridArchive archive; SolutionSet solutionSet; Operator crossover,mutation, selection; // Read parameters populationSize = ((Integer)(inputParameters_.get("populationSize"))).intValue(); archiveSize = ((Integer)(inputParameters_.get("archiveSize"))).intValue() ; bisections = ((Integer)(inputParameters_.get("bisections"))).intValue() ; maxEvaluations = ((Integer)(inputParameters_.get("maxEvaluations"))).intValue(); // Get the operators crossover = operators_.get("crossover"); mutation = operators_.get("mutation"); // Initialize the variables evaluations = 0; archive = new AdaptiveGridArchive(archiveSize,bisections, problem_.getNumberOfObjectives()); solutionSet = new SolutionSet(populationSize); HashMap parameters = null ; selection = new PESA2Selection(parameters); //-> Create the initial individual and evaluate it and his constraints for (int i = 0; i < populationSize; i++){ Solution solution = new Solution(problem_); problem_.evaluate(solution); problem_.evaluateConstraints(solution); solutionSet.add(solution); } // Incorporate non-dominated solution to the archive for (int i = 0; i < solutionSet.size();i++){ archive.add(solutionSet.get(i)); // Only non dominated are accepted by // the archive } // Clear the init solutionSet solutionSet.clear(); //Iterations.... Solution [] parents = new Solution[2]; do { //-> Create the offSpring solutionSet while (solutionSet.size() < populationSize){ parents[0] = (Solution) selection.execute(archive); parents[1] = (Solution) selection.execute(archive); Solution [] offSpring = (Solution []) crossover.execute(parents); mutation.execute(offSpring[0]); problem_.evaluate(offSpring[0]); problem_.evaluateConstraints(offSpring[0]); evaluations++; solutionSet.add(offSpring[0]); } for (int i = 0; i < solutionSet.size(); i++) archive.add(solutionSet.get(i)); // Clear the solutionSet solutionSet.clear(); }while (evaluations < maxEvaluations); //Return the solutionSet of non-dominated individual return archive; } // execute } // PESA2