【问题标题】:A Star Algorithm most efficient pathA Star 算法最有效的路径
【发布时间】:2017-02-02 05:34:37
【问题描述】:

我尝试编写具有对角线和两点之间直线距离启发式的星型算法。但是,在这样的特定情况下,路径并不是最短的

走 (2,2) -> (3,2) -> (4,2) -> (5,2) 会更快,但它选择了切入。

我无法弄清楚我的理解有什么问题,因为当我想出来时,它实际上是这样工作的。

我的理解:

  1. 从 (1,1) 开始发现 (2,2) 最好
  2. 发现 (3,3) 最好,发现 (4,3) 最好,因为你不能偷工减料
  3. 发现 (5,3) 最好,但将 (5,2) 的 f 值计算为 X
  4. 无法转到 (6,2) 并将 f(5,2) 计算为 Y > X,因此路径回溯到 (4,3)
  5. 由于 (5,3) 不再在开放集中,因此选择次佳 (5,2)
  6. 路径的其余部分都很好,没有任何回溯,因为没有遇到“死胡同”。

它应该意识到的是 f(5,2) 低于 (4,2) 低于 (3,2),因为它选择了 (3,3),所以永远不会计算出来

p>

这到底有什么问题?

编辑:水平/垂直的步长为 1,对角线的步长为 sqrt(2)

【问题讨论】:

  • 从 (2,2) 到 (3,3) 的实际成本是多少?是 1 还是 sqrt(2)?
  • sqrt(2)。启发式方法是 sqrt(4^2 + 2^2)
  • 在这种情况下,您的实现中存在错误。
  • 对不起?我列出的步骤是无论代码如何都会在我脑海中发生的事情,所以......你能告诉我我的推理中哪一步是错误的吗?
  • A*,如果正确完成,会找到最短路径。您显示的路径不是最短的。在您的示例推理中,您没有显示开放集中的所有节点,因此很难判断哪里出了问题。

标签: algorithm


【解决方案1】:

感谢 cmets 中的 Henry,推理是错误的,因为 (4,3) -> (5,2) 的 f 值会高于 (2,2) -> (3,2),所以它应该而是往下走 (3,2)

I.E.下一个要评估的节点是从已排序的开放节点列表中选择的,而不是在输入时排序的值组的节点列表(不是添加了排序列表的堆栈)

【讨论】:

    猜你喜欢
    • 2012-02-06
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    相关资源
    最近更新 更多