【问题标题】:Can A* search be simplified in an unweighted graph?可以在未加权的图中简化 A* 搜索吗?
【发布时间】:2015-03-19 00:57:30
【问题描述】:

这是一个几乎是 A* 搜索的算法。本质上,它是具有使用 A* 优先级的优先级队列的 BFS。

frontier <- empty priority queue
frontier.insert(start) with priority g(start)+h(start)
while frontier isn't empty
    vertex <- dequeue frontier
    for each undiscovered neighbor of vertex
        neighbor.discovered = true
        neighbor.parent = vertex
        frontier.insert(neighbor) with priority g(neighbor)+h(neighbor)
        if neighbor == goal, stop

该算法缺少 A* 中处理这一事实的部分:找到到顶点的第一条路径不一定是到该顶点的最短路径。

很容易提出缺失部分至关重要的示例……对于加权图。对于未加权的图表,我无法提出任何建议。

这种更简单的 A* 版本是否适用于未加权图?

【问题讨论】:

  • 如果使用A*优先级,怎么先找到最短路径?以及如何计算未加权图的 g 或 h?
  • A* 如果启发式函数低估(通常会这样做),则可以首先找到更长的路径。这里有一个很好的例子:link
  • 未加权图中的路径成本 g 就是路径长度。启发式函数 h 可以变化;例如,假设该图表示一个迷宫 - 所以每个顶点都是网格上的一个开放单元 - 而 h 可能是曼哈顿距离。
  • 如果h是使用曼哈顿距离计算的,那么节点之间的距离就是权重。
  • 完整的 A* 实际上还有更多。它考虑更新队列中顶点的优先级。

标签: algorithm search graph a-star


【解决方案1】:

不,对于任意的h 函数是不正确的。这是一个例子。假设我们有一个包含 7 个顶点和以下未加权边的图:{(1, 2), (2, 3), (3, 4), (4, 6), (2, 5), (5, 6), (6, 7)}。我们可以通过以下方式定义h{0, 0, 0, 0, 2, 1, 0}。起始顶点是1,目标是7. 很容易验证这个启发式函数是可接受的。然而,如果我们运行这个算法,我们将看到它首先找到的到6 顶点的路径是(1, 2, 3, 4, 6),因为f(4) = 3 + 0 &lt; 2 + 2 = f(5),而到它的实际最短路径是(1, 2, 5, 6)

【讨论】:

  • 谢谢,这是一个很好的例子。我可以问你一个后续吗?我一直在查看的上下文是一个表示迷宫的图表,使用曼哈顿距离作为启发式函数。使用不那么随意的启发式方法,您认为还有一个例子吗?
  • @LisaTorrey 用什么距离来计算路径的实际长度(g)?是欧几里得还是曼哈顿?
  • 曼哈顿也是,所以它反映了所采取的步骤数。
  • @LisaTorrey 在这种情况下,启发式函数是一致的(即 h(x)
  • 所以如果你是对的,那么这个算法可以用于迷宫搜索,也可能用于许多其他问题。但是这里有一个微妙之处——我已经看到一个证明,如果启发式是一致的,那么当 A* 扩展一个顶点时,它的最短路径就被找到了。但我不确定当 A* 发现 一个顶点时这是否正确。
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 2022-01-14
相关资源
最近更新 更多