【算法】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*算法。
引言: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*算法。
相关文章推荐
- 算法与数据结构第三次作业 区间最值
- 算法与数据结构第八次作业 count2
- 算法与数据结构第六次作业 渣五战的记忆力
- 算法设计和数据结构学习_1(一道堆排序作业题)
- 算法与数据结构第十一次作业 二着色问题
- 算法与数据结构第七次作业 太阳帝国
- [数据结构]第四次作业:二叉数的各种算法
- 算法设计和数据结构学习_1(一道堆排序作业题)
- 算法与数据结构第四次作业 队列
- 算法与数据结构 第五次作业 身陷敌阵
- 【中国大学mooc—浙江大学数据结构2018春】1.3节求最大子列和问题,算法3的实现(对应作业题目:01-复杂度1 最大子列和问题)
- 数据结构与算法学习笔记——堆排序
- 【算法设计与数据结构】匈牙利算法求最大匹配
- 常用算法和数据结构的复杂度速查表
- 浅谈算法和数据结构: 一 栈和队列
- 2n个数的中位数问题_python_算法与数据结构
- 算法第七周作业01
- 学习数据结构和算法动态可视化工具
- 面经 常见数据结构的算法 - 链表专题
- 【ZX笔试】短作业优先算法