|
|
1
2
这里发生了很多事情。 据我所知,这段代码总是返回到达队列顶部的第一个目标节点。在下面关于f和next的假设下,这个目标节点是f-最优的。但我不会把这个叫做艾达。 首先,通常A*和IDA*会同时打开当前节点的所有邻居。这个代码…没有。它使用迭代器,但只有一个循环。第一次推送用于当前节点的下一个同级节点,第二次推送用于子节点。这很好,我想,除了兄弟姐妹应该以递增的f阶来枚举,这样有希望的兄弟姐妹就不会在没有希望的兄弟姐妹之后被隐藏。 其次,与A*不同,IDA*没有一个封闭列表。从某种意义上说,艾达总是在寻找 树 ,因为如果它到达两个等价的节点,它仍然将它们视为不同的节点。A*确实有一个非常接近的列表,但它比这里的要复杂。A*处理循环的方式是,如果它发现到已经关闭的节点的更便宜的路径,那么它将重新打开该节点。这段代码没有,所以它只有在不需要重新打开节点时才是正确的。因此,这段代码需要f是所谓的一致启发式(在每一条路径上,f永远不会随着路径而下降),而a*只需要f是可容许的(f永远不会低估达到目标状态的成本)。 |