// NSGAIIRunner.java // // Author: // Antonio J. Nebro <antonio@lcc.uma.es> // // Copyright (c) 2014 Antonio J. Nebro // // 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 org.uma.jmetal.runner.multiobjective; import org.uma.jmetal.algorithm.Algorithm; import org.uma.jmetal.algorithm.multiobjective.nsgaii.NSGAIIBuilder; import org.uma.jmetal.algorithm.multiobjective.nsgaii.NSGAIIMeasures; import org.uma.jmetal.measure.MeasureListener; import org.uma.jmetal.measure.MeasureManager; import org.uma.jmetal.measure.impl.BasicMeasure; import org.uma.jmetal.measure.impl.CountingMeasure; import org.uma.jmetal.measure.impl.DurationMeasure; import org.uma.jmetal.operator.CrossoverOperator; import org.uma.jmetal.operator.MutationOperator; import org.uma.jmetal.operator.SelectionOperator; import org.uma.jmetal.operator.impl.crossover.SBXCrossover; import org.uma.jmetal.operator.impl.mutation.PolynomialMutation; import org.uma.jmetal.operator.impl.selection.BinaryTournamentSelection; import org.uma.jmetal.problem.Problem; import org.uma.jmetal.runner.AbstractAlgorithmRunner; import org.uma.jmetal.solution.DoubleSolution; import org.uma.jmetal.util.JMetalException; import org.uma.jmetal.util.JMetalLogger; import org.uma.jmetal.util.ProblemUtils; import org.uma.jmetal.util.comparator.RankingAndCrowdingDistanceComparator; import java.io.FileNotFoundException; import java.util.List; import java.util.concurrent.TimeUnit; /** * Class to configure and run the NSGA-II algorithm (variant with measures) */ public class NSGAIIMeasuresRunner extends AbstractAlgorithmRunner { /** * @param args Command line arguments. * @throws SecurityException * Invoking command: java org.uma.jmetal.runner.multiobjective.NSGAIIMeasuresRunner problemName [referenceFront] */ public static void main(String[] args) throws JMetalException, InterruptedException, FileNotFoundException { Problem<DoubleSolution> problem; Algorithm<List<DoubleSolution>> algorithm; CrossoverOperator<DoubleSolution> crossover; MutationOperator<DoubleSolution> mutation; SelectionOperator<List<DoubleSolution>, DoubleSolution> selection; String referenceParetoFront = "" ; String problemName ; if (args.length == 1) { problemName = args[0]; } else if (args.length == 2) { problemName = args[0] ; referenceParetoFront = args[1] ; } else { problemName = "org.uma.jmetal.problem.multiobjective.zdt.ZDT1"; referenceParetoFront = "jmetal-problem/src/test/resources/pareto_fronts/ZDT1.pf" ; } problem = ProblemUtils.<DoubleSolution> loadProblem(problemName); double crossoverProbability = 0.9 ; double crossoverDistributionIndex = 20.0 ; crossover = new SBXCrossover(crossoverProbability, crossoverDistributionIndex) ; double mutationProbability = 1.0 / problem.getNumberOfVariables() ; double mutationDistributionIndex = 20.0 ; mutation = new PolynomialMutation(mutationProbability, mutationDistributionIndex) ; selection = new BinaryTournamentSelection<DoubleSolution>(new RankingAndCrowdingDistanceComparator<DoubleSolution>()); int maxEvaluations = 25000 ; int populationSize = 100 ; algorithm = new NSGAIIBuilder<DoubleSolution>(problem, crossover, mutation) .setSelectionOperator(selection) .setMaxEvaluations(maxEvaluations) .setPopulationSize(populationSize) .setVariant(NSGAIIBuilder.NSGAIIVariant.Measures) .build() ; /* Measure management */ MeasureManager measureManager = ((NSGAIIMeasures<DoubleSolution>)algorithm).getMeasureManager() ; CountingMeasure currentEvalution = (CountingMeasure) measureManager.<Long>getPullMeasure("currentEvaluation"); DurationMeasure currentComputingTime = (DurationMeasure) measureManager.<Long>getPullMeasure("currentExecutionTime"); BasicMeasure<Integer> nonDominatedSolutions = (BasicMeasure<Integer>) measureManager.<Integer>getPullMeasure("numberOfNonDominatedSolutionsInPopulation"); BasicMeasure<List<DoubleSolution>> solutionListMeasure = (BasicMeasure<List<DoubleSolution>>) measureManager.<List<DoubleSolution>> getPushMeasure("currentPopulation"); CountingMeasure iteration2 = (CountingMeasure) measureManager.<Long>getPushMeasure("currentEvaluation"); solutionListMeasure.register(new Listener()); iteration2.register(new Listener2()); /* End of measure management */ Thread algorithmThread = new Thread(algorithm) ; algorithmThread.start(); /* Using the measures */ int i = 0 ; while(currentEvalution.get() < maxEvaluations) { TimeUnit.SECONDS.sleep(5); System.out.println("Evaluations (" + i + ") : " + currentEvalution.get()) ; System.out.println("Computing time (" + i + ") : " + currentComputingTime.get()) ; System.out.println("Number of Nondominated solutions (" + i + "): " + nonDominatedSolutions.get()) ; i++ ; } algorithmThread.join(); List<DoubleSolution> population = algorithm.getResult() ; long computingTime = currentComputingTime.get() ; JMetalLogger.logger.info("Total execution time: " + computingTime + "ms"); printFinalSolutionSet(population); if (!referenceParetoFront.equals("")) { printQualityIndicators(population, referenceParetoFront) ; } } private static class Listener implements MeasureListener<List<DoubleSolution>> { private int counter = 0 ; @Override synchronized public void measureGenerated(List<DoubleSolution> solutions) { if ((counter % 10 == 0)) { System.out.println("PUSH MEASURE. Counter = " + counter+ " First solution: " + solutions.get(0)) ; } counter ++ ; } } private static class Listener2 implements MeasureListener<Long> { @Override synchronized public void measureGenerated(Long value) { if ((value % 50 == 0)) { System.out.println("PUSH MEASURE. Iteration: " + value) ; } } } }