算法(7)分支限界法

分支限界法类似于回溯法,也是一种在问题的解空间树中搜索问题解的算法,它常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。

主要思路: 分支限界法首先将根结点加人活结点表(用于存放活结点的数据结构),接着从活结点表中取出根结点,使其成为当前扩展结点,一次性生成其所有孩子结点,判断孩子结点是舍弃还是保留,舍弃那些导致不可行解或导致非最优解的孩子结点,其余的被保留在活结点表中。再从活结点表中取出一个活结点作为当前扩展结点,重复上述扩展过程,一直持续到找到所需的解或活结点表为空时为止。由此可见,每一个活结点最多只有一次机会成为扩展结点。

分支限界法搜索过程的关键在于判断孩子结点是舍弃还是保留。因此,在搜索之前要设定孩子结点是舍弃还是保留的判断标准,这个判断标准与回溯法搜索过程中用到的约束条件和限界条件含义相同。

活结点表的实现通常有两种方法:一是先进先出队列,二是优先级队列,它们对应的分支限界法分别称为队列式(FFO)分支限界法和优先队列式分支限界法。队列式分支限界法按照队列先进先出(FIFO)的原则选取下一个结点作为当前扩展结点。优先队列式分支限界法按照规定的优先级选取队列中优先级最高的结点作为当前扩展结点。优先队列一般用二叉堆来实现:最大堆实现最大优先队列,体现最大效益优先;最小堆实现最小优先队列,体现最小费用优先。

分支限界法与回溯法的比较

1、相同点

(1)均需要先定义问题的解空间,确定的解空间组织结构一般都是树或图。
(2)在问题的解空间树上搜索问题解。
(3)搜索前均需确定判断条件,该判断条件用于判断扩展生成的结点是否为可行结点。
(4)搜索过程中必须判断扩展生成的结点是否满足判断条件,如果满足,则保留该扩展生成的结点,否则舍弃。

2、不同点

(1)在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解。换言之,分支限界法是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。

(2)由于求解目标不同,导致分支限界法与回溯法在解空间树上的搜索方式也不相同。回溯法以深度优先的方式搜索解空间树,而分支限界法则以宽度优先或以最小耗费(最大效益)优先的方式搜索解空间树。

(3)由于搜索方式不同,直接导致当前扩展结点的扩展方式也不相同。在分支限界法中,当前扩展结点一次性生成所有的孩子结点,舍弃那些导致不可行解或导致非最优解的孩子结点,其余孩子结点被加入活结点表中,而后自己变成死结点。因此,每一个活结点最多只有一次机会成为扩展结点。在回溯法中,当前扩展结点选择其中某一个孩子结点进行扩展,如果扩展的孩子结点是可行结点,则进入该孩子结点继续搜索,等到以该孩子结点为根的子树搜索完毕,则回溯到最近的活结点继续搜索。因此,每一个活结点有可能多次成为扩展结点。

在解决实际问题时,有些问题用回溯法或分支限界法解决效率都比较高,但是有些用分支限界法解决比较好,而有些用回溯法解决比较好。如:

  • 一个比较适合采用回溯法解决的问题:n皇后问题。皇后问题不适合使用分支限界法处理的根源在于n皇后问题需要找出所有解的组合,而不是某种最优解(事实上也没有最优解可言)。
  • 一个既可以采用回溯法也可以采用分支限界法解决的问题:0-1背包问题。
  • 一个比较适合采用分支限界法解决的问题:布线问题。

注:参考书本《算法设计与分析》(由王秋芬、吕聪颖、周春光编著)

你可能感兴趣的:(算法设计与分析,算法)