Astar能不止一次访问节点?

时间:2014-01-29 20:14:05

标签: a-star

我一直在阅读维基百科的Astar article。在他们的实现中,他们检查每个节点是否在closed集合中,如果是,他们会跳过它。是不是可能,如果启发式是可以接受的但一致,我们可能需要重新访问一个节点两次(或更多)才能提高它的f值? 这是相关代码

for each neighbor in neighbor_nodes(current)
    if neighbor in closedset //This if condition bothers me
        continue
    tentative_g_score := g_score[current] + dist_between(current,neighbor)
    if neighbor not in openset or tentative_g_score < g_score[neighbor] 
        came_from[neighbor] := current 
        g_score[neighbor] := tentative_g_score
        f_score[neighbor] := g_score[neighbor] + heuristic_cost_estimate(neighbor, goal)
        if neighbor not in openset
            add neighbor to openset

1 个答案:

答案 0 :(得分:7)

您的问题的答案位于链接页面上的伪代码下方,也位于该页面的“说明”部分中。从psuedo代码下面的注释:

  

备注:上面的伪代码假定启发式函数是   单调(或一致,见下文),这是许多人的常见情况   实际问题,例如道路中的最短距离路径   网络。但是,如果假设不正确,则关闭节点   可以重新发现集合并提高其成本。换句话说,   如果a,可以省略闭集(产生树搜索算法)   保证解决方案存在,或者如果算法适应   只有新节点的f值较低时,才会将新节点添加到开放集中   价值比之前的任何迭代都要多。

所以是的,伪代码确实假设启发式是一致的,如果不是则必须进行修改。