在Java中绘制帕累托前端解决方案

时间:2016-03-01 16:16:03

标签: java genetic-algorithm pareto-chart

我从MOEA算法中收集了3套帕累托前端解决方案

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

我有一个2个目标的问题。所以我想我需要2D P​​lot。

你能举一个例子帮助我吗?

1 个答案:

答案 0 :(得分:2)

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

MOEA Diagnostic Tool

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

最后,您始终可以使用JavaFX图表。它是一个相当强大(虽然不成熟)的API,而且图表实际上非常漂亮。下面你会找到我使用JavaFX构建的XY-Scatter图的截图。生成此图的代码如下所示。其他示例/教程可在http://docs.oracle.com/javafx/2/charts/jfxpub-charts.htm

获得

JavaFX Chart

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);
    }
}