A *算法重新打开顶点

时间:2011-12-26 19:10:51

标签: algorithm search language-agnostic graph

考虑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),但 是正确的 ,以防我们有重新打开它们(例如,如果启发式函数不是单调的)?

1 个答案:

答案 0 :(得分:3)

这是对的。如果找到目标节点,那么你将永远不必重新打开任何东西;你可以返回路径。通过A *算法的属性(包括允许的启发式算法),当您第一次将目标节点从优先级队列中弹出时,您将拥有最短的路径。