相似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在通常状况下,分支限界法与回溯法的求解目标不一样。回溯法的求解目标是找出T中知足约束条件的全部解,而分支限界法的求解目标则是找出知足约束条件的一个解,或是在知足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。html
所谓“分支”就是采用广度优先的策略,依次搜索E-结点的全部分支,也就是全部相邻结点,抛弃不知足约束条件的结点,其他结点加入活结点表。而后从表中选择一个结点做为下一个E-结点,继续搜索。算法
选择下一个E-结点的方式不一样,则会有几种不一样的分支搜索方式。数据结构
1)FIFO搜索函数
2)LIFO搜索post
3)优先队列式搜索url
因为求解目标不一样,致使分支限界法与回溯法在解空间树T上的搜索方式也不相同。回溯法以深度优先的方式搜索解空间树T,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树T。spa
分支限界法的搜索策略是: 在扩展结点处,先生成其全部的儿子结点(分支),而后再从当前的活结点表中选择下一个扩展对点。为了有效地选择下一扩展结点,以加速搜索的进程,在每一活 结点处,计算一个函数值(限界),并根据这些已计算出的函数值,从当前活结点表中选择一个最有利的结点做为扩展结点,使搜索朝着解空间树上有最优解的分支 推动,以便尽快地找出一个最优解。htm
分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。问题的解空间树是表示问题解空间的一棵有序树,常见的有子集树和排列树。 在搜索问题的解空间树时,分支限界法与回溯法对当前扩展结点所使用的扩展方式不一样。在分支限界法中,每个活结点只有一次机会成为扩展结点。活结点一旦成 为扩展结点,就一次性产生其全部儿子结点。在这些儿子结点中,那些致使不可行解或致使非最优解的儿子结点被舍弃,其他儿子结点被子加入活结点表中。此后, 从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所求的解或活结点表为空时为止。blog
有一些问题其实不管用回溯法仍是分支限界法均可以获得很好的解决,可是另一些则否则。也许咱们须要具体一些的分析——到底什么时候使用分支限界而什么时候使用回溯呢?队列
回溯法和分支限界法的一些区别:
方法对解空间树的搜索方式 存储结点的经常使用数据结构 结点存储特性经常使用应用
回溯法深度优先搜索堆栈活结点的全部可行子结点被遍历后才被从栈中弹出找出知足约束条件的全部解
分支限界法广度优先或最小消耗优先搜索队列、优先队列每一个结点只有一次成为活结点的机会找出知足约束条件的一个解或特定意义下的最优解
(以上内容转自五大经常使用算法之五:分支限界法)