《经典图论算法》IDA*算法

摘要:

1,IDA*算法的介绍

2,Power Calculus

3,八数码问题和八数码无解的判断

1,IDA*算法的介绍

IDA*算法(Iterative deepening A*)是基于迭代加深的A*算法,是《迭代加深搜索算法(IDDFS)》《A*搜索算法》的结合,这两种算法我们前面都讲过,这里就不在重复介绍。

我们前面讲迭代加深搜索算法(IDDFS)时候知道,IDDFS虽然在搜索范围内会进行一部分搜索的约束,但它依然属于盲搜。如果在进行IDDFS搜索的时候,能够预测当前的状态,没必要继续递归下去,那么就可以直接返回,从而提高运行效率。

这个预测就是 A* 算法中我们讲到的评估函数,在搜索到某个状态的时候,如果发现后续搜索无解就返回。下面我们就用两个经典示例 Power Calculus 和八数码问题来详细讲解 IDA*算法 。

2,Power Calculus

给定一个数字 n 和一个数字 x ,求最少用几次乘法或除法,可以从 x 得到 x^n ,每次只能从已经得到的数字里选择两个进行操作。

例如:x^31 可以通过最少 6 次操作得到( 5 次乘, 1 次除)

x^2 = x*x
x^4 = (x^2)*(x^2)
x^8 = (x^4)*(x^4)
x^16 = (x^8)*(x^8)
x^32 = (x^16)*(x^16)
x^31 = (x^32)÷x

这题等价于从数字 1 开始,用加减法,最少算多少次能得到 n 。每次都用当前数字和前面计算过的所有数字都要进行一遍加法和减法运算。

如果把它的搜索过程看作是一棵树的话,树的第 1 层有 1 个节点,第二层就有 2 个节点,第 3 层就有 8 个节点……,每层节点个数分别是[1,2,8,48,384,3840,46080,645120,10321920……],我们可以看到第 9 层的时候节点个数就已经达到千万级别了,每层节点个数的公式如下:

f[i] = 2 * (i - 1) * f[i - 1];

ad90d15d4804f0eefde6c471eee3a922.png

这里要注意减法运算的时候要取它的绝对值,我们可以看到这棵树无论是宽度还是高度都是非常庞大的,所以很自然想到了用 IDA* 算法。

1,基于 IDDFS 搜索,指定一个递归的深度,每次搜索的时候都不能超过这个深度。

2,给定一个评估函数,如果当前值用最快的方式(倍增,连续乘 2)都不等到达 n ,直接停止搜索。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据结构和算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值