【发布时间】: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