1

私は、先週まで正常に動作していた GA に取り組んでいます。コードを最適化するための努力の中で、プログラムが各世代の個人に関する情報をダンプする出力シーケンスをどうにか壊してしまいました。すべてのデバッグ作業で、おそらくフラッシュの問題であることがわかりましたが、核心に指を置くことはできません。奇妙なことに、コードの最後の作業バージョン以降、実際には IO のどの部分にも触れていません。

System.outGA は、本質的に「ミラーリング」およびSystem.errGUI への方法であるプログレス コンソールがある、はるかに大きなソフトウェアの一部です。デバッグ作業の結果、特に を呼び出してもバッファがフラッシュされないことに気付きました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("");  

}
4

0 に答える 0