我一直在阅读维基百科的 Astararticle。在他们的实现中,他们检查每个节点是否在closed
设置,如果是这样,他们会跳过它。是不是有可能,如果启发式是可以接受的,但是NOT一致,我们可能需要重新访问一个节点两次(或更多次)才能改进它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
您的问题的答案位于链接页面上的伪代码下方,以及该页面的“描述”部分中。从伪代码下面的评论来看:
备注:上面的伪代码假设启发式函数是
单调(或一致,见下文),这是许多情况下的常见情况
实际问题,例如道路中的最短距离路径
网络。然而,如果假设不成立,则封闭区域中的节点
集合可以被重新发现并且它们的成本得到改善。换句话说,
闭集可以被省略(产生树搜索算法),如果
解决方案保证存在,或者如果算法经过调整,那么
仅当新节点具有较低的 f 时才会添加到开集
值高于任何先前迭代的值。
所以是的,伪代码确实假设启发式是一致的,如果不一致则必须进行修改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)