A*算法 与 IDA*算法

原创 2016年05月31日 16:13:50

做搜索总不能一直停留在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 我的三种解法

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

IDA*算法

  • 2008-01-05 21:04
  • 66KB
  • 下载

EOJ1154 CAN YOU DFS? IDA*搜索算法

题目:EOJ1154 CAN YOU DFS?  IDA*搜索算法 Description 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数。 如:2/3=1/2+1/6...

CMPSCI 683 AI 第三讲 启发式搜索-IDA*算法

IDA*算法是A*算法和迭代加深ID算法的结合,先搜录相关资料如下[1] 搜索算法:IDA*算法,这是对IDA*算法的一个解释和学习笔记http://blog.csdn.net/urecvbnkuhB...

八数码问题 IDA*算法+曼哈顿距离 poj 1077

http://hi.baidu.com/wangz_j/blog/item/8dad3fcfbf31e41593457e51.htmlIDA*即迭代加深的A*搜索,实现代码是最简练的,无须状态判重,无...
  • nomad2
  • nomad2
  • 2011-06-22 21:52
  • 3499

hdu1813 IDA*算法

这道题的题意是:从棋子上的某一点(边缘、坏的棋子

IDA*算法解决十五数码问题

IDA*算法是A*算法和迭代加深算法的结合. A*算法需要维护open表和close表,以及排序选择最小代价的结点内存空间消耗过多。 IDA*的答题思路是。首先 根据最初的数码表 5 1 ...

IDA*算法

该文主要介绍用IDA*算法实现八数码问题 IDA*算法即迭代加深的A*算法,实现代码是最简练的,无须状态判重,无需估价排序 IDA*大部分时候比A*还要快,可以说是A*的一个优化版本! /* POJ...

从拼图游戏开始(四)_IDA*算法求解Java实现

终于,在学习了完深搜和广搜、Dijkstra、二叉堆和优先队列以及A*算法之后,可以看一下IDA*算法了。因为求解4x4的拼图游戏所要搜素的节点数很大,所以应该采用IDA*算法,而3x3的拼图游戏则可...

1343 - The Rotation Game (IDA*算法)

紫书上给的是状态空间搜索,其实本题也可以用IDA*算法,因为其符合IDA*的特点 : 求最小迭代次数 。 根据旋转的规律,我们可以用几个数组来储存向各个方向旋转时改变哪些量,用来维护旋转这个操作 。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)