我正在寻找一种很好的方法来找到数十亿节点的网络中两个点之间的最短路径(有向,循环,加权)。基本上我想要一种通常能够非常快速地获得解决方案的算法,即使最坏的情况是可怕的。
我对并行或分布式算法持开放态度,虽然它必须对数据集的大小有意义(在图形卡上使用CUDA的算法必须能够以块的形式处理) 。我不打算使用一个计算机农场来做这件事,但最多可能有几个。
答案 0 :(得分:2)
谷歌搜索为您提供了很多好links。第一个link本身讨论了两种最短路径算法的并行实现。
谈到CUDA的实现,你必须记住数十亿个节点=千兆字节的内存。这将限制每个卡可以使用的节点(以获得最佳性能)。目前市场上graphics card的最大容量约为6GB。这可以估计您可能需要使用的卡数(不一定是机器数量)。
答案 1 :(得分:1)
看看Dikstra的算法。通常它会进行优化的多深度广度优先搜索,直到您确保找到最短路径。找到的第一条路径可能是最短路径,但在搜索的其他分支不以较短距离终止之前,您无法确定。
答案 2 :(得分:1)
您可以使用统一费用搜索。该搜索算法将在加权图中找到最优解。如果我没记错的话,搜索复杂度(空间和时间)是b ^(C * / e + 1),其中b表示分支,C *表示目标的最优路径成本,e是平均路径成本。 / p>
还有一种称为双向搜索的东西,你可以从搜索的初始状态和目标状态开始,希望两个起始点在图形中间的某个位置相互交叉:)
答案 3 :(得分:0)
我担心,除非你的图形以某种方式很好地放在内存中,否则与CPU上经过良好调优的并行算法相比,使用CUDA不会带来太多好处。问题是,在“完全无序”的图形上行走会导致大量随机存储器访问。
如果有32个CUDA线程并行工作,但它们的内存访问是随机的,则必须序列化fetch指令。由于搜索算法不执行许多硬数学计算,因此在大部分时间内可能会占用内存。