1

我正在研究一个直到上周都可以正常工作的 GA。在我优化代码的努力中,我以某种方式破坏了程序转储有关每一代人的信息的输出序列。在我所有的调试工作中,我开始明白这可能是一个冲洗问题,但我不能真正把手指放在症结上。奇怪的是,自从代码的最后一个工作版本以来,我实际上没有触及 IO 的任何部分。

GA 是一个更大的软件的一部分,其中有一个进度控制台,它本质上是一种“镜像”System.outSystem.errGUI 的方式。从我的调试工作中,我意识到即使我专门调用缓冲区也不会刷新ps.flush()

这个问题的原因可能是什么?


编辑:要回答评论中的问题,以及有关该问题的更多信息:

  • 软件的其余部分正常输出到 GUI 和 Eclipse 控制台,只是对outputGenInfo()方法的调用(见下文)消失了

  • 如果我添加一条通知行,例如System.out.println("Fitness calculation is complete!");在我的evaluateGeneration()方法中调用,该方法在每一代的信息完全按预期打印之前被调用outputGenInfo()...... [那条特定的行是我在优化工作期间修剪的东西之一]

  • 对于镜像/重定向System.out,我使用了MessageConsoleRob Camick 编写的类,可以在这里找到


可疑代码如下:

/**
 * 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