【问题标题】:From every starting node, to every end node, calculate shortest distance. Node to node distance is 1从每个起始节点到每个结束节点,计算最短距离。节点到节点的距离为 1
【发布时间】:2020-08-02 07:19:53
【问题描述】:

我必须计算从 n 个凝视节点到 n 个末端节点的最短距离。我不在乎实际路径。节点数远大于n。每个节点恰好连接到 9 个节点。节点到节点的距离为 1。 我最好的想法是为起始节点做一个Breadth-first search,如果我理解正确,它将在线性时间内给我n个结束节点距离,我会为每个起始节点做这件事。

有更快的方法吗?

编辑: 完整的问题是我有一条 2d 赛道、一条终点线和一辆必须跑几圈的汽车,而这辆车只能有 121 个不同的速度向量,所以 vx=[-5,5], vy =[-5,5] 并且每刻只能改变它的速度向量 +-1。此外,汽车不应该撞到墙上。我想计算它可以完成这些圈的确切最短时间(滴答声)。我的想法是从速度-位置对创建节点,并计算从每个终点线点的每个速度到同一终点线的每个速度-位置对的最短路径。然后使用这些数据在知道汽车的起始位置的情况下,针对给定的圈数进行单独的路径查找。

【问题讨论】:

  • “有没有更快的方法” - 是的,您选择了天真的解决方案。您有一个简单的图表,其中包含一个简单的 n 对 n 查询。标准最短路径计算。例如,您可以使用基本的 Set-Dijkstra 算法。或者使用使用地标启发式的 A-star 来增强它。如果您需要查找某些内容或只是想获得代码,例如,您可以使用我创建的这个简单项目ZabuzaW/Maglev
  • 没关系,你的边的权重都正好为 1。BFS 或 DFS 可以解决问题。但是,根据图结构,目标方向启发式算法将极大地改进算法。从您的广泛描述来看,听起来像乌鸦一样的A-star就可以了。地标也运作良好。请注意,所有边都具有相同权重的 Dijkstra 基本上只是 BFS。
  • 投票结束,因为问题缺少必要的细节。例如,如果不知道图的确切结构,我们就无法找到好的启发式算法。
  • 我更详细地编辑了我的问题。我研究了 A-star 算法,它确实似乎比我的幼稚方式更快的算法,但我不知道如何在不每次起点重做的情况下用它进行 n 到 n 计算。在您的项目中,“最接近所有可到达节点的来源”会做这样的事情吗?
  • 是的。您有一个 set-dijkstra(您只需将所有这些节点作为起始节点添加到队列中)。然后,一旦您解决了所有必需的目标节点,您就会中止。所以基本的 Dijkstra + 将所有起始节点添加到初始队列 + 在解决所有目的地后停止,而不仅仅是一个。然后添加 a 启发式以获得 a-star(a-star 是带有启发式的 dijkstra)。如果不了解图结构的详细信息,我无法告诉您哪种启发式方法最好。但地标总是很好(ALT)。 As-the-crow-flies 是微不足道的,但可能效果很好,具体取决于结构。

标签: algorithm graph shortest-path graph-traversal


【解决方案1】:

是的,使用 Djikstra 的最短路径算法:

1) 创建一个集合 sptSet(最短路径树集),跟踪包含在最短路径树中的顶点,即计算并确定其与源的最小距离。最初,这个集合是空的。

2) 为输入图中的所有顶点分配一个距离值。将所有距离值初始化为 INFINITE。将源顶点的距离值指定为 0,以便首先拾取它。

3) 虽然 sptSet 不包含所有顶点

….a) 选择一个在 sptSet 中不存在且具有最小距离值的顶点 u。

….b) 将 u 包含到 sptSet。

….c) 更新 u 的所有相邻顶点的距离值。要更新距离值,请遍历所有相邻顶点。对于每个相邻的顶点v,如果u的距离值(来自源)与边u-v的权重之和小于v的距离值,则更新v的距离值。

【讨论】:

  • 如果所有边权重都相等(如 OP 所说),一个简单的 Dijkstra 确实不会改进 BFS,因为它基本上是一个愚蠢的 BFS。您需要在这里实际改进算法的是目标方向启发式算法,例如 as-the-crows-fly 或 ALT(地标)。因无用而被否决,请参阅How to Answer,谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
相关资源
最近更新 更多