【问题标题】:2d gridbased Pathfinding: Cheapest way/algorithm to find out if a location is reachable [closed]基于二维网格的寻路:找出某个位置是否可达的最便宜的方法/算法[关闭]
【发布时间】:2016-10-27 10:50:00
【问题描述】:

我的主要寻路是通过 aStar 算法的实现来完成的。只要有可用的路径,性能就很好。

但是,如果没有,则可能会解析所有可用节点,直到您得出没有路径的结论。

我能想到的最糟糕的情况是,在目标位置相对靠近目标位置周围的障碍物很少。

到目前为止,我提出的一些想法可能会提高整体性能:

  • 查找并执行更便宜的寻路算法,该算法仅用于确定目标是否可达,如果是,则运行 aStar 以获取实际路径。

  • 收集指定半径内目标节点周围所有不可行走的节点,并查看它们是否都已链接。如果是,则目标是“无法到达”且无法到达。 不需要对 startnode 做等效的操作,因为 aStars 收集节点的方式本质上就是这样做的。

所以我在这里要问的是,是否有人有一些要点/想法我可以添加到我的列表中,或者指出我可以使用的更便宜的寻路算法的方向,以确保有一条路

【问题讨论】:

  • 您应该删除一些语言标签,只保留相关的标签。
  • “我的主要寻路是通过aStar算法的实现完成的。性能很棒......”它是用哪种语言编写的?
  • 我是用 c# 写的,然后出于好奇也用 c++ 写
  • 即使您找到了一种快速确定目标是否可到达的方法,但当目标可到达时,这对您的速度没有帮助,但只能通过难以置信的长(特别是: O(n)-length,其中 n 是顶点数)路径 - 例如,当源和目标位于长迷宫的两端时。
  • @j_random_hacker 是的,我知道。我相信使用双向是很棒的,因为它在大多数可达场景中根本不会影响执行时间,并且在许多不可达的情况下有积极的影响。

标签: algorithm 2d path-finding a-star


【解决方案1】:

First Idea,应该精炼!

由于您的启发式算法,A* 将大部分时间都花在目标周围, 因此在它周围创建了一个“访问过”的墙。

所以我认为您可以检查访问过的广场的继续“墙”, 如果您找到包含目标但不包含源的封闭、连续路径,则无需进一步搜索。

第二个想法,不完整,但可能会减少“丢失”时间,
使用双向 A*,源运行到目标,但同时目标找到它到源的方式。

查看https://qiao.github.io/PathFinding.js/visual/ 了解它的行为方式。

【讨论】:

  • 哦,我喜欢你的第二个想法!如果其中一个 astar 实例没有更多节点,我可以中止两个。我相信这将最坏情况的时间减半。为什么不完整?
  • 因为,在最坏的情况下,它根本没有帮助 :) 假设中间有一堵墙……你仍然会到处参观……
  • 我得到了第三个角度,用于绘制“障碍图”,并检查包含Dest XOR Src的闭合环
  • 从您的链接中,如果我不关心绝对最短路径,有什么反对使用双向最佳搜索优先而不是 astar?在我测试的场景中似乎要快很多
  • Best-FS 肯定是一个不错的方法,除了一些启发式方法具有误导性的地方,但在大多数情况下,它甚至会快一点。我写了 A* 来匹配问题。
猜你喜欢
  • 1970-01-01
  • 2021-12-27
  • 2013-06-12
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多