// DENSEA.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.densea; import jmetal.core.*; import jmetal.util.Distance; import jmetal.util.JMException; import jmetal.util.Ranking; import jmetal.util.comparators.CrowdingComparator; import jmetal.util.comparators.EqualSolutions; import java.util.Comparator; /** * Class implementing the DENSEA algorithm. */ public class DENSEA extends Algorithm{ /* Create a new instance of DENSEA algorithm */ public DENSEA(Problem problem) { super (problem) ; } //Implements the Densea delete duplicate elements public void deleteDuplicates(SolutionSet population) { Comparator equalIndividuals = new EqualSolutions(); for (int i = 0; i < population.size()/2; i++) { for (int j = i+1; j < population.size()/2; j++) { int flag = equalIndividuals.compare(population.get(i),population.get(j)); if (flag == 0) { Solution aux = population.get(j); population.replace(j,population.get((population.size()/2)+j)); population.replace((population.size()/2)+j,aux); } } } } /* Execute the algorithm */ public SolutionSet execute() throws JMException, ClassNotFoundException { int populationSize, maxEvaluations, evaluations ; SolutionSet population, offspringPopulation, union ; Operator mutationOperator,crossoverOperator,selectionOperator ; Distance distance = new Distance() ; //Read the params populationSize = ((Integer)this.getInputParameter("populationSize")).intValue(); maxEvaluations = ((Integer)this.getInputParameter("maxEvaluations")).intValue(); //Init the variables population = new SolutionSet(populationSize); evaluations = 0; //Read the operators mutationOperator = this.operators_.get("mutation"); crossoverOperator = this.operators_.get("crossover"); selectionOperator = this.operators_.get("selection"); //-> Create the initial population Solution newIndividual; for (int i = 0; i < populationSize; i++) { newIndividual = new Solution(problem_); problem_.evaluate(newIndividual); problem_.evaluateConstraints(newIndividual); evaluations++; population.add(newIndividual); } //for //<- Ranking r; while (evaluations < maxEvaluations) { SolutionSet P3 = new SolutionSet(populationSize); for (int i = 0; i < populationSize/2; i++) { Solution [] parents = new Solution[2]; Solution [] offSpring; parents[0] = (Solution)selectionOperator.execute(population); parents[1] = (Solution)selectionOperator.execute(population); offSpring = (Solution [])crossoverOperator.execute(parents); mutationOperator.execute(offSpring[0]); problem_.evaluate(offSpring[0]); problem_.evaluateConstraints(offSpring[0]); evaluations++; mutationOperator.execute(offSpring[1]); problem_.evaluate(offSpring[1]); problem_.evaluateConstraints(offSpring[1]); evaluations++; P3.add(offSpring[0]); P3.add(offSpring[1]); } r = new Ranking(P3); for (int i = 0; i < r.getNumberOfSubfronts();i++) { distance.crowdingDistanceAssignment(r.getSubfront(i),problem_.getNumberOfObjectives()); } P3.sort(new CrowdingComparator()); population.sort(new CrowdingComparator()); //deleteDuplicates(population); //deleteDuplicates(P3); SolutionSet auxiliar = new SolutionSet(populationSize); for (int i = 0; i < (populationSize/2);i++) { auxiliar.add(population.get(i)); } for (int j = 0; j < (populationSize/2);j++) { auxiliar.add(population.get(j)); } population = auxiliar; r = new Ranking(population); for (int i = 0; i < r.getNumberOfSubfronts();i++) { distance.crowdingDistanceAssignment(r.getSubfront(i),problem_.getNumberOfObjectives()); } } r = new Ranking(population); return r.getSubfront(0); } }