搜索策略是算法分析与设计中很常见的一种算法思想,特别是对于很多多项式时间内无法解决的问题,即NP-完全问题。而通常这些实际应用中的NP-完全问题都具有比较小的输入规模,此时一种很自然的想法是穷举问题的解空间,从中找出问题的解。
这篇文章会讲解常用的深度优先搜索、广度优先搜索、分支界限搜索、A*搜索等。
- 深度优先搜索
深度优先搜索说白了就是一直走到头,直到找到最优解。算法基本思想如下:
关于深度优先搜索可以用栈来实现,也可以用递归来实现。
可以参考图的深度优先搜索代码。
2. 广度优先搜索
广度优先搜索说白了就是每一步得走遍所有可能的点,直到找到最优解法 。
关于广度优先搜索,可以用队列来实现,可以参考图的广度优先搜索算法。
3. 爬山法-优化的深度优先搜索
在深度优先搜索的过程中,我们经常遇到多个节点可以扩展的情况,首先扩展哪个?爬山法是一种优化的深度优先搜索,使用启发式测度来排序节点扩展的顺序、使用贪心思想确定搜索的方向,基本思想如下:
例如在8-puzzle问题中采用爬山法的思想:
4. Best-First策略-结合深度优先搜索和广度优先搜索
Best-First策略是根据一个评价函数
同样用8-Puzzle例子来说明,评价函数用的是
可以看到Best-First策略使用堆来选择每次扩展的节点,不像爬山法只是一个带贪心思想的深度优先搜索,Best-First策略融合了深度优先和广度优先的优点!
5.分支界限搜索
分支界限搜索的基本思想是用某种策略(比如爬山发、Best-First策略)产生分支,发现优化解的一个界限,缩小解空间,从而提高求解的效率。说白了就是剪枝呗!
例如使用分支界限搜索来求解多阶段图的例子:
例1:多阶段图的搜索问题:
首先将问题转化为树搜索问题,
接受使用爬山发策略进行分支界限搜索:
例2:人员任务分配问题。该问题定义如下:
将该问题转化为树的搜索问题,问题的解空间是一个拓扑排序。如下是拓扑排序算法的定义,
该问题的解空间是所有拓扑排序的序列集合,每个序列对于一个可能的解。将问题的解用树表示如下:
该拓扑序列树的生成算法伪代码如下:
接下来需要计算解的代价的下界:
例如:
由此得到解的加权树表示如下:
使用爬山法策略进行分支界限搜索算法如下:
例3:旅行商问题
旅行商问题定义如下:
将该连通图用矩阵表示如下,即代价矩阵
为了方便,将该问题转化为一个树搜索问题(个人反倒觉得这个地方技巧性很强):
构造根节点,其为包含所有点的解集合,其权值为代价下界,计算代价下界如下:
代价下界为:
变换后的代价矩阵为:
每次划分的时候,选择这样的边,满足:
即选择使子节点代价下界增加最大的那个划分边,以此来构造根节点的两个子节点,左子节点为包括该边的所有解的集合,右子节点为不包含该边的所有解的集合。
例如对于根节点,
计算使得左子树代价增长为0时,右子树代价下界的增长值
所以选择边
计算左右子节点的代价下界(私以为这一步有点多余):
此时树变为:
接着就是递归的构造左右子树了!
首先构造左子树对应的代价矩阵:
计算左子树的根的代价下界:
构造右子树根对应的代价矩阵:
以此类推,一直往下扩展,最后集合为空找到最优解!
另外注意搜索过程中避免出现环的问题:
例4:0-1背包问题
考虑到用搜索的方法,那么怎么将问题表示成树搜索问题呢?
扩展每个节点的时候计算节点的下、上界:
分支界限搜索寻找最优解:
例如下面构造0-1背包问题的搜索实例:
第一个物品的取舍:
树变为:
第二个物品的取舍:
树变成:
依次类推,第三个物品的取舍,得到的树为(灰色表示剪枝的):
故,最终的最优解为220.
6.A*算法
A*算法是利用启发式函数、Best-first策略进行搜索从而更早的发现优化解的一种算法,它的核心告诉我们在某些情况下得到的解一定是最优解,算法可以停止!与分支界限不同的是:分支界限是为了剪掉不能达到优化解的分支。
A*算法的关键是启发式函数的选取!对于任意一个节点
-
= 从树根到的代价
-
= 从到目标节点的优化路径的代价
-
是节点的代价
上述式子中
为什么要保证
A*算法的本质-已经发现的解是优化解!说白了当使用Best-first策略搜索树的时候,如果A*算选择的节点是目标节点,那么该节点表示的解就是优化解,算法可以停止了!!!
具体看下面的证明:
因此,总结A*算法的规则如下:
例子:应用A*算法求解最短路径问题-求S->T的最短路径
算法执行过程如下:
所以接下来扩展
接下来扩展
接下来扩展
接下来扩展
接下来扩展
接下来扩展
这里细心的话会发现
另外又有一个用漫画的形式来讲解的A*算法很是形象生动,参考
漫画:什么是 A* 寻路算法?mp.weixin.qq.com小结:至此,我们讲解了搜索策略中的常用的深度优先搜索、广度优先搜索和爬山法和Best-First策略、分支界限搜索以及A*算法,快快将该思想应用到你的coding中吧!
参考资源
【1】哈工大骆吉洲《算法分析与设计》课程PPT