我一直在阅读维基百科的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
答案 0 :(得分:7)
您的问题的答案位于链接页面上的伪代码下方,也位于该页面的“说明”部分中。从psuedo代码下面的注释:
备注:上面的伪代码假定启发式函数是 单调(或一致,见下文),这是许多人的常见情况 实际问题,例如道路中的最短距离路径 网络。但是,如果假设不正确,则关闭节点 可以重新发现集合并提高其成本。换句话说, 如果a,可以省略闭集(产生树搜索算法) 保证解决方案存在,或者如果算法适应 只有新节点的f值较低时,才会将新节点添加到开放集中 价值比之前的任何迭代都要多。
所以是的,伪代码确实假设启发式是一致的,如果不是则必须进行修改。