我正在编写模拟退火程序,并且在调试时遇到一些问题。欢迎任何建议。
首先,输出不是确定性的,所以我已经运行了一百次并查看平均值和标准偏差。
但是,完成一个测试用例需要年龄和年龄(> 30分钟)。
通常,我会尝试减少输入,但减少迭代次数会直接降低结果的准确性,而这些方式并不完全可预测。例如,冷却计划是按迭代次数缩放的指数衰减。减少单独运行的数量会使输出非常不可靠(我试图捕获的错误之一是运行之间的巨大差异)。
我知道过早优化是所有邪恶的根源,当然在程序甚至正确之前优化还为时过早,但我认真考虑重写这是一种更快的语言(Cython或C)知道我' d最终必须将它移植回Python以供提交。
那么,有没有什么方法可以比现在更好地测试模拟退火算法?或者我应该在测试之间进行其他工作吗?
披露:这是课程作业,但我不是要求你帮助我进行实际模拟。
答案 0 :(得分:0)
以下是我在Drools Planner(java,开源)中实现元启发式(如模拟退火和禁忌搜索)时学到的一些调试技巧:
environmentMode
s(DEBUG
,REPRODUCIBLE
(默认)和PRODUCTION
)。在模式DEBUG
和REPRODUCIBLE
中,所有代码都使用相同的随机实例,Random
实例seed
已修复。因此,两次运行禁忌搜索实现会给出完全相同的移动,步骤和得分。模拟退火实现依赖于时间梯度,因此根据当时的CPU,可能会略有不同。注意:这不能成为统计运行的借口,但它确实可以使单次运行重现。Benchmarker
工具输出图表,以便更容易看到算法的作用。所以不要只看结果,还要看看它是如何实现的。它起初可能做得很好,但后来陷入了局部的最佳状态。
这些可以让您深入了解算法中实际发生的事情。
另外,请参阅我在Simulated Annealing上的博客文章。