考虑A* search algorithm
的以下伪代码:
A*(G, s, h)
for each vertex u in V
d[u] := f[u] := infinity
color[u] := WHITE
p[u] := u
end for
color[s] := GRAY
d[s] := 0
f[s] := h(s)
INSERT(Q, s)
while (Q != Ø)
u := EXTRACT-MIN(Q)
for each vertex v in Adj[u]
if (w(u,v) + d[u] < d[v])
d[v] := w(u,v) + d[u]
f[v] := d[v] + h(v)
p[v] := u
if (color[v] = WHITE)
color[v] := GRAY
INSERT(Q, v)
else if (color[v] = BLACK)
color[v] := GRAY
INSERT(Q, v)
end if
else
...
end for
color[u] := BLACK
end while
现在 - 我是否正确理解如果我们想要找到从源顶点(s
)到某个目标顶点的路径(我们将其命名为d
)然后我们可以在u := EXTRACT-MIN(Q)
语句之后直接添加一个检查,如下所示:
u := EXTRACT-MIN(Q)
if (u = d) RETURN PATH
这显然是正确的,以防我们不需要重新打开顶点(else if (color[v] = BLACK
),但 是正确的 ,以防我们有重新打开它们(例如,如果启发式函数不是单调的)?
答案 0 :(得分:3)
这是对的。如果找到目标节点,那么你将永远不必重新打开任何东西;你可以返回路径。通过A *算法的属性(包括允许的启发式算法),当您第一次将目标节点从优先级队列中弹出时,您将拥有最短的路径。