C ++寻路与a-star,优化

时间:2012-02-18 10:52:04

标签: c++ path-finding a-star

我想知道我是否可以稍微优化我的寻路代码,让我们看看这张地图:

+ - 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。

2 个答案:

答案 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具有分配给它的几乎相同数量的单元格。