我正在利用JFreeChart库来实时绘制遗传算法的进度 .
我正在使用Swing作为用户界面 . 我有一个面板,我绘制算法的所有各种参数,以及ChartPanel对象 . 在调用算法的搜索方法(在每一代更新图表的XYSeries对象)之前和搜索结束时绘制此对象,并准确绘制所有值 .
根据文档,ChartPanel对象在更新其相应图表时会重新绘制 . 显然,Swing面板本身在搜索完成之后才会重新绘制,我调用repaint(),但是我该怎么做才能解决这个问题呢?
这是图表代码:
public class XYSeriesDemo {
private static final long serialVersionUID = 1L;
private XYSeries series;
private JFreeChart chart;
public XYSeriesDemo(String str) {
series = new XYSeries(str);
XYSeriesCollection data = new XYSeriesCollection(series);
chart = createChart(data);
}
public XYSeries getSeries() {
return series;
}
public ChartPanel getChartPanel() {
return new ChartPanel(chart);
}
private JFreeChart createChart(final XYDataset data) {
JFreeChart chart = ChartFactory.createXYLineChart(
"Best fitness across generations",
"Generation",
"Fitness",
data,
PlotOrientation.VERTICAL,
true,
true,
false
);
XYPlot plot = chart.getXYPlot();
ValueAxis axis = plot.getDomainAxis();
axis.setAutoRange(true);
axis = plot.getRangeAxis();
axis.setAutoRange(true);
return chart;
}
}
在我的面板构造函数中,我正在执行以下操作(这会得到一个空图表):
demo = new XYSeriesDemo("Best fitness");
this.add(demo.getChartPanel());
这是当用户订购搜索时Swing框架在我的JPanel对象中调用的方法:
public void solve() {
gen = new Random(seed);
XYSeries s = demo.getSeries();
GeneticAlgorithm ga = new GeneticAlgorithm(pop, crossoverP, mutationP,
eliteSize, maxGens, gen, s);
best = ga.search();
state = State.SOLVED;
time = ga.getTime() / 1E9;
}
在每一代中,算法中的搜索方法都可以:
series.add(generation, pop.getBestFitness());
谢谢你的阅读 .