【问题标题】:Calculating f_score[neighbor] for A* search为 A* 搜索计算 f_score[neighbor]
【发布时间】:2026-02-07 08:10:01
【问题描述】:

我正在查看* (wikipedia:A*_search_algorithm) 上的 A 星伪代码,我对这段代码的 sn-p 有疑问:

for each neighbor in neighbor_nodes(current)
    tentative_g_score := g_score[current] + dist_between(current,neighbor)
    tentative_f_score := tentative_g_score + heuristic_cost_estimate(neighbor, goal)
    if neighbor in closedset and tentative_f_score >= f_score[neighbor]
        continue

在 if 语句的第二部分 - tentative_f_score >= f_score[neighbor] - 我想知道计算 f_score[neighbor] 与计算 tentative_f_score 有何不同。

基本上,我将如何计算f_score[neighbor]?谢谢。

【问题讨论】:

    标签: java algorithm search


    【解决方案1】:

    f_score[neighbor] 是您为所有节点存储的内容。这个邻居是一个你已经有 F 分数的节点,因为它已经在封闭集中。新的 F 分数可能会有所不同,因为您没有以与之前到达该节点相同的方式到达该节点,因此父节点将不同于您已经为该节点存储的内容(因此也可能G,因此是 F)。

    基本上,那里的条件说明如果 不是 情况会发生什么(或者如果新的 F 更糟),那么您可以忽略该节点。

    它下面的代码处理找到到该节点的新路径比您之前到达它的路径短的情况,因此它将当前节点设置为其父节点并更新其 G(因此 F)。

    【讨论】:

    • 感谢您的解释。我做了一些研究,发现 f(v) = g(v) + h(v),其中 v 是图中的某个顶点。所以 f(neighbor) = g(neighbor) + h(neighbor) 其中 g(neighbor) = tentative_g_score + 从节点“邻居”到其后继节点的成本?
    • @user1923 暂定分数是与“尝试到该节点的新路径”相关的分数,如果发现邻居的 G 可能成为暂定 G比那个邻居的旧 G 更好(注意,搬到它的成本已经包括在内,这就是 + dist_between(current,neighbor) 所做的)。
    • 澄清一下,你是说我上面的公式是正确的吗?我看到 g[neighbors] 定义为从起始节点一直到“邻居”节点的成本 + 从“邻居”节点到后继节点的边缘距离 +“邻居”节点到目标的启发式。
    • @user1923 G 只是从开始到节点的成本。 H 是从节点到目标的预期成本。 F 由f(v) = g(v) + h(v) 定义。邻居的 G 是先前找到的到该邻居的最佳路径的成本,在此代码中与到达该节点的新方式(即首先到当前节点,然后立即到该邻居)进行比较.如果你问的是g(neighbor) = tentative_g_score + something,那真的没有意义。
    • 哦,好吧,我明白了。感谢您的帮助!