假设我有一个可计算的谓词P,将整数映射到布尔值。我知道P 0为真,并且我知道某个N使得P N为假。我还知道P n = false意味着P (n + 1)也为false [*]。我想找到最大的n,使得P n为真。
显然,我可以通过二分法找到解决方案。不幸的是,评估P很耗费时间(可能需要一小时左右)。我还有一个拥有许多内核的闪亮服务器。
如果评估P需要恒定的时间并且我有2个线程(比如),我可以看到如何进行搜索。我将区间[a,b]分成三个部分,并评估P(2a + b)/ 3和P(a + 2b)/ 3。一旦两个评估都完成,我就会知道要递归进入哪个三段。使用两个线程,我的搜索时间将减少三分之一。太好了!
但是,如果评估P需要极端变化的时间呢?在我的具体示例中,它可能需要10秒到一小时左右的时间。再次假设我有2个线程并按上述方式划分间隔。也许第一个线程(评估P(2a + b)/ 3)先完成。我该如何决定下一个运行在哪里?
我猜这与信息论或类似的东西有关,因为我正在尝试运行测试,给出当前知识的情况下会给我最多的信息。但是这似乎应该是其他人已经调查过的问题-有人可以指向论文或类似的东西吗?
[*] 在我关心的具体情况中,测试涉及运行SMT求解器,尝试找到一个约束问题的解X,并具有一个额外的约束条件形式为X≥n,其中n是上面的整数。
显然,我可以通过二分法找到解决方案。不幸的是,评估P很耗费时间(可能需要一小时左右)。我还有一个拥有许多内核的闪亮服务器。
如果评估P需要恒定的时间并且我有2个线程(比如),我可以看到如何进行搜索。我将区间[a,b]分成三个部分,并评估P(2a + b)/ 3和P(a + 2b)/ 3。一旦两个评估都完成,我就会知道要递归进入哪个三段。使用两个线程,我的搜索时间将减少三分之一。太好了!
但是,如果评估P需要极端变化的时间呢?在我的具体示例中,它可能需要10秒到一小时左右的时间。再次假设我有2个线程并按上述方式划分间隔。也许第一个线程(评估P(2a + b)/ 3)先完成。我该如何决定下一个运行在哪里?
我猜这与信息论或类似的东西有关,因为我正在尝试运行测试,给出当前知识的情况下会给我最多的信息。但是这似乎应该是其他人已经调查过的问题-有人可以指向论文或类似的东西吗?
[*] 在我关心的具体情况中,测试涉及运行SMT求解器,尝试找到一个约束问题的解X,并具有一个额外的约束条件形式为X≥n,其中n是上面的整数。
n
没有"函数关系",对吗?在许多情况下,P(n+1) 可能比 P(n) 花费更长的时间,但肯定有一些问题不是这种情况。如果运行时间基本上是"随机的"(即根本无法预测),那么很可能很难找到任何比分割区间并尝试更系统的方法。然后,它将归结为传递给线程的"评估P任务"的顺序,并依赖于 https://en.wikipedia.org/wiki/Work_stealing 或类似技术... - Marco13n
的增大,运行时间是否通常会增加。通过使用从P(0),P(N)和P(N / 2)开始的二分查找,可能可以快速推导出有关运行时间的大致估计(甚至可以猜测它是线性还是二次方)。这可能至少给出一个粗略的提示,关于一种可能有助于快速缩小到正确的n
的策略。 - Marco13n
)。奇怪的是,随着接近截止点,运行时间似乎并没有增加太多:可能难度的增加被不强制选择的数量减少所抵消了?(不确定)。 - Rupert Swarbrick