摘要:
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];
这里要注意减法运算的时候要取它的绝对值,我们可以看到这棵树无论是宽度还是高度都是非常庞大的,所以很自然想到了用 IDA* 算法。
1,基于 IDDFS 搜索,指定一个递归的深度,每次搜索的时候都不能超过这个深度。
2,给定一个评估函数,如果当前值用最快的方式(倍增,连续乘 2)都不等到达 n ,直接停止搜索。