我想知道我是否可以稍微优化我的寻路代码,让我们看看这张地图:
+ - wall, . - free, S - start, F - finish
.S.............
...............
..........+++..
..........+F+..
..........+++..
...............
人类会看着它并说它是不可能的,因为完成被包围......但是A-star必须检查所有的领域以确定,没有可能的道路。嗯,小地图不是问题。但是当我有256x265地图时,需要花很多时间来检查所有点。我认为我可以停止搜索,而结尾处有封闭的节点,我的意思是:
+ - wall, . - free, S - start, F - finish, X - closed node
.S.............
.........XXXXX.
.........X+++X.
.........X+F+X.
.........X+++X.
.........XXXXX.
我想在这种情况下完成(完成后没有“房间”的入口)。我想检查一下,虽然没有一个开放的节点越来越近,然后完成...但我不确定它是否可以,也许有更好的方法?
任何回复的Thanx。
答案 0 :(得分:2)
首先使用breadth-first search可以更好地解决这个问题,但我认为你有充分的理由使用a-star代替。但是我仍然建议您首先使用某种搜索(广度优先或深度优先搜索)检查S和F之间的连接。这将解决我们的问题。
答案 1 :(得分:2)
假设地图没有变化,您可以将其划分为connected components进行预处理。可以使用快速disjoint set data structure来完成。然后在启动A *之前,检查源和目标属于同一组件的常量时间。如果不是 - 不存在路径,则除了运行A *以找到路径之外。
缺点是每个单元需要额外的n位,其中n = ceil(log C),C是连接组件的数量。如果你有足够的记忆力并且可以负担得起,那就没关系。
编辑:如果您将n固定为小(例如一个字节)并且具有超过该组件数(例如,对于8位n超过256),则可以将相同的编号分配给多个组件。为了获得最佳结果,请确保每个component-id具有分配给它的几乎相同数量的单元格。