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

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

要回复问题请先登录注册