问题是,如果最近的节点无法从前一个最近的节点到达会发生什么?
此步骤不是必需的。如你所说的,你不是在计算从前一个最接近到最接近的路径,而是试图到达你的目标节点,并且当前最接近的是唯一重要的事情(例如,该算法不关心最后一次迭代你距离100公里,因为这次迭代只有96公里)。作为一个广泛的介绍,A *并不直接构造一条路径:它探索直到它明确知道路径包含在它探索的区域内,然后根据探索过程中记录的信息构建路径。
(我将使用the code in the Wikipedia article作为一个参考实现,以帮助我的解释。)
你有两套节点:closedset
和openset
closedset
认为已经充分评估节点,也就是说,你知道他们距离start
有多远,并且他们所有的邻居都在两组中。这样就没有更多的计算可以用它们做,所以我们可以(忽略)忽略它们。 (基本上这些边界内完全包含。)
openset
举办的“边界”的节点,你知道有多远这些都是start
,但是你有没有触动他们的邻居呢,所以他们对搜索的边缘至今。
(含蓄的,还有第三组:完全不变节点,但你真的不碰他们,直到他们在openset
所以他们并不重要。)
在一个给定的迭代,如果你”已经有了探索节点(也就是openset
中的节点),您需要确定要探索哪一个节点。这是启发式的工作,它通过告诉你哪个节点它认为将具有到goal
的最短路径,从而基本上给出了关于边界上的哪一点将是最佳探索的暗示。
上一个最接近的节点是不相关的,它只是扩大了边界,增加了新的节点到openset
。这些新节点现在成为本次迭代中最近节点的候选节点。
起初,openset
只包含start
,但你迭代,并在每一步的边界扩展一点(在最有前途的方向),直到最终达到goal
。
当A *实际进行探索时,它并不担心哪个节点来自哪里。它不需要,因为它知道它们与start
和启发式函数的距离,这就是它所需要的。
但是为了稍后重建路径,您需要有一些路径记录,这就是camefrom
。对于给定节点,camefrom
将其链接到最靠近start
的节点,因此您可以通过从goal
反向链接来重建最短路径。
如何实际上将“图形”作为函数参数?
通过representations of a graph之一。
我真的不知道A *如何适用于TSP。我的意思是,找到从A到B的路线,当然,我明白了。但是TSP?我没有看到连接。
你需要一个不同的启发式和不同的终止条件:goal
不再是单个节点的任何更多,但具有一切连接的状态;你的启发式就是连接其余节点的最短路径长度的一些估计值。
[A *](http://en.wikipedia.org/wiki/A*_search_algorithm)似乎是b从CS课程中我能记得的一个非常好的总结。 [Dijkstra算法](http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm)非常相似(但更简单),因此它可能更好。在这两种情况下,优先队列都很方便。 – 2010-12-15 18:30:53
@pst:如果你想从点A到点B,A *和Dijkstra的算法是有用的。如果你想从具有特定约束的路径从点A到点A,那么这是另一回事。 – 2010-12-15 18:56:45
当我在Uni时(在上一个千年期间),我们有一项任务是要以我们想要的任何语言实现A *,大多数选择了我们最熟悉的C++,但是我选择了Prolog,因为它似乎更适合问题。短小的故事,我完成任务比大多数人快得多,你可以从Prolog开始,跳过中间阶段。 – Motti 2010-12-15 19:54:08