【问题标题】:Plot pareto front solutions in java在java中绘制帕累托前沿解决方案
【发布时间】:2016-07-05 12:18:30
【问题描述】:

我有 3 组从 MOEA 算法收集的帕累托前沿解决方案

我想知道是否有一个 java 库可以帮助从 3 组数据中在同一个图中绘制 3 个帕累托。

我有一个 2 目标问题。所以我想我需要一个 2D Plot。

你能帮我举个例子吗?

【问题讨论】:

    标签: java genetic-algorithm pareto-chart


    【解决方案1】:

    MOEA Framework 带有许多用于分析 MOEA 输出的工具。它包括一个诊断工具,可以生成多个 Pareto 前沿的 2D 图。您可以使用内置工具导入数据,然后使用诊断工具轻松显示它们。以下图像是从诊断工具中捕获的。我执行了 NSGA-II 和 SMPSO 来解决 10 个种子的 LZ3 测试问题。近似集(例如已知的 Pareto Front)显示在右上角。

    MOEA 框架中的诊断工具使用JFreeChart 构建其绘图。如果您只对显示数据图感兴趣(而不执行任何其他分析),您可能只想使用 JFreeChart。但是,我建议使用诊断工具,因为它具有许多其他功能(例如计算超体积、代际距离、加性 Epsilon 指标的能力)

    最后,您可以随时使用 JavaFX 图表。这是一个相当健壮(尽管不成熟)的 API,而且图表实际上非常漂亮。下面是我使用 JavaFX 构建的 XY 散点图的屏幕截图。下面提供了生成此图的代码。更多示例/教程可在http://docs.oracle.com/javafx/2/charts/jfxpub-charts.htm

    获得

    import java.util.ArrayList;
    import java.util.Random;
    
    import com.sun.javafx.collections.ObservableListWrapper;
    
    import javafx.application.Application;
    import javafx.collections.ObservableList;
    import javafx.scene.Scene;
    import javafx.scene.chart.NumberAxis;
    import javafx.scene.chart.ScatterChart;
    import javafx.scene.chart.XYChart.Data;
    import javafx.scene.chart.XYChart.Series;
    import javafx.stage.Stage;
    
    public class ScatterChartSample extends Application {
    
        final double max = 20;
        final double min = 0;
    
        @Override
        public void start(Stage stage) {
            stage.setTitle("Scatter Chart Sample");
            final NumberAxis xAxis = new NumberAxis(min, max, (max - min) / 10);
            final NumberAxis yAxis = new NumberAxis(min, max, (max - min) / 10);
            final ScatterChart<Number, Number> sc = new ScatterChart<>(xAxis,
                    yAxis);
            xAxis.setLabel("f1");
            yAxis.setLabel("f2");
            sc.setTitle("Three Pareto Front");
    
            Series<Number, Number> series1 = new Series<>();
            series1.setName("Algorithm1");
            series1.setData(generateData());
    
            Series<Number, Number> series2 = new Series<>();
            series2.setName("Algorithm2");
            series2.setData(generateData());
    
            Series<Number, Number> series3 = new Series<>();
            series3.setName("Algorithm3");
            series3.setData(generateData());
    
            sc.getData().addAll(series1, series2, series3);
            Scene scene = new Scene(sc, 500, 400);
            stage.setScene(scene);
            stage.show();
        }
    
        /**
         * @return Generates random data resembling a Pareto front 
         */
        public ObservableList<Data<Number, Number>> generateData() {
            ObservableList<Data<Number, Number>> dataList = new ObservableListWrapper<>(
                    new ArrayList<>());
            Random rand = new Random();
    
            double x = min+rand.nextDouble();
            double y = max-rand.nextDouble();
    
            while (x < max && y > min) {
                x += rand.nextDouble();
                y -= rand.nextDouble();
                dataList.add(new Data<Number, Number>(x, y));
            }
            return dataList;
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    【讨论】:

    • 我是 MOEA 的新手:您能解释一下如何使用内置工具导入数据,然后使用诊断工具显示它们吗?是否有学习/生成/处理.adf文件的参考(诊断工具中要求加载的格式)
    • @ale-6 最新的用户指南售价 15 美元,可在 moeaframework.org/documentation.html 获得 但是,v2.5 的用户指南是免费的,可在 moeaframework.sourceforge.net/documentation.html 获得
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 2018-08-18
    相关资源
    最近更新 更多