总结以下几点(F = G + H):
● A*/DFS/BFS都是对状态空间进行遍历的方法,区别在于前者通过估价函数H进行有选择的遍历。
可以这么说,当状态空间非常大的时候可以考虑用A*,只要能找到h就行
● A*更新方式与DJ非常接近
● A*从已访问结点中选取F最小的结点作为下一次的扩展的起点
● 假设评价函数时间复杂度为f(n),设路径长度为n,那么总是时间复杂度 为O(n) * f(n)
● G可以是从起点到当前结点的层数,也可以是像示例中10/14等权值
● H是估价函数,即从当前结点到终点的花费。示例中的H很简单,只是H=dx+dy
● 选取F最小结点的方法:二叉堆,插入log(n)
btw:二叉堆对于“在n个数据中选出前x个”需求时特别有效,当然在x<<n时效果更明显。
● A*本身的结构很清晰,实现也比较简单。核心部分就是寻找有效合理的估价函数H,这也是A*算法的价值所在。
参考资料:
[1] A* Pathfinding for beginners
http://dev.gameres.com/Program/Abstract/Arithmetic/A%20Pathfinding%20for%20Beginners.htm
[2] A*高效搜索算法
http://blog.programfan.com/article.asp?id=18471
[3] 深入A*算法
http://creativesoft.home.shangdu.net/AStart2.htm
下面是来自[百度百科]对A*介绍:
A
*
(A
-
Star)算法是一种静态路网中求解最短路最有效的方法。
公式表示为: f(n)
=
g(n)
+
h(n),
f(n) 是节点n从初始点到目标点的估价函数,
g(n) 是在状态空间中从初始节点到n节点的实际代价,
h(n)是从n到目标节点最佳路径的估计代价。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:
(
1
)估价值h(n)
<=
n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。
(
2
)如果 估价值
>
实际值, 搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
估价值与实际值越接近,估价函数取得就越好。
例如对于几何路网来说,可以取两节点间欧几理德距离(直线距离)做为估价值,即f
=
g(n)
+
sqrt((dx
-
nx)
*
(dx
-
nx)
+
(dy
-
ny)
*
(dy
-
ny));这样估价函数f在g值一定的情况下,会或多或少的受估价值h的制约,节点距目标点近,h值小,f值相对就小,能保证最短路的搜索向终点的方向进行。明显优于Dijstra算法的毫无无方向的向四周搜索。
A*
算法————M个传教士和N个野人
一. 问题描述
有M个传教士和N个野人来到河边准备渡河,河岸有一条船,每次至多可供k人乘渡。任何时刻在河的两岸以及船上的野人数目总是不超过传教士的数目。
二. 问题分析
本问题采用A
*
算法求解,解答的关键与难点如下:
1
. 评估函数的建立。评估函数为f
=
h
+
d
=
M
+
N
-
2
*
B
+
d.。
M表示左岸的传教士的人数,N表示左岸野人的数目,B取值为0或1 。1表示船在左岸,
0
表示船在右岸。d 表示节点的深度。
下面我们来证明h(n)=M
+
C
-
2B是满足A
*
条件的。
我们分两种情况考虑。先考虑船在左岸的情况。如果不考虑限制条件,也就是说,船一次可以将三人从左岸运到右岸,然后再有一个人将船送回来。这样,船一个来回可以运过河2人,而船仍然在左岸。而最后剩下的三个人,则可以一次将他们全部从左岸运到右岸。所以,在不考虑限制条件的情况下,也至少需要摆渡[(M
+
N
-
3
)
/
2
]
*
2
+
1次。其中分子上的
"
-3
"
表示剩下三个留待最后一次运过去。除以
"
2
"
是因为一个来回可以运过去2人,需要[(M
+
N
-
3
)
/
2
]个来回,而
"
来回
"
数不能是小数,需要向上取整,这个用符号[ ]表示。而乘以
"
2
"
是因为一个来回相当于两次摆渡,所以要乘以2。而最后的
"
+1
"
,则表示将剩下的3个运过去,需要一次摆渡。
化简有: M
+
N
-
2
。
再考虑船在右岸的情况。同样不考虑限制条件。船在右岸,需要一个人将船运到左岸。因此对于状态(M,N,
0
)来说,其所需要的最少摆渡数,相当于船在左岸时状态(M
+
1
,N,
1
)或(M,N
+
1
,
1
)所需要的最少摆渡数,再加上第一次将船从右岸送到左岸的一次摆渡数。因此所需要的最少摆渡数为:(M
+
N
+
1
)
-
2
+
1
。其中(M
+
N
+
1
)的
"
+1
"
表示送船回到左岸的那个人,而最后边的
"
+1
"
,表示送船到左岸时的一次摆渡。
化简有:(M
+
N
+
1
)
-
2
+
1
=
M
+
N。
综合船在左岸和船在右岸两种情况下,所需要的最少摆渡次数用一个式子表示为:M
+
N
-
2B。其中B=1表示船在左岸,B=0表示船在右岸。
由于该摆渡次数是在不考虑限制条件下,推出的最少所需要的摆渡次数......
● A*/DFS/BFS都是对状态空间进行遍历的方法,区别在于前者通过估价函数H进行有选择的遍历。
可以这么说,当状态空间非常大的时候可以考虑用A*,只要能找到h就行
● A*更新方式与DJ非常接近
● A*从已访问结点中选取F最小的结点作为下一次的扩展的起点
● 假设评价函数时间复杂度为f(n),设路径长度为n,那么总是时间复杂度 为O(n) * f(n)
● G可以是从起点到当前结点的层数,也可以是像示例中10/14等权值
● H是估价函数,即从当前结点到终点的花费。示例中的H很简单,只是H=dx+dy
● 选取F最小结点的方法:二叉堆,插入log(n)
btw:二叉堆对于“在n个数据中选出前x个”需求时特别有效,当然在x<<n时效果更明显。
● A*本身的结构很清晰,实现也比较简单。核心部分就是寻找有效合理的估价函数H,这也是A*算法的价值所在。
参考资料:
[1] A* Pathfinding for beginners
http://dev.gameres.com/Program/Abstract/Arithmetic/A%20Pathfinding%20for%20Beginners.htm
[2] A*高效搜索算法
http://blog.programfan.com/article.asp?id=18471
[3] 深入A*算法
http://creativesoft.home.shangdu.net/AStart2.htm
下面是来自[百度百科]对A*介绍:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)