Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm A*算法的正确公式_Algorithm_Artificial Intelligence_Path Finding_A Star_Dijkstra - Fatal编程技术网

Algorithm A*算法的正确公式

Algorithm A*算法的正确公式,algorithm,artificial-intelligence,path-finding,a-star,dijkstra,Algorithm,Artificial Intelligence,Path Finding,A Star,Dijkstra,我在看A*路径查找算法的定义,在不同的地方,它的定义似乎有所不同 不同之处在于在检查节点的后续节点时执行的操作,发现后续节点位于关闭列表中 一种方法(由和提出)说:如果继任者在封闭名单上,就忽略它 另一种方法(例如,建议和)说:如果继任者在封闭名单上,检查其成本。如果高于当前计算的分数,则从关闭列表中删除该项目,以备将来检查 我很困惑——哪种方法是正确的?直觉上,第一个对我来说更有意义,但我想知道定义上的区别。其中一个定义是错误的,还是它们在某种程度上是同构的?只有当到达任何重复状态的最佳路

我在看A*路径查找算法的定义,在不同的地方,它的定义似乎有所不同

不同之处在于在检查节点的后续节点时执行的操作,发现后续节点位于关闭列表中

  • 一种方法(由和提出)说:如果继任者在封闭名单上,就忽略它
  • 另一种方法(例如,建议和)说:如果继任者在封闭名单上,检查其成本。如果高于当前计算的分数,则从关闭列表中删除该项目,以备将来检查

我很困惑——哪种方法是正确的?直觉上,第一个对我来说更有意义,但我想知道定义上的区别。其中一个定义是错误的,还是它们在某种程度上是同构的?

只有当到达任何重复状态的最佳路径总是第一个被遵循时,第一种方法才是最优的。如果启发式函数具有一致性(也称为单一性)的属性,则此属性成立。如果对于每个节点
n
n
的每个后继节点
n'
,从
n
达到目标的估计成本不大于从
n
到达
n'
的步骤成本加上从
n
达到目标的估计成本,则启发式函数是一致的

第二种方法是最优的,如果启发式函数只是允许的,也就是说,它永远不会高估实现目标的成本

每个一致的启发式函数也是允许的。尽管一致性是比可接受性更严格的要求,但人们必须非常努力地炮制出可接受但不一致的启发式函数

因此,尽管第二种方法更为通用,因为它适用于严格较大的启发式函数子集,但第一种方法在实践中通常是足够的


参考:第4.1节“人工智能:现代方法”中的“A*搜索:最小化总估计解决方案成本”一节。

对不起,你能详细说明一下吗?我看不出与替换已关闭列表中的项目有任何关联。毕竟,返回到封闭列表仅对循环或负权重有意义。或者不是吗?联系在于,如果到某个状态的第一条路径最便宜,则不需要替换关闭列表中的状态。consistency属性保证此条件成立。请注意,如果封闭列表中的项目与通常情况一样只是节点,则即使没有循环,也可以返回到封闭列表:例如,如果一个节点可以通过多条路径访问。回答很好。我为这个问题挣扎了好几天。终于有道理了!