并行化A *以进行昂贵的成本计算

时间:2019-06-25 19:16:23

标签: algorithm graph-algorithm shortest-path a-star

我正在尝试使用耗时的成本函数执行A *。 cost函数是单线程的,可能要花费几秒钟,并且无法优化。

我想并行计算尽可能多的费用。

万一重要,我可以接受一种启发式算法,计算起来很便宜。

1 个答案:

答案 0 :(得分:3)

答案中有两件事要讨论。首先是算法效率。第二个是并行性。

有一个research paper在研究这种情况并创建一个A *变体DEA *。它使用对边缘成本的廉价可允许的启发式方法来获得后继者成本的下限,然后仅在证明后继者处于最佳路径时才计算边缘的实际成本。

通常,A *通过(1)生成具有新f成本的后继项,以及(2)将其打开来扩展节点。 DEA *算法(1)生成具有估计f成本(较低边界)的后继者,而(2)将其置于开放状态。如果仅使用f成本估算将状态从开放中移除,则会计算出精确的边沿/ f成本,并将状态放回开放状态。

这是Partial Expansion总体思想的一种变体,other work也探索了昂贵的边缘问题。

在此模型中,可以避免计算许多昂贵的边,这很有用。但是,并行计算剩余边缘仍然有用。根据确切的成本,有很多方法可以做到这一点。如果您的打开列表是多线程的,则每次添加状态以打开时,它都可以计算边缘成本。但是,本质上具有两个优先级队列会更有效。

一个优先级队列将包含已计算其边缘成本的状态,另一个优先级队列将包含需要完成计算的状态。可以编写并行代码以从第二优先级队列获取状态并计算其边缘成本,并在完成时将其添加到第一队列。然后,常规程序可以按常规优先级顺序处理第一个队列中的状态。

关键点在于,并行部分可以集中精力为即将扩展的状态计算边缘成本,而不是在将所有状态添加到队列时进行所有处理。

请注意,类似这样的过程可能会导致在发现较短路径之前先探索较长路径。因此,您需要跟踪发现状态的较短路径(打开或关闭状态)的时间,并确保在发现较短路径时将状态从闭合状态移回打开状态。

与此相关,找到解决方案后就无法终止-它不一定是最佳方案。您需要完成扩展所有f成本低于找到的解决方案的州。 (您可以丢弃解决方案成本大于或等于找到的解决方案的任何状态。) [请注意,我已经在此处给出了有关好的方法的一般指导;如果您对具体细节有疑问,可以要求澄清。]