【问题标题】:Complex Networks-Finding all possible shortest paths between a pair of nodes复杂网络——找到一对节点之间所有可能的最短路径
【发布时间】:2015-04-04 18:57:04
【问题描述】:

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

谢谢, 埃克塔

【问题讨论】:

  • 你真的要实现它吗?或者现有的工具可以吗?
  • 是的,我需要实现它。是否有任何现有的工具可以找到路径?如果是,我也想看看他们
  • 您可以使用许多与图形相关的库。首先想到的是 igraph(可用于 C、R 和 Python,地址为 igraph.org/redirect.html)。关于您的数据,链接是否加权,如果是,这些权重可以是负值吗?
  • 是的,链接是加权的,但权重都是正数。

标签: complex-networks


【解决方案1】:

对于具有正权重的加权图,通常使用统一成本搜索,即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

【讨论】:

  • 是的,使用 Dijkstra 算法是一种解决方案,但我需要找到所有可能的最短路径,而不是单个最短路径
  • 然后我建议您编辑您的问题及其标题,在其中您声明您寻找 a 对节点之间的最短路径。另外,我编辑了我的答案。
  • 我实际上有一对节点,我正在寻找它们之间所有可能的最短路径。对于给定的一对节点,可以存在多个相同长度的路径,这就是我希望找到的。 Floyd-Warshall 适用于全对最短路径,不是吗?您认为查看一些 k 最短路径算法会有所帮助吗?
  • 好的,现在我明白你的意思了。我相应地编辑了我的答案。
猜你喜欢
  • 2021-11-30
  • 2022-12-08
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多