【问题标题】:Finding a shortest path that passes through some arbitrary sequence of nodes?找到一条通过任意节点序列的最短路径?
【发布时间】:2011-09-06 03:50:01
【问题描述】:

this earlier question 中,OP 询问如何在图中找到从 u 到 v 并且还通过某个节点 w 的最短路径。公认的答案非常好,是运行 Dijkstra 算法两次——一次从 u 到 w,一次从 w 到 v。这具有等于 Dijkstra 算法的两次调用的时间复杂度,即 O(m + n 记录 n)。

现在考虑一个相关问题 - 给定一系列节点 u1、u2、...、uk 和想找到从 u1 到 uk 的最短路径,使得路径经过 u1, u2, ..., uk 的顺序。显然,这可以通过运行 Dijkstra 算法的 k-1 个实例来完成,每对相邻顶点一个,然后将最短路径连接在一起。这需要时间 O(km + k n log n)。或者,您可以使用像约翰逊算法这样的全对最短路径算法来计算所有最短路径,然后在 O(mn + n2 log n) 时间内将适当的最短路径连接在一起,这很好k 远大于 n。

我的问题是,当 k 较小时,是否有一种算法可以比上述方法更快地解决这个问题。这样的算法存在吗?还是迭代的 Dijkstra 尽可能好?

【问题讨论】:

  • 这听起来像是旅行商问题en.wikipedia.org/wiki/Travelling_salesman_problem
  • @SauceMaster- 这不是完全的 TSP,因为我们可以重新访问节点并且因为节点的顺序是指定的。不过谢谢!
  • @templatetypdef:同意。相似但不一样。
  • 我怀疑这样的算法是否存在。也许试试 cstheory.stackexchange?
  • k 不能比n 大很多

标签: algorithm graph shortest-path graph-algorithm dijkstra


【解决方案1】:

不是运行 Dijkstra 算法的孤立实例来一次找到路径u(k) -> u(k+1) 一个路径,而是可以在序列中的每个节点同时启动修改后的类似 Dijkstra 搜索的单个实例,路径形成时搜索区域符合“中间”。

与对 Dijkstra 算法进行一系列孤立调用相比,这可能会减少访问的边总数并减少边的重新遍历。

一个简单的例子是找到两个节点之间的路径。扩展两个节点的搜索区域比仅扩展一个节点要好。在均匀图的情况下,第二个选项将给出一个半径等于节点之间距离的搜索区域,第一个选项将给出两个半径为一半的区域 - 总搜索面积较小。

只是一个想法。

编辑:我想我说的是bi-directional search 的多向变体,其方向与{u(1), u(2), ..., u(m)} 序列中的节点一样多。

【讨论】:

  • 当涉及到加权边缘时,双向搜索失败。考虑以下几点:(1)-(2)-(3)-(4)-(5) 每条边的权重为 1,另外一条边 (1)-(5) 的权重为 3。从 1 到的最短路径5 使用 (1)-(5),但双向搜索会给你 4,因为它会首先找到 1->2->3 和 3->4->5。
【解决方案2】:

我不知道我们如何才能做得更好,这就是我能想到的。假设图是无向的,从任何节点 u 到节点 v 的最短路径将与从 v 到 u 的最短路径相同(当然相反)。

现在,对于您的最短路径顺序为 u1 u2 u3..un 的情况,我们可以在 u2 上运行 Djikstra 算法(并在一次运行中找到最短路径 u1-u2、u2-u3),然后在 u4 上运行(对于 u3-u4 和 u4-u5),然后是 u6.. 等等。这将您应用 Djikstra 的次数减少了大约一半。请注意,在复杂性方面,这与原始解决方案相同。

【讨论】:

  • 不错的方法。任何想法/想法如何将其应用于有向图?
  • @kyun, amit:我认为您可以概括这种方法。对于无向图,您可以计算每个节点在(当前)未遍历路径集中出现的次数,并从具有最高计数的节点开始 Dijkstra 以查找相邻路径。这应该考虑节点出现在超过 2 个路径中的情况。对于有向图,您可以计算每个节点作为未遍历集中路径的 origin 出现的次数,并遵循相同的方法。
【解决方案3】:

通过一次调用 Dijkstra 算法,您可以获得图中从一个顶点到所有另一个顶点的最短路径。因此,您只需要搜索每个 唯一 起始顶点,因此重复的顶点不会使问题变得更难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多