【发布时间】:2021-05-16 14:11:40
【问题描述】:
我最近在学习图搜索和树搜索,看到很多例子提到“xxx图搜索返回的路径是......” 但是,图搜索是一种遍历方法,它如何返回路径?
我们知道在树搜索中,每个节点对应一个特定的路径,通过访问一个节点,我们知道对应的路径。我对树搜索足够熟悉,但是,在图形搜索中,目的是访问目的地,而不是找到通往目的地的路径。那么,如何定义图搜索返回的路径呢?
例如,下面是一个图表。
Graph
B
/ \
/ \
Start Destination
\ /
\ /
C
当我们在开始时做 BFS 时,访问顺序是 Start-B-C-Destination 或 Start-C-B-Destination。那么,返回的路径应该是什么?如果我们使用队列,我们可以说我们在访问B(或C)时加入了Destination,所以返回的路径是Start-B-Destination(或Start-C-Destination),那么下图呢?
Graph
B
/ \
/ \
Start-----D-----Destination
\ /
\ /
C
很明显,D 在访问Start 时被排队,所以唯一可能的路径应该是Start-D-Destination?
A* 搜索存在更多问题。如果不是从最短路径访问节点(由于启发式函数不佳),那么最终返回的路径应该是什么?比如下图中,访问顺序是Start-B-D-C-Destination,那么返回的路径应该是什么? Start-B-D-Destination 还是 Start-C-D-Destination?当B 在边缘时,我们访问了D,但是,当我们计算从Start 到D 的成本时,我们正在计算Start-C-D,成本应该是2 而不是3。
Graph
B
/ \
1 2
/ \
Start D--5--Destination
\ /
1 1
\ /
C
h(B) = 2, h(C) = 4, h(D) = 1
我认为所有这些问题都是由于图搜索的目的不是找到路径,而图搜索会导致在选择最终路径中应该包含哪个节点时出现歧义。
感谢您的耐心等待,如果有人能给我答案,我将不胜感激。
【问题讨论】:
-
建议:阅读 Dijsktra 的算法en.wikipedia.org/wiki/Dijkstra%27s_algorithm
-
Dijkstra 的算法,作为一种图搜索算法,可以返回一条路径,因为我们知道如何获得到特定节点的最短路径。路径中 A 的前一个节点是更新 A 距离的节点。在像 BFS 这样的情况下,没有这种关系。
标签: search graph path breadth-first-search a-star