All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.uma.jmetal.runner.multiobjective.DMOPSOMeasuresRunner Maven / Gradle / Ivy

There is a newer version: 5.9
Show newest version
package org.uma.jmetal.runner.multiobjective;

import java.util.List;

import org.knowm.xchart.BitmapEncoder.BitmapFormat;
import org.uma.jmetal.algorithm.multiobjective.dmopso.DMOPSO.FunctionType;
import org.uma.jmetal.algorithm.multiobjective.dmopso.DMOPSOMeasures;
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.problem.DoubleProblem;
import org.uma.jmetal.runner.AbstractAlgorithmRunner;
import org.uma.jmetal.solution.DoubleSolution;
import org.uma.jmetal.util.AlgorithmRunner;
import org.uma.jmetal.util.JMetalLogger;
import org.uma.jmetal.util.ProblemUtils;
import org.uma.jmetal.util.chartcontainer.ChartContainer;
import org.uma.jmetal.util.front.imp.ArrayFront;

/**
 * Class for configuring and running the DMOPSO algorithm
 *
 * @author Antonio J. Nebro 
 */

public class DMOPSOMeasuresRunner extends AbstractAlgorithmRunner {
    /**
     * @param args
     *            Command line arguments.
     * @throws org.uma.jmetal.util.JMetalException
     * @throws java.io.IOException
     * @throws SecurityException
     *             Invoking command: java
     *             org.uma.jmetal.runner.multiobjective.DMOPSORunner problemName
     *             [referenceFront]
     */
    public static void main(String[] args) throws Exception {
        DoubleProblem problem;
        DMOPSOMeasures algorithm;

        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 = (DoubleProblem) ProblemUtils.loadProblem(problemName);

        algorithm = new DMOPSOMeasures(problem, 100, 150, 0.0, 0.1, 0.0, 1.0, 1.5, 2.5, 1.5, 2.5, 0.1, 0.4, -1.0, -1.0,
                FunctionType.TCHE, "MOEAD_Weights", 2);

        algorithm.setReferenceFront(new ArrayFront(referenceParetoFront));

        /* Measure management */
        MeasureManager measureManager = ((DMOPSOMeasures) algorithm).getMeasureManager();

        BasicMeasure> solutionListMeasure = (BasicMeasure>) measureManager
                .>getPushMeasure("currentPopulation");
        CountingMeasure iterationMeasure = (CountingMeasure) measureManager.getPushMeasure("currentEvaluation");
        BasicMeasure hypervolumeMeasure = (BasicMeasure) measureManager
                .getPushMeasure("hypervolume");
        BasicMeasure epsilonMeasure = (BasicMeasure) measureManager.getPushMeasure("epsilon");

        ChartContainer chart = new ChartContainer(algorithm.getName(), 200);
        chart.setFrontChart(0, 1, referenceParetoFront);
        chart.setVarChart(0, 1);
        chart.addIndicatorChart("Hypervolume");
        chart.addIndicatorChart("Epsilon");
        chart.initChart();

        solutionListMeasure.register(new ChartListener(chart));
        iterationMeasure.register(new IterationListener(chart));
        hypervolumeMeasure.register(new IndicatorListener("Hypervolume", chart));
        epsilonMeasure.register(new IndicatorListener("Epsilon", chart));

        /* End of measure management */

        AlgorithmRunner algorithmRunner = new AlgorithmRunner.Executor(algorithm).execute();
        chart.saveChart("./chart", BitmapFormat.PNG);

        List population = algorithm.getResult();
        long computingTime = algorithmRunner.getComputingTime();

        JMetalLogger.logger.info("Total execution time: " + computingTime + "ms");

        printFinalSolutionSet(population);
        if (!referenceParetoFront.equals("")) {
            printQualityIndicators(population, referenceParetoFront);
        }

    }

    private static class ChartListener implements MeasureListener> {
        private ChartContainer chart;
        private int iteration = 0;

        public ChartListener(ChartContainer chart) {
            this.chart = chart;
            this.chart.getFrontChart().setTitle("Iteration: " + this.iteration);
        }

        private void refreshChart(List solutionList) {
            if (this.chart != null) {
                iteration++;
                this.chart.getFrontChart().setTitle("Iteration: " + this.iteration);
                this.chart.updateFrontCharts(solutionList);
                this.chart.refreshCharts();
            }
        }

        @Override
        synchronized public void measureGenerated(List solutions) {
            refreshChart(solutions);
        }
    }

    private static class IterationListener implements MeasureListener {
        ChartContainer chart;

        public IterationListener(ChartContainer chart) {
            this.chart = chart;
            this.chart.getFrontChart().setTitle("Iteration: " + 0);
        }

        @Override
        synchronized public void measureGenerated(Long iteration) {
            if (this.chart != null) {
                this.chart.getFrontChart().setTitle("Iteration: " + iteration);
            }
        }
    }

    private static class IndicatorListener implements MeasureListener {
        ChartContainer chart;
        String indicator;

        public IndicatorListener(String indicator, ChartContainer chart) {
            this.chart = chart;
            this.indicator = indicator;
        }

        @Override
        synchronized public void measureGenerated(Double value) {
            if (this.chart != null) {
                this.chart.updateIndicatorChart(this.indicator, value);
                this.chart.refreshCharts(0);
            }
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy