HFUT - 算法导论复习 - 分支界限法(Branch and Bound Method)

简介

有点类似于回溯法(backtracking)
回溯法使用的是深度搜索
分支界限法用的是广度搜索
一般是用来解决最小化问题的
但是显然当遇到最大化问题时,我们转化成最小化问题即可

举例

时间安排(Job Sequencing)

Jobs = {J1,J2,J3.J4}

HFUT - 算法导论复习 - 分支界限法(Branch and Bound Method)_第1张图片

FIFO 分支限界法 (队列式分支限界法)

基本思想:按照队列先进先出 (FIFO) 原则选取下一个活结点为扩展结点。

搜索策略:一开始,根结点是唯一的活结点,根结点入队。从活结点队中取出根结点后,作为当前扩展结点。对当前扩展结点,先从左到右地产生它的所有儿子,用约束条件检查,把所有满足约束函数的儿子加入活结点队列中。再从活结点表中取出队首结点(队中最先进来的结点)为当前扩展结点,直到找到一个解或活结点队列为空为止。(广度优先)

以下用的不是队列,所以不是FIFO
以下使用的是栈 是 LLFO (last leaf first out)

HFUT - 算法导论复习 - 分支界限法(Branch and Bound Method)_第2张图片
HFUT - 算法导论复习 - 分支界限法(Branch and Bound Method)_第3张图片
HFUT - 算法导论复习 - 分支界限法(Branch and Bound Method)_第4张图片
HFUT - 算法导论复习 - 分支界限法(Branch and Bound Method)_第5张图片

LC (least cost) 分支限界法 (优先队列式分支限界法)

基本思想:加速搜索的进程,采用有效地方式选择活结点进行扩展
按照优先队列中规定的优先级选取优先级最高的结点成为当前扩展结点

搜索策略:
对每一活结点计算一个优先级(某些信息的函数值),并根据这些优先级;
从当前活结点表中优先选择一个优先级最高(最有利)的结点作为扩展结点,使搜索朝着解空间树上有最优解的分支推进,以便尽快地找出一个最优解。
再从活结点表中下一个优先级别最高的结点为当前扩展结点,直到找到一个解或活结点队列为空为止

HFUT - 算法导论复习 - 分支界限法(Branch and Bound Method)_第6张图片

HFUT - 算法导论复习 - 分支界限法(Branch and Bound Method)_第7张图片

例 0/1 背包问题

HFUT - 算法导论复习 - 分支界限法(Branch and Bound Method)_第8张图片

如上所示的背包问题,显然我们希望利益能够最大化
但是 分支界限法所求解的是最小化问题
我们所需要做的转化就是,将每个物品的profit(利润)变成负的
如此求的便是最小值;但是答案与利益最大化是一致的

  1. 首先设置两个状态
  • upper bound : u = ∑ i = 1 n p i w i u = \sum_{i = 1}^n p_iw_i u=i=1npiwi (total weight < 15)
  • c = ∑ i = 1 n p i w i c = \sum_{i = 1}^n p_iw_i c=i=1npiwi(可以带除的,就是一个物品可以被拆了)

HFUT - 算法导论复习 - 分支界限法(Branch and Bound Method)_第9张图片
HFUT - 算法导论复习 - 分支界限法(Branch and Bound Method)_第10张图片
HFUT - 算法导论复习 - 分支界限法(Branch and Bound Method)_第11张图片

HFUT - 算法导论复习 - 分支界限法(Branch and Bound Method)_第12张图片
HFUT - 算法导论复习 - 分支界限法(Branch and Bound Method)_第13张图片

代码有时间再实现吧(溜

你可能感兴趣的:(算法导论,算法)