1、简介算法
A*算法是启发式算法的一种,能够求出在图形平面上有着多个节点时,找到两个节点之间的最短路径,它的用到的地方仍是挺多的,如游戏中的NPC移动,其实A*算法和Dijkstra算法很像很像的(我的至关感受额,但也有一点点差别),若是你了解Dijkstra算法的话,那对于A*算法就很容易接受了。函数
2、算法主要内容性能
对于A*算法而言,须要设计一个估计函数,即f(n) = g(n) + h(n),其中g(n)表示搜索起点到当前节点的代价(一般用某节点在搜索树中的深度来表示的),h(n)表示当前节点到目标节点的估计值,对于A*算法的估计函数而言,其中h(n)的设计最为重要,也是衡量是否为A*算法的一个标准。设计
对于A*算法而言,须要知足一下几个条件才算得上A*算法:3d
1).图中存在从起点到目标终点的最有路径。blog
2).问题是有限的。排序
3).全部节点的子节点代价>0。游戏
4).h(n) =< h*(n) (其中h*(n)为实际问题的代价值)搜索
3、算法实现示意图遍历
求V0->V5的路径,在V0->V5过程当中,能够通过V一、V二、V三、V4到达目标及诶大V5
4、算法设计伪代码
将起点放入OPEN表;
while(OPEN!=NULL)
{
从OPEN表中取估价值f最小的节点n;
if(n节点==目标节点)
{
找到了目标
break;
}
for(当前节点n的每一个子节点X)
{
算X的估价值;
if(X in OPEN)
{
if( X的估价值小于OPEN表的估价值 )
{
把n设置为X的父亲;
更新OPEN表中的估价值; //取最小路径的估价值
}
}
if(X in CLOSE)
{
continue;
}
if(X not in both)
{
把n设置为X的父亲;
求X的估价值;
并将X插入OPEN表中; //尚未排序
}
}//end for
将n节点插入CLOSE表中;
按照估价值将OPEN表中的节点排序; //其实是比较OPEN表内节点f的大小,从最小路径的节点向下进行。
}//end while(OPEN!=NULL)
保存路径,即从终点开始,每一个节点沿着父节点移动直至起点,这就是你的路径
5、A*算法和Dijkstra算法比较
这两个算法很类似,但通常A*算法的性能比Dijkstra算法好稍稍好一些,A*算法的时间复杂度为nlog(n),而Dijkstra算法为o(n2),这是由于在得到没有遍历的节点时,也就是在OPEN表中的那些,A*算法是对其用快速排序将其按照估计值的大小进行排序的,于是总时间复杂度为o(n)*log(n),其中o(n)外层遍历OPEN表的全部节点,但对于Dijkstra算法,它并无对那些OPEN表的节点进行排序,因此获得的时间复杂度为o(n)*o(n)。