编者按:本文作者奇舞团前端开发工程师魏川凯。
A*搜索算法(A-star search algorithm)是一种常见且应用广泛的图搜索和寻径算法。A*搜索算法是通过使用启发式函数来指导寻路,从而高效的保证找到一条最优路径。A*搜索算法最初的设计是用来解决最短路径问题。但是,从理论来说A*可以解决大多数的成本代数问题。
A*搜索算法于1968年,由斯坦福研究院的Peter Hart,Nils Nilsson以及Bertram Raphael首次发表。
原理
A*搜索算法综合了最佳优先搜索算法(Best-first search)和Dijkstra算法的优点,通过一个成本估算函数来指导路径的搜索过程:$$ f(n) = g(n) + h(n) $$ 其中:
$n$:任意一个顶点
$g(n)$:表示起点到任意顶点$n$的实际成本
$h(n)$:是一种启发式函数,表示从任意顶点$n$到目标点的估算成本
在算法的每次迭代中,会从一个优先队列中取出$f(n)$值最小(估算成本最低)的节点作为下次待遍历的节点。这个优先队列通常称为open set。然后相应地更新其领域节点的$f(n)$和$g(n)$值,并将这些领域节点添加到优先队列中。最后把遍历过的节点放到一个集合中,称为close set。直到目标节点的$f(n)$值小于队列中的任何节点的$f(n)$值为止(或者说直到队列为空为止)。因为目标点的启发式函数$h(n)$值为0,所以说目标点的$f(n)$值就是最优路径的实际成本。
下面为A*搜索算法的主流程代码:
// heuristicFunction,启发式函数
function aStar(start, goal, heuristicFunction) {
// 带估算的节点集合,为一个优先队列,每次取f(n)值最小的节点
const openSet = new PriorityQueue()
openSet.add(start) // 初始只有起点
const closeSet = [] // 已被估算过的节点集合
const gScore = { [start]: 0 } // g(n)值
const hScore = { [start]: heuristicFunction(start, goal)