计时随机算法

时间:2013-01-10 21:30:23

标签: algorithm random benchmarking

我有一个随机递归回溯算法来生成数独谜题(参见here)。它的平均工作速度足够快,但最坏情况的运行时速度慢得令人无法接受。以下是100次试验的运行时间直方图(以毫秒为单位)(“更多”约为200,000毫秒!):

enter image description here

我想通过在 t ms之后简单地计时并使用新的随机种子重新启动来改进算法。为了防止这种情况无限重复,我会在 n 尝试后停止,或者在每次尝试失败后增加 t 。如果 t 远大于中位数,那么很有可能在后续尝试中获得更快的运行速度。

问题:

  1. 如何为不同的处理器调整 t 的超时时间?是否有一种快速,可靠的方法来在每次运行之前对处理器性能进或者,我应该在多次运行中适应处理器,例如使用所有先前运行的平均运行时间?我在Android上运行它,如果这是相关的。
  2. 是否有更好的策略来避免运行时分布的长尾?

2 个答案:

答案 0 :(得分:2)

由于您的算法是重新计算的,为什么不建立最大递归深度?如果特定的随机种子导致递归深度,你已经根据经验建立得足够高以至于你会击中长尾,那么就会中止。

通过视觉逼近,看起来在4500毫秒之后,您将无法获得对给定种子的投资的显着回报。重新运行该基准测试还跟踪递归深度,并查看该数字是什么。不过,我会跑100多个样本。

该解决方案与CPU速度无关。

答案 1 :(得分:1)

  1. 是的,它被称为 confidence interval 。通过在预处理(或动态)中多次运行算法,您可以确定x%置信度(其中x是参数) interval 的中位数是什么运行时间在。
    您可以通过减少x或增加算法运行的次数来减小间隔大小。

    当然如果你不能真正运行算法本身,你可以尝试在某台机器上对它进行基准测试并找到置信区间(让它为I),并创建一些函数{{如果在不同的机器(M)上给出不同的算法的定时(它的定时是s),则预测机器M的间隔应该是什么。 发现f(I,s)以类似的方式完成 - 使用置信区间。

  2. 你的方法看起来很好,我可能会做同样的事情 - 我会首先设置一个小因子,并在每次尝试失败后增加它。请注意,这与congestion control in the TCP protocol(来自网络领域)类似,以便通过网络查找已接受的包裹转移率。