我从MOEA算法中收集了3组pareto前端解决方案
我想知道是否有一个java库可以帮助从3组数据中绘制同一图中的3个pareto。
我有一个两个目标的问题。所以我想我需要一个2D图。
你能举个例子来帮助我吗?
发布于 2016-07-04 09:21:36
MOEA Framework提供了许多工具来分析MOEA的输出。它包括一个诊断工具,可以生成多个帕累托前沿的2D图。您可以使用内置工具导入数据,然后使用诊断工具非常轻松地显示它们。以下图像是从诊断工具中捕获的。我执行了NSGA-II和SMPSO算法来解决有10个种子的LZ3测试问题。近似集(例如,已知的Pareto Front)显示在右上角。

MOEA框架中的诊断工具使用JFreeChart构建其绘图。如果您只对显示数据的绘图感兴趣(而不执行任何其他分析),那么您可能只想使用JFreeChart。但是,我建议使用诊断工具,因为它具有许多其他功能(例如,计算超级卷、世代距离、Additive Epsilon Indicator的能力)
最后,您可以随时求助于使用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);
}
}https://stackoverflow.com/questions/35727930
复制相似问题