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