如何优化A *(AStar)搜索凹形? (包括截图)

时间:2013-02-08 05:08:43

标签: xna hierarchical-data path-finding a-star pathfinder

我正在写一个相当简单的自上而下的2D游戏。它为所有碰撞数据使用均匀间隔的2D网格图块。网格中的每个图块都是实心或空的。

对于路径寻找我使用的是A *(A Star),并尝试了曼哈顿和对角线(又名Chebyshev距离)启发式算法。

在大多数情况下效果很好,但是当试图找到坐在凹形凹陷(例如U形)中的目标时会变得相当昂贵。

例如,在下面的图片中,右边的人会找到左边的那个人。所有的草(绿色,深绿色和黄色)都是空的空间。唯一的实心瓷砖是棕色的“木”瓷砖和灰色的“石材”瓷砖,形状为侧面“U”。

Unsolved example

现在这里是路径搜索的结果(在本例中是A * with Manhattan Heuristics):

Solved example

红色和绿色调试绘制正方形显示在A *搜索期间访问了哪些图块。红色位于“已关闭”列表中,绿色位于“打开”列表中(根据A *规范)。选择最终路径中的蓝线(这是正确的)。

正如你所看到的,搜索相当详尽,访问了很多瓷砖,创造了一个几乎完美的圆圈。

我理解为什么这是基于A *算法发生的,以及我选择的启发式方法(当你沿着墙壁移动目标时,更远的瓷砖开始有更好的F值,导致在回到正确的路径之前要对它们进行探索)。我不知道的是如何做得更好:)

有关可能改进的建议吗?可能是一个不同的启发式?也许一条不同的路径搜索算法在一起?

谢谢!


根据一些建议,我倾向于更新我的A *实施,以包含HPA*中的改进。基于一些初步阅读,考虑到层次结构中的适当粒度,它似乎将很好地解决上述情况。一旦我查看完毕,我就会更新。

2 个答案:

答案 0 :(得分:4)

您需要break ties towards the endpoint

Without breaking ties towards endpoint
(不破坏与端点的联系)

With breaking ties towards endpoint
(与端点断开关系)

Example with an obstacle
(有障碍物的例子)

答案 1 :(得分:1)

我最终使用了Dynamic HPA *。我在这里写了解决方案的详细信息:

http://www.matthughson.com/2013/03/05/dynamic-hpa-part-1/