A*算法 与 IDA*算法

做搜索总不能一直停留在bfs和dfs上,当然要有一定深入,首先,启发式搜索必然是需要了解的。

【A*算法】

A*算法是一种启发式搜索算法,有一篇文章很有名:A* Pathfinding for Beginners

或者你可以看:(中文译文)

这篇文章很好地给初学者介绍了A*算法的入门知识。在看下面的文字之前你最好先阅读上面那篇文章。

关于A*算法过程讲解的文章已经很多了,下面我介绍一些自己的理解:

< f = d + h >

bfs其实就是h=0的A*算法。

< 估价函数选取总结 >

a. 曼哈顿距离(横纵坐标差的绝对值之和)
b. 欧几里得距离(两点间距离,即平方和开根号)
c. 切比雪夫距离(横纵坐标差的绝对值中较大者)
关于几种距离的比较:http://blog.csdn.net/v_JULY_v/article/details/6238029

< 维护一个堆 >

这个优先队列的排序依据就是核心公式f = d + h中的f

< 维护两个表——开放list和关闭list >

当第一次检测到某个点的时候,计算是否满足,计算相应的f、d、h值并放入open list中(比如可以用vis[][] = 1来标记)和堆中, 当再一次检测到某个点时候(vis[][] = 1), 检测本次的d是否更小,如果是则可以更新,包括f、d和父节点的更新,然后放入堆中。
被堆吐出的node,称为close list, 由于堆很好地排序特征,使得关闭list中的点不被再次检测。

【IDA*算法】

IDA*算法是迭代加深深搜算法和A*算法的结合。

迭代加深算法是在dfs搜索算法的基础上逐步加深搜索的深度,它避免了广度优先搜索占用搜索空间太大的缺点,也减少了深度优先搜索的盲目性。它主要是在递归搜索函数的开头判断当前搜索的深度是否大于预定义的最大搜索深度,如果大于,就退出这一层的搜索,如果不大于,就继续进行搜索。这样最终获得的解必然是最优解。

最大搜索深度的确定:穷举。从最小开始,不断向上加,直至刚好满足最优解的搜索深度。

显然,这样的办法虽然可以利用深度dfs解决A*广度搜索空间爆炸, 但是却是以重复的计算为代价的。

<使用>
1. 剪枝
    当前局面的估价函数值+当前的搜索深度 > 预定义的最大搜索深度时,就进行剪枝。

2. 经典结构
一个IDA_Star()驱动函数,一个dfs,具体见POJ1077

以上两种算法例子:POJ 1077 Eight 我的三种解法

你可能感兴趣的:(算法,bfs/dfs,剪枝,算法,搜索)