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

Debugging 如何更快地调试蒙特卡罗模拟?,debugging,simulated-annealing,Debugging,Simulated Annealing,我正在写一个模拟退火程序,调试时遇到了一些问题。欢迎提供任何建议 首先,输出是不确定的,所以我已经运行了一百次,查看平均值和标准偏差 但是,完成一个测试用例需要很多时间,而且时间>30分钟 通常,我会尽量减少输入,但减少迭代次数会直接降低结果的准确性,这是不完全可预测的。例如,冷却计划是按迭代次数缩放的指数衰减。减少单独运行的次数会使输出非常不可靠。我试图找出的错误之一是运行之间的巨大差异 我知道过早优化是万恶之源,当然,在程序正确之前进行优化肯定还为时过早,但我正在认真考虑重写这是一种速度更快

我正在写一个模拟退火程序,调试时遇到了一些问题。欢迎提供任何建议

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

但是,完成一个测试用例需要很多时间,而且时间>30分钟

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

我知道过早优化是万恶之源,当然,在程序正确之前进行优化肯定还为时过早,但我正在认真考虑重写这是一种速度更快的语言Cython或C,因为我知道最终必须将其移植回Python以供提交

那么,有没有办法比我现在的测试更好地测试模拟退火算法呢?或者我应该在测试之间做些别的事情


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

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

它支持不同的环境模式调试、可复制默认和生产。在DEBUG和repeatable模式下,所有代码都使用相同的随机实例,并且随机实例种子是固定的。因此,两次运行禁忌搜索实现会给出完全相同的动作、步骤和结果分数。模拟退火的实现依赖于时间梯度,因此根据当时的CPU,可能会有轻微的差异。注意:这并不能免除统计运行的责任,但它确实可以使单个运行重现。 好的、可读的日志记录。使用日志记录级别。不要记录得太详细。 我们的构建服务器Hudson保存性能统计数据。 有一个基准测试工具,可以输出图表,以便更容易地查看算法的功能。所以,不要只看结果,还要看它是如何达到目的的。起初它可能做得很好,但后来陷入了局部最优。 正是这些东西让你对算法中实际发生的事情有了深入的了解


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

您可以进行大量的日志记录,然后手动运行,直到找到错误所在。您可能需要分析代码,以了解速度有多慢。在尝试一些复杂的东西之前,提出一些测试用例并确保它们正常工作。从小处开始构建。我已经尝试了日志记录和单元测试。看起来所有输入到主退火循环的函数都是正确的,而且,从日志记录来看,看起来我正在做我想要做的决定。问题似乎是我不理解生成候选项和冷却计划的正确策略,这会导致快速收敛,所以我正在测试一系列不同的策略。我曾考虑过将单独的运行并行化,但我想知道这样做是否值得。