算法复习 - 分支限界法

  1. 什么是分支界限法:
    所谓分支就是采用广度优先的策略,一次搜索活结点的所有分支。为了有效的选择下一扩展节点,以加速搜索的进程
    在每一处活节点处,计算一个函数值(限界函数),在当前的活结点中选择一个可行最优解作为下一拓展节点。
    算法复习 - 分支限界法_第1张图片

  2. 基本思想:
    分支界限常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。

在一个活结点生成所有孩子节点中,不满足界限函数的孩子将被舍弃,满足的孩子将加入到活结点表中。

以后,从活结点表中取出下一节点当成扩展节点,不停地重复上述步骤,直到找到最优解或者活结点表为空为止。

  1. 回溯法vs分支限界法:
    算法复习 - 分支限界法_第2张图片
  2. 设计思想:
    一:设计合适的限界函数
    在节点搜索过程中,每一个或活结点会产生很多孩子节点,设计合理的限界函数,删除不满足可行解或者限界的孩子节点,
    增加搜索效率

二:组织活动节点表
A. 从当前活动节点表出队,作为当前活扩展节点,一次生成所有孩子节点。
B. 根据限界条件删除不满足的孩子节点
C. 将满足条件的孩子节点入队,同时从当前对头取出下一扩展节点
不断重复上述三步,直到队列为空或者找到最优可行解。

      例如:队列式分支限界法
            队列式将活动节点表组成一个队列,按照先进先出的原则选取下一节点作为  扩展节点
        A.	选取根节点入队
        B.	取出对头节点作为扩展节点
        C.	将满足限界条件的孩子节点入队
        D.	不断重复B,C步骤。
  1. 提高分支限界法效率
    实现算法时,首先确定目标值的上下界,一边搜索一边减掉树的分支,提高搜索的效率
    就像是剪掉树的枝枝叶叶一样剪掉当前树的死节点,以减少搜索的时间。

     在实现算法时还需要考虑很多问题:
    1.	如何设置当前上下界,节点的限制函数又该如何设定。
    2.	怎么选择当前活动表节点作为下一扩展节点。
    3.	怎么展开当前的搜索树,是bfs优先还是bfs和dfs混合搜索
    
  2. 实例讲解:
    1.分配问题

算法复习 - 分支限界法_第3张图片
在没有人员选取任务时,考虑最小下限,lb = 2 + 3 + 1 + 4 = 10,人员b和人员c不能同时选取任务三,所以说最小解是不存在的,只能最为边界,
进行条件判断,将当前根节点入队,取出当前队头元素生成所有孩子节点。那么且看第一层孩子的剪枝,当a拿1时,此时ib = 9 + 3 +1 + 4 = 17;
当a拿2时,ib = 2 + 3 + 1 + 4 = 10;当a拿3时,ib = 7 + 4 + 5 + 4 = 20;当a拿4时,ib = 8 + 3 + 1 +6 = 18;很明显选择拿2入队,其他全部舍弃。
后面的选择全部相似,不断的从队列中拿出对头的元素,当到第五层的时候或者队列的元素为空的时候,结束遍历,找到最优解。

  1. 背包问题
    背包问题用分支限界法求解其实本质上和0/1背包一位数组倒序求解本质过程是一样的。这里仅仅记录下界是怎么求得,第一层ib = 10 * 10 = 100,
    第二层,第一个 ib = 40 + (10 – 4)* 6 = 76;第二个ib = 10 * 6 = 60;后面全都类似。
    算法复习 - 分支限界法_第4张图片

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