赞
踩
编者按:本文作者奇舞团前端开发工程师魏川凯。
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)
f(n)=g(n)+h(n)
其中:
n n n:任意一个顶点
g ( n ) g(n) g(n):表示起点到任意顶点 n n n的实际成本
h ( n ) h(n) h(n):是一种启发式函数,表示从任意顶点 n n n到目标点的估算成本
在算法的每次迭代中,会从一个优先队列中取出 f ( n ) f(n) f(n)值最小(估算成本最低)的节点作为下次待遍历的节点。这个优先队列通常称为open set。然后相应地更新其领域节点的 f ( n ) f(n) f(n)和 g ( n ) g(n) g(n)值,并将这些领域节点添加到优先队列中。最后把遍历过的节点放到一个集合中,称为close set。直到目标节点的 f ( n ) f(n) f(n)值小于队列中的任何节点的 f ( n ) f(n) f(n)值为止(或者说直到队列为空为止)。因为目标点的启发式函数 h ( n ) h(n) h(n)值为0,所以说目标点的 f ( n ) f(n) 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) } // h(n)值
const fScore = { [start]: hScore[start] } // f(n)值
const cameFrom = {} // 记录当前节点的上一个节点
while(!openSet.isEmpty()) {
const current = openSet.pollFirst()
if(current === goal)
return
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。