1

我正在编写一个模拟退火程序,并且在调试它时遇到了一些麻烦。任何的建议都受欢迎。

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

但是完成一个测试用例需要很长时间(> 30 分钟)。

通常,我会尝试减少输入,但减少迭代次数会以无法完全预测的方式直接降低结果的准确性。例如,冷却计划是与迭代次数成比例的指数衰减。减少单独运行的数量会使输出非常不可靠(我试图寻找的错误之一是运行之间的巨大差异)。

我知道过早的优化是万恶之源,在程序甚至正确之前进行优化肯定还为时过早,但我正在认真考虑重写这是一种更快的语言(Cython 或 C),因为我知道我必须这样做最后将其移植回 Python 进行提交。

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

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

4

1 回答 1

0

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

  1. 它支持不同environmentMode的 s ( DEBUG, REPRODUCIBLE(默认) 和PRODUCTION)。在模式DEBUGandREPRODUCIBLE中,所有代码都使用相同的 Random 实例,并且该Random实例seed是固定的。因此,两次运行禁忌搜索实现会给出完全相同的动作、步骤和结果分数。模拟退火实现依赖于时间梯度,因此取决于当时的 CPU,可能会有细微的差异。注意:这并不能让您免于统计运行,但它确实使单次运行可重现。
  2. 好的,可读的日志记录。使用日志记录级别。不要记录太冗长。
  3. 我们的构建服务器(Hudson)保持性能统计。
  4. 有一个Benchmarker工具可以输出图表,以便更容易看到算法做了什么。所以不要只看结果,还要看它是如何到达那里的。起初它可能做得很好,但后来陷入了局部最优。

基准总结

基准测试详细信息

正是这些东西让你深入了解算法中实际发生的事情。

另外,请参阅我关于模拟退火的博客文章。

于 2011-03-08T11:26:20.840 回答