复杂网络 - 查找一对节点之间的所有可能的最短路径

时间:2015-04-04 18:57:05

标签: complex-networks

我有一个描述庞大网络的数据库。它由大约18000个顶点组成。现在我需要找到一对节点之间所有可能的最短路径。我已经尝试实现迭代DFS,但问题是指数增长。所需的时间量变得很大,因为顶点具有高的出度。你能建议一些能更快运行的算法吗?我所拥有的复杂网络是有针对性和加权的。任何建议都会有很大的帮助。

谢谢, 的Ekta

1 个答案:

答案 0 :(得分:0)

对于具有正权重的加权图,通常使用统一成本搜索,即Dijkstra's algorithm。在特定情况下,其他算法可以更快。例如,如果您的数据允许您定义启发式函数,则可以使用A*代替。或者,如果您的网络是无标度的(即其度数是幂律分布的),您可以使用Peng et al.'12中描述的Dijkstra算法的变体。

您可能还需要查看一些相关的SO问题,例如Is there better way than a Dijkstra algorithm for finding fastest path that do not exceed specified costAre there faster algorithms than Dijkstra?

编辑:要查找给定节点对之间的所有最短路径,您仍然可以使用Dijkstra,只需进行一些更改:

  • 使用搜索树来应用算法(反对直接在您探索的图表上应用算法)。这样,您可以轻松地表示通向同一节点的多条路径。请参阅WP Breadth-first search article以查看搜索树的示例。所以这更多的是数据结构问题。
  • 允许再次访问已访问过的节点,前提是1)通向此节点的路径与树中已经表示的路径不同,并且2)不长于此现有路径。在搜索树方面,这意味着允许一个图节点表示为两个不同的树节点,每个树节点在不同的分支中。
  • 开发树直到找到第一个最优解,然后继续使用此解决方案的长度作为限制开发树(即,当达到此长度时停止开发分支)。
  • 最后,包含目标节点的每个分支应对应最佳最短路径。

您还可以查看此问题(虽然它涉及未加权的图表):Finding all the shortest paths between two nodes in unweighted undirected graph