我想对以下 A* 搜索示例进行澄清:
用红色椭圆突出显示的部分是我不明白的区域;似乎{S,B} f=2+6=8
已从Expand S
(以上)中获取/移动/复制并用于Expand A
. 似乎也{S,A,X} f=(1+4)+5=10
已从Expand A
.Expand B
有人可以解释为什么会这样吗?我能够很好地阅读图表并且在解释它时没有任何问题 - 这只是我不知道为什么上述路径/路线在其他地方重复的事实。
谢谢你。
这是获取当前最佳项目,将其删除,然后用扩展替换它(将新项目插入列表中的适当位置)。可以这样想:
展开 S:
{S,A} f = 1+5 = 6
{S,B} f = 2+6 = 8
展开 A:
{S,A} f = 1+5 = 6
{S,B} f = 2+6 = 8
{S,A,X} f = (1+4)+5 = 10
{S,A,Y} f = (1+7)+8 = 16
展开 B:
{S,B} f = 2+6 = 8
{S,A,X} f = (1+4)+5 = 10
{S,B,C} f = (2+7)+4 = 13
{S,A,Y} f = (1+7)+8 = 16
{S,B,D} f = (2+1)+15 = 18
路径不会重复,它们只是保留为算法尚未探索的路径。A* 通过维护一个开放集来工作,它是算法已经知道如何到达(以及以什么成本)的节点集合,但它还没有尝试扩展它们。
在每次迭代中,算法从开放集中选择一个节点进行扩展(具有最低 f 函数的那个 - f 函数是算法已经知道到达节点 (g) 所需的成本与算法的估计从节点到目标的成本(h,启发式)。
http://en.wikipedia.org/wiki/A*_search_algorithm
看看那里的伪代码,你可以看到使用了开放集。所以底线 - 算法不是通过将路径或节点从一个迭代复制到另一个迭代来工作 - 它只是在同一个节点集合上工作(当然节点确实会从集合中添加和删除)。
希望这可以帮助...