【问题标题】:C++ pathfinding with a-star, optimization使用 a-star 进行 C++ 寻路,优化
【发布时间】:2012-02-18 10:52:04
【问题描述】:

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

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

我想在这种情况下完成(没有完成“房间”的入口)。我想检查一下,虽然没有一个开放节点越来越近,然后完成......但我不确定它是否可以,也许有更好的方法?

感谢任何回复。

【问题讨论】:

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


    【解决方案1】:

    首先,breadth-first search 可以更好地解决这个问题,但我假设您有充分的理由使用 a-star。但是我仍然建议您首先通过某种搜索(广度优先或深度优先搜索)检查 S 和 F 之间的连通性。这将解决我们的问题。

    【讨论】:

    • 所以你的意思是我必须检查S和F之间是否有任何道路,然后搜索最短的?
    • 事实上 BFS 无论如何都会找到最短的路。如果您选择 DFS,您将只检查是否有任何道路,是的。
    • 我没听说过 BFS 和 DFS,我选择 A*,因为我听说它在大地图上速度很快。使用 DFS 然后 A* 会更快,还是只使用 BFS?
    • 这个问题的最佳解决方案是使用BFS,它会尽可能快。
    • 嗯,这对我来说太难了。我才 15 岁……很难实现 A*,但我根本不懂 BFS 和 DFS。我想我会找到一种方法来检查 F 是否不在封闭的“房间”中。无论如何,非常感谢您的帮助。
    【解决方案2】:

    假设地图没有变化,您可以通过将其划分为connected components 对其进行预处理。可以通过快速disjoint set data structure 完成。然后在启动 A* 之前,您检查源和目标是否属于同一组件的恒定时间。如果不存在,则不存在路径,否则您运行 A* 来查找路径。

    缺点是每个单元需要额外的 n 位,其中 n = ceil(log C) 因为 C 是连接组件的数量。如果你有足够的内存并且负担得起,那没关系。

    编辑:如果您将 n 固定为小(例如一个字节)并且具有超过该数量的组件(例如 8 位 n 超过 256 个),那么您可以将相同的数字分配给多个组件。为了获得最佳结果,请确保每个组件 ID 分配给它的单元数几乎相同。

    【讨论】:

    • 但是为了计算连接的组件,您需要运行搜索(例如 BFS),一旦您运行 BFS,您就已经有了答案 - 我看不出您为什么要使用 A* .
    • @izomorphius:这是一个再处理步骤(对整个地图只进行一次)。
    • 啊,你的意思是多个查询。在这种情况下是的,这将加快速度。
    • O.o 我完全不明白。我只需要补充一点,地图会在游戏过程中发生变化......但是我可以合并拖曳单元集......
    • @ybungalobill 如何在某些内容发生更改时连接/扩展集合?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多