JFreeChart ライブラリを利用して、遺伝的アルゴリズムの進行状況をリアルタイムでプロットしています。
UIには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());
読んでくれてありがとう。