我正在研究一个过去常常工作到上周的GA。在我优化代码的努力中,我以某种方式打破了程序转储有关每一代人的信息的输出顺序。在我所有的调试工作中,我开始明白它可能是一个令人烦恼的问题,但我无法真正指出问题。 奇怪的是,自从上一个工作版本的代码以来,我实际上没有触及IO的任何部分。
GA是一个更大的软件的一部分,其中有一个进度控制台,它本质上是一种“镜像”System.out
和System.err
到GUI的方法。根据我的调试工作,我意识到即使我专门拨打ps.flush()
,缓冲区也不会刷新。
这个问题可能是什么原因?
修改:回答评论中的问题以及有关问题的更多信息:
软件的其余部分正常输出到GUI和Eclipse控制台,只有对outputGenInfo()
方法(见下文)的调用已经消失
如果我在System.out.println("Fitness calculation is complete!");
方法中添加evaluateGeneration()
之类的通知行,该方法在outputGenInfo()
之前调用,则每个代的信息都会按预期完全打印出来。 。[那条特殊的线条是我在优化过程中修剪过的东西之一]
对于镜像/重定向System.out
我使用了Rob Camick编写的MessageConsole
类,可以找到here
可疑代码如下:
/**
* 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("");
}