初见安~这里是搜索之启发式搜索专题:)【其实也没什么好写的QAQ
启发式搜索 A*
什么是启发式搜索——其实可以说是在BFS 或者 DFS时的一个优化操作,在搜索的时候通过一个估价函数来估计当前状态对于答案的价值,如果估出来是一定不如最优解的,那么当前状态我们就可以直接舍弃。
就比如求K短路的时候,就可以用A*算法估价这个点到终点的距离,加上实际距离用于优先队列排序,让估价后更优的策略靠前。这种情况下我们的估价函数就是先逆向求一边从终点出发到其他所有点的距离。
很明显,估价函数就是这个算法的难点。估价函数写的如何,决定了你的代码的正确率和运行时间如何。
可能这么说不是很容易理解,我们接往下看。
迭代加深启发式搜索 IDA*
什么是迭代加深?往往是在涉及到状态的时候应用较多。就比如八数码问题,我们可以枚举移动次数,然后A*搜索看看能不能在枚举的次数以内得到答案。这种情况下,我们估价函数的意义就是:当前步数+估价步数>枚举答案,那么这个状态就不必推广下去了。
其实现效率:BFS < A* < IDA*。
如果这样都还不能很明白的话,就可以做点例题体会一下。
估价函数的形式很多,有的时候是具体数值,有的时候就真的就是一种估计。上面两种就是单纯的估计,还有求曼哈顿路径等等的估价方式。
所以其实这种搜索真没什么好说的……QAQ就相当于是加一个估价函数让你能更快找到你的目标。
至于估价函数怎么写,这个……就靠你自己去刷题历练啦~
经典应用:
1.类似于八数码
2.K短路
迎评:)
——End——