您的位置:首页 > 理论基础 > 数据结构算法

【算法】A*算法,数据结构小作业

2013-11-22 16:20 337 查看
A*算法:

引言:1968年,的一篇论文,“P. E. Hart, N. J. Nilsson,and B. Raphael. A formal basis for the heuristic determination of minimum costpaths in graphs. IEEE Trans. Syst. Sci. and Cybernetics, SSC-4(2):100-107, 1968”。从此,一种精巧、高效的算法------A*算法横空出世了,并在相关领域得到了广泛的应用。我写这个目的是因为目前百度地图路径搜索算法用的就是A*算法,于是拿来一起学习一下。

简介:

A*是一种静态路网中求解最短路最有效的方法。在Game中通常用来解决最短路径的一种算法。A*算法俗称A星算法,作为启发式搜索算法中的一种,这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上。该算法像Dijkstra算法一样,可以找到一条最短路径;也像BFS一样,进行启发式的搜索。

原理:

我们的目的是从位置A到目标位置B找到一条最短的行走路径。从起点开始,遍历所有的可走路径,记录到一个结构里,记录内容为(位置点,最小步数),当任何第二次走到一个点的时候,判断最小步骤是否小于记录的内容,如果是,则更新掉原最小步数,一直到所有的路径都不能继续走下去为止,最终那个点被标注的最小步数即是最短路径,但是,反向找跟他相连的步数相继少一个值的点连起来就形成了最短路径,当多个点相同,则任意取一条即可。一种极端情况,如果h(n)为0,则只有g(n)起作用,此时A*演变成了Dijkstra算法,这保证能找到最短路径。另一种极端情况,如果h(n)比g(n)大很多,则只有h(n)起作用,A*演变成BFS算法。(在应用领域1中)这个启发式函数算是对距离的一种估计,就是从起点到当前的+当前点到终点的距离就是总的距离,其中起点到终点是实实在在过来的,是准确的;但是当前点到终点的值是没有的,
所有就估计了一下。可以证明,A*想要正确,核心就在这个h估值函数,而且是要比实际值有所高估的。比较暴力的做法是用数组,高级一点的话就用平衡树,最好用平衡二叉树。

伪代码:

<source lang="matlab">

function A*(start,goal) //起点和终点

closedset := the empty set //已经被估算的节点集合

openset := set containing the initial node //将要被估算的节点集合

came_from := empty map

g_score[start] := 0 //g(n),初始化起点的g函数

h_score[start] := heuristic_estimate_of_distance(start, goal) //h(n),初始化起点的h函数

f_score[start] := h_score[start] //f(n)=h(n)+g(n),由于g(n)=0,所以……

while openset is not empty //若开放队列非空(把新搜索的点放进去)

x := the node in openset having the lowest f_score[] value //找出有最小f价值的点

if x = goal //如果这个点就是找的目标就结束

return reconstruct_path(came_from,goal)

remove x from openset //把这个最小价值的放在闭合队列里

add x to closedset

foreach y in neighbor_nodes(x) //foreach=for each 对x的每一个邻接点搜索

if y in closedset //如果这个点在闭合队列里,忽略

continue

tentative_g_score := g_score[x] + dist_between(x,y) //y点的g值

if y not in openset //如果这个点一开始不在开放队列,放入开放队列

add y to openset

tentative_is_better := true /

elseif tentative_g_score < g_score[y] //如果在开放队列里,就比较,看能不能更新

tentative_is_better := true

else

tentative_is_better :=false //不需要更新

if tentative_is_better = true

came_from[y] := x

g_score[y] :=tentative_g_score

h_score[y] :=heuristic_estimate_of_distance(y, goal)

f_score[y] := g_score[y] +h_score[y]

return failure

functionreconstruct_path(came_from,current_node) //路径回溯,找最有路径

if came_from[current_node] is set

p = reconstruct_path(came_from,came_from[current_node])

return (p + current_node)

else

return current_node

</source>

应用领域:

在人工智能中是一种典型的启发式搜索算法——启发式搜索是啥?

(启发式搜索就是在状态空间中的搜索对每一个搜索的位置进和评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无谓的搜索路径,提高了效率。在启发式搜索中,对位置的估价是十分重要的。采用了不同的估价可以有不同的效果——怎么评估?

(启发中的估价是用估价函数表示的,比如?——

(A星搜索中,它把到达节点的耗散g(n)和从该节点到目标节点的消耗h(n)结合起来对节点进行评价:f(n)=g(n)+h(n)——这些函数都是啥?

(其中g是走到当前这个状态实际已经花费的代价,h是你估计从当前状态走到终点还需要的代价,其中h必须小于等于真实值.

(一个一种具有f(n)=g(n)+h(n)策略的启发式算法能成为A*算法的充分条件是?



1、搜索树上存在着从起始点到终了点的最优路径。

2、问题域是有限的。

3、所有结点的子结点的搜索代价值>0。

4、h(n)=<h*(n)

(h*(n)为实际问题的代价值(h(n)距离h*(n)的程度不能过大,否则h(n)就没有过强的区分能力,算法效率并不会很高。对一个好的h(n)的评价是:h(n)在h*(n)的下界之下,并且尽量接近h*(n)。如果对所有的x,h(x)<=h*(x)成立,则称好h(x)为h*(x)的下界,它表示某种偏于保守的估计。采用h*(x)的下界h(x)为启发函数的A算法,称为A*算法)return 0;))))))

2、百度地图路径搜索算法中使用的是A*算法,在八数码问题中,除了用盲目搜索外就是用启发式搜索中的A*算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: