现在的位置: 首页 > 综合 > 正文

A星搜索_heuristic 算法

2017年08月19日 ⁄ 综合 ⁄ 共 1294字 ⁄ 字号 评论关闭

总结与July的算法介绍

1、启发式搜索,在选择下一个结点的时候是通过一个启发式的函数进行的,选择代价最少的结点作为下一步搜索结点,关键是启发函数的设计,DFS和BFS 都属于盲目式搜索,最坏情况会遍历整个解空间。

2、A*算法是在一个图形平面中的众多结点里面,求出最低通过成本的算法,在游戏中的NPC 和BOT的移动计算,去找最短距离,那它和Dijkstra的区别 是?

核心是估值函数的设计:f(n) = g(n) + h(n)   f(n)是每个可能试探点的估值,g(n)为起始搜索点到当前点的代价(通常为树的深度),h(n)是当前结点到目标结点的估值,直接影响这是否能称为A*算法。h(n)的设计要小于实际的h(n)值,这一点非常不好确认,因为实际的值是不知道的,好在现有的有关于图内找最优路径和八数码问题的h(n)设计都得以证明和设计,从而可以使此算法得到推广。

3、A*算法最为核心的过程,就是每次选择下一个当前搜索点的时候是从所有已知探知的但未搜索过点中,选取f值最小的结点进行展开的,这些点是按f值升序的队列进行排列的。维护了两张表格,一张closed 表和 一张 open 表,从中取节点进行计算。

将A* 算法与Dijkstra算法,DFS和BFS的区别和联系,要深究!

4、A*算法的关键是排序,本质仍然是穷举法,对于介绍中后面所说的A*算法利用不同的方法很是奇怪,曼哈顿距离、欧氏距离、切比雪夫距离 ,以及双向广度优先,通过了一个神奇的软件,难道这个也是july自己做的,太牛了,可视化的看出了各个算法的效率,得到结果是,A*是高效的寻路方法,

 A* 关键是所有已探知的但未搜索过点中,选取f值最小的结点进行展开的。

5、在整体的搜索过程中,只要按照类似广度优先的算法框架,从优先队列中弹出队首元素(f值),对其可能子节点计算g.h.和f值,直到优先队列为空或找到终止点为止。

6、用open 表和 close 表 进行描述不同算法,对于DFS , 广度优先,是将延伸出来的子节点放到open表的前面,也就是open表是一个栈,对于BFS,是将延伸出来的子节点放到open表的后面,也就是open表是一个队列。

7、对于栈结构的DFS 实现过程在计算机里面是比较容易的,因为计算机中又很多系统栈,所以在展开一个结点的后续结点时可以不用一次全部展开,用一些环境变量记录状况,在递归调用结束后继续展开。(这里是什么意思???)

8、下面的一个利用系统栈递归式的实现DFS,再继续SJ。

9、DFS和BFS都是蛮力搜索,是它们在搜索到一个结点时,将所有展开的后续结点都放在队列中,而不进行任何的甄别,启发式的搜索即指利用启发函数进行判断后续子节点,从而选择下面一个进行紧接着的算法

10、A*就是将估值函数分成两部分,一个部分是路径价值,另一个部分是一般性启发价值,合在一起算整个结点的价值,如果路径价值为0,则就变成有序搜素,如果路径价值就用所在的深度表示,而启发值为0,那就是BFS和DFS,而这个两个具体实施时恰好相反,BFS是选择深度为0的开始,而DFS是选择深度最大的开始,因为一前一后,而BFS才算是A×算法,只不过无启发值。

抱歉!评论已关闭.