问题是,如果不能从前一个最近的节点到达最近的节点会发生什么?
这一步不是必须的。例如,您不是在计算从上一个最近到当前最近的路径,而是在尝试到达目标节点,而当前最接近的是唯一重要的事情(例如,算法不关心最后一次迭代你在 100 公里之外,因为这次迭代你只有 96 公里)。
概括地说,A* 并不直接构建路径:它会进行探索,直到明确知道路径包含在它所探索的区域内,然后根据探索过程中记录的信息构建路径。
(我将使用维基百科文章中的代码作为参考实现来帮助我解释。)
您有两组节点:closedset
和openset
closedset
保存已完全评估的节点,也就是说,您确切地知道它们与它们的距离start
以及它们的所有邻居都在两组之一中。这没有更多的计算你可以用它们做,所以我们可以(有点)忽略它们。(基本上这些都完全包含在边界内。)
openset
拥有“边界”节点,您知道它们的距离有多远start
,但您还没有触及它们的邻居,所以到目前为止它们处于您搜索的边缘。
(隐含地,还有第三组:完全未触及的节点。但在它们进入之前你不会真正触及它们,openset
所以它们无关紧要。)
在给定的迭代中,如果您有要探索的节点(即 中的节点openset
),您需要确定要探索的节点。这是启发式的工作,它基本上通过告诉您它认为哪个节点将具有最短路径来提示您下一步将最好探索边界上的哪个点goal
。
上一个最近的节点无关紧要,它只是稍微扩大了边界,将新节点添加到openset
. 这些新节点现在是本次迭代中最近节点的候选者。
起初,openset
只包含start
,但随后您进行迭代,并且在每一步中,边界都会扩大一点(在最有希望的方向上),直到最终到达goal
.
当 A* 实际进行探索时,它并不担心哪些节点来自哪里。它不需要,因为它知道它们的距离start
和启发式函数,这就是它所需要的。
但是以后要重建路径,您需要对路径进行一些记录,这camefrom
就是。对于给定节点,camefrom
将其链接到最接近 的节点start
,因此您可以通过从 向后跟踪链接来重建最短路径goal
。
一个人实际上如何将“图形”作为函数参数?
通过传递一个图的表示。
我真的不明白 A* 如何适用于 TSP。我的意思是,找到从 A 到 B 的路线,当然,我明白了。但是TSP?我没有看到联系。
您需要不同的启发式和不同的结束条件:goal
不再是单个节点,而是所有连接的状态;并且您的启发式是对连接其余节点的最短路径长度的一些估计。