私は、先週まで正常に動作していた GA に取り組んでいます。コードを最適化するための努力の中で、プログラムが各世代の個人に関する情報をダンプする出力シーケンスをどうにか壊してしまいました。すべてのデバッグ作業で、おそらくフラッシュの問題であることがわかりましたが、核心に指を置くことはできません。奇妙なことに、コードの最後の作業バージョン以降、実際には IO のどの部分にも触れていません。
System.out
GA は、本質的に「ミラーリング」およびSystem.err
GUI への方法であるプログレス コンソールがある、はるかに大きなソフトウェアの一部です。デバッグ作業の結果、特に を呼び出してもバッファがフラッシュされないことに気付きましたps.flush()
。
この問題の原因は何ですか??
編集:コメント内の質問に答えるだけでなく、問題に関する詳細情報:
ソフトウェアの残りの部分は通常どおり GUI と Eclipse コンソールに出力され
outputGenInfo()
ます。消えたのはメソッドの呼び出し (以下を参照) だけです。各世代の情報が期待どおりに正確に印刷される直前に呼び出されるメソッドなどの通知行を追加する
System.out.println("Fitness calculation is complete!");
と... [その特定の行は、最適化の取り組み中にトリミングしたものの1つでした]evaluateGeneration()
outputGenInfo()
ミラーリング/リダイレクトには、 Rob Camick によって書かれ
System.out
たクラスを使用しました。MessageConsole
疑わしいコードは次のとおりです。
/**
* Convenience method for getting debug/info
* on this generation
* @param ps - a <code>PrintStream</code> to output to
* */
public void outputGenInfo(PrintStream ps){ // <-- ps = System.out by default
double stdev_fitness = stats.getStandardDeviation();
double mean_fitness = stats.getMean();
double cv = stdev_fitness / mean_fitness;
StringBuilder sb = new StringBuilder();
String new_line = System.getProperty("line.separator");
sb.append(new_line);
sb.append("+++++++++++++++++++++++++++++++++");
sb.append(new_line);
sb.append("Generation: " + this.id);
sb.append(new_line);
sb.append("-------------------------------");
sb.append(new_line);
sb.append("Mean fitness: " +
String.format("%.3f",mean_fitness) +
", CV: " + String.format("%.3f",cv));
sb.append(new_line);
sb.append("Top fitness: " + getTopIndividual().getEntropy());
sb.append(new_line);
sb.append("+++++++++++++++++++++++++++++++++");
sb.append(new_line);
ps.println(sb.toString());
// during debug this actually helps but not when the code is running full throttle!
System.out.println("");
}