算法笔记6——分支限界

分支限界法与回溯法的不同:

(1)求解目标:
回溯法是找出解空间树中满足约束条件的所有解,分支限界法是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。
(2)搜索方式:
回溯法以深度优先的方式搜索解空间树分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。
在分支限界法中,我们常常会设置一个队列来存储扩展结点,每次都从该队列中按照一定的规则选择下一个节点。而在回溯法中则没有。

分支限界的基本思想:

(1)分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。
(2)每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。
(3)从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。

常见的两种分支限界法

(1)FIFO:按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。
(2)优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。

经典问题:

一、0-1背包

算法的思想:

分支限界法解0-1背包属于优先队列式分支限界法。
和回溯法一样,首先,要对输入数据进行预处理,将各物品依其单位重量价值从大到小进行排列。
在这里插入图片描述
然后计算一个上界和下界:
在这里插入图片描述
下界是指,背包里只装第一个物品,其他都不装,此时背包的价值达到最小。
上界是假设第一个物品正好把背包装满,因为第一个物品的单位价值最高,此时背包的价值达到最大。
那么实际的最优情况应该介于两者之间,越大越好。如果超出这个界限,就直接舍弃掉。

此外,我们需要设定一个界限函数ub,这个界限函数的作用是帮我们计算,在当前状况下我们背包最后可以达到的最高价值。
在这里插入图片描述
最后我们设置一个队列PT{}来存放活结点,即优先队列。
下面我们开始按广度优先的方式遍历子集树。
在这里插入图片描述
首先,从第一个物品开始,计算它的左孩子(放入第一个物品)和右孩子(不放第一个物品)。计算完成后,我们发现2节点的ub比3大,所以2应该排在3前面,于是此时PT{2,3}。
接下来计算2节点的左孩子(放入第2个物品)和右孩子(不放第2个物品),计算完成后,我们发现4节点超出了背包大小,5节点的ub比3节点大,所以5节点应该排在3节点前面,于是此时PT{5,3}。
接下来计算5节点的左孩子(放入第3个物品)和右孩子(不放第3个物品),计算完成后,6节点的ub比7节点大,7节点的ub比3节点大,所以6节点应该排在7节点前面,7节点应该排在3节点前面,于是此时PT{6,7,3}。
接下来计算6节点的左孩子(放入第4个物品)和右孩子(不放第4个物品),计算完成后,我们发现8节点超出了背包大小,9节点到达了叶子节点,根据分支限界的规则,算法结束。

二、单源最短路径

给定一个带权有向图G=VE,其中每条边的权是非负实数,另外,给定V中的一个顶点,称为源。现要计算从源到所有其他各顶点的最短路径长度。这里路的长度是指路上各边权之和。这个问题称为单源最短路径问题。

算法思想

分支限界法解单源最短路径属于优先队列式分支限界法。并用一极小堆来存储活结点表。其优先级是结点所对应的当前路长
我们的目标是找到耗费最小的一条路,故目标函数为:cost(i )=min {cij +cost (j )} (i≤j≤n且顶点 j 是 i 的邻接点)
同0-1背包一样,我们设置一个上界、下界和界限函数来帮助我们剪枝,减少计算量。
下界:把每一段最小的代价相加,2+4+5+3=14
上界:2+6+6+3=17 (s→B→E→H→t),选当前最优。
限界函数:假设已经确定了i 段(1≤i≤k),其路径为(r1, r2, …, ri , ri+1)
在这里插入图片描述
在这里插入图片描述
从S开始,S有三个子节点A、B、C。计算ABC。
如果走A,记为2,db=4+8+5+3=20。超过之前计算的上界,剪枝。
如果走B,记为3,db=2+6+5+3=16。可行,将该节点放入队列。
如果走C,记为4,db=3+4+5+3=15。可行,将该节点放入队列。
此时PT{4,3}
从C开始,C有2个子节点E、F。计算EF。
如果走F,记为5,db=3+7+5+3=18。超过之前计算的上界,剪枝。
如果走E,记为6,db=3+4+6+3=16。可行,将该节点放入队列。
此时PT{3,5}
从B开始,B有3个子节点D、E、F。计算DEF。
如果走D,记为7,db=2+8+5+3=18。超过之前计算的上界,剪枝。
如果走F,记为8,db=2+8+5+3=18。超过之前计算的上界,剪枝。
如果走E,记为9,db=2+6+6+3=17。可行,将该节点放入队列。
此时PT{5,8}
从E开始,C有2个子节点G、H。计算GH。
如果走G,记为10,db=3+4+8+7=22。超过之前计算的上界,剪枝。
如果走E,记为11,db=3+4+6+3=16。可行,到达叶子节点,算法结束。

三、旅行售货员问题

问题描述:某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条从驻地出发,经过每个城市一次,最后回到驻地的路线,使总的路程(或总旅费)最小。
要找最小费用旅行售货员回路,选用最小堆表示活结点优先队列。
算法开始时创建一个最小堆,用于表示活结点优先队列。
堆中每个结点的子树费用的下界lcost值,是优先队列的优先级。
计算每个顶点的最小费用出边并用minout记录
如果所给的有向图中某个顶点没有出边,则该图不可能有回路,算法结束。
如果每个顶点都有出边,则根据计算出的minout作算法初始化。
在这里插入图片描述
求解思路
采用贪心法求得近似解为1→3→5→4→2→1,其路径长度为1+2+3+7+3=16,这可以作为TSP问题的上界。
把矩阵中每一行最小的元素相加,可以得到一个简单的下界,其路径长度为1+3+1+3+2=10,
在这里插入图片描述
在这里插入图片描述

  • 13
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值