我目前正在使用A *寻路算法来计算无限网格上的路径(使用Gridworld中的UnboundedGrid,AP CS案例研究,如果这有助于任何人)。一切都运行得非常好,除了没有有效路径的情况,因为末端节点完全被墙包围。正如所料,该算法继续无限搜索,永远不会找到结束节点。
对此的一种可能解决方案是在整个寻路区域周围放置不可见(如用户看不到它们但算法没有看到),确保起始节点,结束节点和所有墙节点在这些墙内,有2-3个空间填充左右。类似的东西:
_________________________________
| |
| S | |
| _____| _____ |
| | E | |
| |___| |
|_______________________________|
......我们的想法是,最终所有节点都会被添加到封闭列表中,开放列表将变为空,此时我将知道不存在有效路径。
这似乎是解决问题的合理方法吗?有没有什么方法可能会出错?我知道另一个解决方案是同时从末尾开始向后寻找,但这看起来可能很昂贵,特别是在端节点没有紧密封闭的情况下。
答案 0 :(得分:2)
难道你不确切知道终端节点在哪里?如果这样做,只需在执行算法之前检查它是否被包围。
答案 1 :(得分:1)
另请参阅我对您的问题的评论。打字后我想出了一个很好的解决方案。这是针对您不了解终端节点并且无法对上述节点的位置执行任何操作的情况。
你也可以采取以下措辞:“我在我的领域找到一个封闭的盒子,在 x 时间之后没有路径,所以 y%可用性我可以说没有路径,并且更新 y%会随着时间的推移而增加,但永远不会达到100%。
可能是一个很好的解决方案,它正处于搜索区域的边界并且什么都不做。
答案 2 :(得分:0)
我有类似的问题,这就是我所做的:
如果任一运行确定一个或另一个处于完全隔离区域(不再有打开的节点),则搜索失败。否则搜索正常。
这里的诀窍当然是为 n 提供一个好的价值。我通过增加 n 进行了多次传递并缓存了结果(我的图表没有很多变化)。
答案 3 :(得分:0)
您正在使用A *,因此您应该能够以成本对地形节点进行加权。在墙壁节点上投入极高的成本。它必须大于任何可能路径的总成本。如果路径的最终成本大于边界成本,那么您必须通过墙来查找路径,因此它无效。 A *算法围绕高成本节点进行路由,因此除非必须,否则它不会穿过墙。