找到多个短路径的算法 网络流量

问题描述

寻求一种能够产生 N 条短路径的算法。

有没有人有使用算法在有向图中找到多条短路径的经验?我的应用程序是针对语言(查找同义词链)的,但从逻辑上讲,这可能是针对地理或社交网络的。我想要明显不同的路径,而不仅仅是沿途交换几个节点。如果有办法避免“枢纽”,即巨大的机场或超级连接器,我也真的很想;或在语言中,具有大量含义的词。

(对于我的应用程序,我已经使用 Dijkstra's 和 A-star 解决了这个问题,但是我还没有获得多条路径的好方法,除了在我得到了第一条路径。)

例如(如果是社交网络),我如何找到连接我和你的多条路径,一路上大多是不同的人。有可能有 4-7 个分离点,这是可能的。对于语言和社交网络,通常有 6 度左右的分离度。即它很少需要 20 多个节点。

我见过Dijkstra's algorithm to find all the shortest paths possiblea variation of shortest path algorithmWhat is difference between BFS and Dijkstra's algorithms when looking for shortest path?Find several shortest paths with A* algorithm——但没有一个是我想要的。

当然有人发现了这一点,但我不知道要搜索什么。

解决方法

网络流量

这个更适合社交网络案例,但也可能倾向于包含同义词链。 我想到的算法是 Dinic's,因为它的增广路径被选为最短可用路径。这将允许我们修改算法以适合您的情况。另请注意,我们将使用整数网络流。

图构建:

  • 源,汇
  • 对于每个人 p,节点 ps、pe 和有向边 (ps,pe) 容量为一。1
  • 对于原始图中的每条边 (u,v),一条边链 (ue,x1),(x1,x2),... (xk,vs) 使链节数等于(u,v).2 这是为了利用 Dinic 发现当前流最短改进的事实,因此这会惩罚较长的链,以免过早使用.
  • 对于您想要开始的人a,将(xs,xe) 的容量更改为路径数你想找到。3
  • 将具有无限容量的边从源添加到 xs
  • 将目标人员与接收器合并。 (或添加适当的边缘)

运行 Dinic 算法。结果流将由最大数量的分离路径组成。如果你足够快地终止算法,这些可能会很短,因为这是算法的开始。然而,由于我们构建的图中的网络流试图最大化分离路径的数量,如果它提高了计数,它将开始更喜欢较长的路径。这就是您可能想要限制第一个节点边缘容量的原因。


1更大的容量不适用于这种情况,因为它只会均匀地增加通过最短路径的流量。但是,如果您希望允许至少几个集线器或者如果您的分支稍后开始,您可以尝试调整某些边缘。
2注意,如果你有未加权的图,那么边(ue,vs)就足够了。
3或者无穷大,如果你想找到所有的。这可能会导致它们的成本不再合理。

,

这是@Shamis 已经提供的答案的变体。它允许重复使用节点,因此如果出现瓶颈,您仍然可以找到 n 解决方案。

比最大流量更通用的是 minimum cost flow。所以试试这个。

拿你的图,给出每条边的容量 1 和成本 1。现在为每条边添加第二条边,容量为 1,成本为 4。 (如果可以的话,我使用 4 作为启发式方法,使其避开该边。)添加容量为 1 且成本为 16 的第三条边。依此类推,直至成本边缘 4^n

this book 中,您会发现以下关于最小成本流的不明显结果:

由于基本可行解是整数值的,所以当有一个最优解时,就会有一个整数值的。这使得即使需要整数值解决方案时,也可以使用线性规划算法来解决最小成本流问题。我们将在以下小节中讨论一些示例。

我们现在寻找容量 n 的最小成本流。如果有 n 个独立的解决方案,您会找到它们。如果他们必须重用节点,您会找到努力工作以不重用节点的解决方案。如果需要,他们会走得更久。

如果您将序列 1,4,16,... 更改为其他内容,您将在接受更长的解决方案和避免重复的解决方案之间获得不同的权衡。

我没有提供关于它的效率的估计。只是它是可行的。