Algorithm 最有效路径的星型算法

Algorithm 最有效路径的星型算法,algorithm,Algorithm,我试着用对角线和两点间直线距离的启发式编写一个星形算法。然而,在这种情况下,路径并不是最短的 走(2,2)->(3,2)->(4,2)->(5,2)会更快,但它选择了切割 我想不出我的理解有什么问题,因为当我想出来的时候,它实际上是这样工作的 我的理解是: 从(1,1)开始发现(2,2)是最好的 发现(3,3)是最好的,发现(4,3)是最好的,因为你不能走捷径 发现(5,3)为最佳,但将(5,2)的f值计算为X 无法转到(6,2)并将f(5,2)计算为Y>X,因此路径回溯到(4,3) 由于(5

我试着用对角线和两点间直线距离的启发式编写一个星形算法。然而,在这种情况下,路径并不是最短的

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

我想不出我的理解有什么问题,因为当我想出来的时候,它实际上是这样工作的

我的理解是:

  • 从(1,1)开始发现(2,2)是最好的
  • 发现(3,3)是最好的,发现(4,3)是最好的,因为你不能走捷径
  • 发现(5,3)为最佳,但将(5,2)的f值计算为X
  • 无法转到(6,2)并将f(5,2)计算为Y>X,因此路径回溯到(4,3)
  • 由于(5,3)已不在公开组中,请选择次优(5,2)
  • 剩下的路是好的,并没有回溯,因为并没有遇到“死胡同”
  • 它应该意识到的是f(5,2)比(4,2)低,而(4,2)比(3,2)低,因为它选择了(3,3),所以(3,2)从来没有计算过

    这到底是怎么回事


    编辑:水平/垂直方向的阶跃成本为1,对角线方向的阶跃成本为sqrt(2)

    多亏了Henry在评论中的解释,因为(4,3)->(5,2)的f值高于(2,2)->(3,2),所以它应该下降(3,2)


    也就是说,下一个要计算的节点是从已排序的开放节点列表中选择的,而不是一组在输入时已排序的值的节点列表(不是添加了已排序列表的堆栈)

    由于Henry在注释中的作用,由于(4,3)->(5,2)的f值高于(2,2)->(3,2),因此推理是无效的,所以它应该下降(3,2)


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

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