AStarSearch A*搜索

问题

n×mn \times m的二维方格图ss中从begbeg点移动到endend点。ss中存在一些黑色的方块阻隔移动。

解法

A*算法是一种启发式搜索(DFS和BFS属于无差别搜索),通过函数f(x)f(x)来评价节点xx的搜索代价(到目标的距离)。当存在多个待搜索节点时,总是优先搜索那些离目标更最近的点来提高搜索效率。

对于节点xx,函数f(x)=g(x)+h(x)f(x) = g(x) + h(x),其中f(x)f(x)表示xx点到endend的估算/评价距离,g(x)g(x)表示从begbeg节点到xx节点需要移动的最短距离,h(x)h(x)表示从xx点到endend节点的估算距离。

设置openopen表和closeclose表,其中openopen表类似BFS中的队列,存放待搜索的节点oocloseclose表存放所有已搜索过的节点cc,并存储从begbeg到达cc的最短距离g(c)g(c)

初始时将begbeg推入openopencloseclose中,且close[beg]=0close[beg] = 0,表示begbeg到达自己的最短距离为11。注意本算法中不会使用染色来标记某个节点是否已经被访问,而是用closeclose表来记录。

每次从openopen取出节点xx,该节点满足f(x)f(x)openopen中是最小的(若存在多个相同的最小f(x)f(x)则随意选取其中一个即可),若x=endx = end则搜索结束;否则考虑将xx四周的节点yy加入openopen表中,且显然因为多走了一步有g(y)=g(x)+1=close[x]+1g(y) = g(x) + 1 = close[x] + 1。注意,若closeclose中已经存在yy节点,说明在此之前yy已经被搜索过,这时比较旧的gold(y)g_{old} (y)与当前新的gnew(y)g_{new} (y),显然为了搜索最短路径,若gold(y)>gnew(y)g_{old} (y) > g_{new} (y)则用新路径替换旧路径,否则忽略节点yy不将其加入openopen表。

open=open = \varnothing为空时,说明begbeg永远无法到达endend

本问题中该算法的时间复杂度为O(n×m)O(n \times m)

八数码问题

源码

AStarSearch.h

AStarSearch.cpp

测试

AStarSearchTest.cpp

Last updated