Algorithm *搜索可以在未加权图中简化吗?

Algorithm *搜索可以在未加权图中简化吗?,algorithm,search,graph,a-star,Algorithm,Search,Graph,A Star,这是一个几乎是*搜索的算法。基本上,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.

这是一个几乎是*搜索的算法。基本上,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

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

如果它使用*优先级,它怎么能不首先找到最短路径?那么如何计算一个未加权图的g或h呢?如果启发式函数低估了(它通常会这样做),A*可以首先找到一条更长的路径。这里有一个很好的例子:未加权图中的路径成本g就是路径长度。启发式函数h可以变化;例如,假设图形表示一个迷宫-因此每个顶点都是网格上的一个开放单元-h可以是曼哈顿距离。如果
h
是使用曼哈顿距离计算的,则节点之间的距离就是权重。实际上,完整的a*包含更多。它考虑更新队列中顶点的优先级。谢谢,这是一个很好的例子。我能问你一个后续问题吗?我看到的上下文是一个表示迷宫的图形,使用曼哈顿距离作为启发式函数。用一个不那么武断的启发式方法,你认为还有一个例子吗?@LisaTorrey计算路径的实际长度(
g
)使用的距离是多少?它也是欧几里德还是曼哈顿?曼哈顿也是,所以它反映了所采取的步骤数。@Lisatorley在这种情况下,启发式函数是一致的(即h(x))因此,如果你是对的,那么这个算法可以用于迷宫搜索,也可能用于一系列其他问题。但这里有一个微妙之处——我看到了一个证明,如果启发式是一致的,那么当a*展开一个顶点时,它的最短路径就被找到了。但我不能绝对肯定a*发现一个顶点时这是真的。