我正在写一个相当简单的自上而下的2D游戏。它为所有碰撞数据使用均匀间隔的2D网格图块。网格中的每个图块都是实心或空的。
对于路径寻找我使用的是A *(A Star),并尝试了曼哈顿和对角线(又名Chebyshev距离)启发式算法。
在大多数情况下效果很好,但是当试图找到坐在凹形凹陷(例如U形)中的目标时会变得相当昂贵。
例如,在下面的图片中,右边的人会找到左边的那个人。所有的草(绿色,深绿色和黄色)都是空的空间。唯一的实心瓷砖是棕色的“木”瓷砖和灰色的“石材”瓷砖,形状为侧面“U”。
现在这里是路径搜索的结果(在本例中是A * with Manhattan Heuristics):
红色和绿色调试绘制正方形显示在A *搜索期间访问了哪些图块。红色位于“已关闭”列表中,绿色位于“打开”列表中(根据A *规范)。选择最终路径中的蓝线(这是正确的)。
正如你所看到的,搜索相当详尽,访问了很多瓷砖,创造了一个几乎完美的圆圈。
我理解为什么这是基于A *算法发生的,以及我选择的启发式方法(当你沿着墙壁移动目标时,更远的瓷砖开始有更好的F值,导致在回到正确的路径之前要对它们进行探索)。我不知道的是如何做得更好:)
有关可能改进的建议吗?可能是一个不同的启发式?也许一条不同的路径搜索算法在一起?
谢谢!
根据一些建议,我倾向于更新我的A *实施,以包含HPA*中的改进。基于一些初步阅读,考虑到层次结构中的适当粒度,它似乎将很好地解决上述情况。一旦我查看完毕,我就会更新。
答案 0 :(得分:4)
答案 1 :(得分:1)
我最终使用了Dynamic HPA *。我在这里写了解决方案的详细信息: