【问题标题】:How to optimize A* (AStar) Search for Concave Shapes? (includes screenshots)如何优化 A* (AStar) 搜索凹形? (包括截图)
【发布时间】:2013-02-08 05:08:43
【问题描述】:

我正在编写一个相当简单的自上而下的 2D 游戏。它对所有碰撞数据使用均匀分布的 2D 瓦片网格。网格中的每个图块要么是实心的,要么是空的。

对于寻路,我使用 A*(A 星),并尝试了曼哈顿和对角线(又名切比雪夫距离)启发式算法。

它在大多数情况下效果很好,但在尝试找到位于凹形(例如 U 形)凹槽中的目标时变得相当昂贵。

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

现在这是路径搜索的结果(在本例中为 A* 与曼哈顿启发式):

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

如您所见,搜索相当详尽,访问了许多图块,创建了一个几乎完美的圆圈。

我了解为什么这是基于 A* 算法和我选择的启发式方法(当您沿着墙移动通过目标时,更远的瓷砖开始具有更好的 F 值,导致在回到正确的道路之前要探索它们)。我不知道如何让它变得更好:)

对可能的改进有什么建议吗?可能是不同的启发式方法?也许一起使用不同的路径搜索算法?

谢谢!


根据一些建议,我倾向于更新我的 A* 实现,以包括在 HPA* 中发现的改进。根据一些初步的阅读,它似乎可以很好地解决上述情况,给定层次结构中的适当粒度。我会在完成调查后更新。

【问题讨论】:

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


【解决方案1】:

你需要break ties towards the endpoint


(不中断与端点的联系)


(与端点断绝关系)


(有障碍物的例子)

【讨论】:

  • 插图非常好用!
  • 感谢您提供的信息,但不幸的是,我认为这不是我想要的。在凹形的情况下,问题不在于有很多具有相同 H 值的图块,而是正确的路径要求您穿过看似更糟的图块,然后再返回到末端。您必须离得更远,然后才能再次开始靠近(类似于我看到的问题的“有障碍物示例”)。
  • @Goose 我不明白,那是什么问题。此答案中描述的方法使寻路速度更快。在您的情况下,到达目标的最佳路径总是会在某个点使距离增量为正。
  • @Goose:这正是您的问题的解决方案 - 在您上面的示例中,它应该将检查的瓷砖数量减少一半左右。我不相信有任何更有效的方法可以做到这一点,而不会失去最优性保证。如果它仍然太慢,您可能过于频繁地运行探路者 - 对于 99% 的游戏,您不需要每帧都运行它,每秒一次或两次就足够了。 (续)
  • (续)此外,如果您在多个单元上运行此算法,则在它们之间共享寻路信息通常可以大大加快速度。最后,如果这仍然太慢,您可能需要研究一种近似算法,例如HPA*A*-Epsilon(又名Anytime A*)。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2015-01-08
    • 2015-01-21
    • 2018-11-07
    相关资源
    最近更新 更多