如何更快地调试蒙特卡罗模拟?

时间:2011-03-06 00:51:23

标签: debugging simulated-annealing

我正在编写模拟退火程序,并且在调试时遇到一些问题。欢迎任何建议。

首先,输出不是确定性的,所以我已经运行了一百次并查看平均值和标准偏差。

但是,完成一个测试用例需要年龄和年龄(> 30分钟)。

通常,我会尝试减少输入,但减少迭代次数会直接降低结果的准确性,而这些方式并不完全可预测。例如,冷却计划是按迭代次数缩放的指数衰减。减少单独运行的数量会使输出非常不可靠(我试图捕获的错误之一是运行之间的巨大差异)。

我知道过早优化是所有邪恶的根源,当然在程序甚至正确之前优化还为时过早,但我认真考虑重写这是一种更快的语言(Cython或C)知道我' d最终必须将它移植回Python以供提交。

那么,有没有什么方法可以比现在更好地测试模拟退火算法?或者我应该在测试之间进行其他工作吗?

披露:这是课程作业,但我不是要求你帮助我进行实际模拟。

1 个答案:

答案 0 :(得分:0)

以下是我在Drools Planner(java,开源)中实现元启发式(如模拟退火和禁忌搜索)时学到的一些调试技巧:

  1. 它支持不同的environmentMode s(DEBUGREPRODUCIBLE(默认)和PRODUCTION)。在模式DEBUGREPRODUCIBLE中,所有代码都使用相同的随机实例,Random实例seed已修复。因此,两次运行禁忌搜索实现会给出完全相同的移动,步骤和得分。模拟退火实现依赖于时间梯度,因此根据当时的CPU,可能会略有不同。注意:这不能成为统计运行的借口,但它确实可以使单次运行重现。
  2. 良好,可读的记录。使用日志记录级别。不要记录过于冗长。
  3. 我们的构建服务器(Hudson)保留性能统计信息。
  4. 有一个Benchmarker工具输出图表,以便更容易看到算法的作用。所以不要只看结果,还要看看它是如何实现的。它起初可能做得很好,但后来陷入了局部的最佳状态。
  5. Benchmarker summary

    Benchmarker detail

    这些可以让您深入了解算法中实际发生的事情。

    另外,请参阅我在Simulated Annealing上的博客文章。