算法基础之分支限界
分支限界(branch and bound)法与回溯法类似,但是回溯法是求解目标中所有满足约束条件的解,而分支限界法是找出满足约束条件的一个解,最优。
所谓“分支”是采用广度优先的策略,依次生成扩展结点的所有分支(即:儿子结点)。
所谓“限界”是在结点扩展过程中,计算结点的上界(或下界),边搜索边减掉搜索树的某些分支,从而提高搜索效率。
回溯法和分支限界法的一些区别
回溯法深度优先搜索堆栈活结点的所有可行子节点被遍历后,才被从栈中弹出找出满足约束条件的所有解。
分支限界法广度优先或最小消耗优先搜索队列,优先队列每个结点只有一次成为活结点的机会找出满足约束条件的一个解或特定意义下的最优解。
常见的两种分支界限法
1)队列式(FIFO)分支界限法(广度优先):按照队列先进先出原则选取下一个结点为扩展结点。
2)优先队列式分支限界法(最小损耗优先):按照优先队列规定的优先级选取优先级最高的结点成为当前扩展结点。
例1、现在看一个简化版本的装载问题:一艘轮船装载问题。是否有一个合理的装载方案,可将这n个集装箱装上这2艘轮船?将第一艘轮船尽可能装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和最接近载重量。
队列式分支限界法
解装载问题的队列式分支限界法仅求出所要求的最优值,稍后进一步构造最优解。
首先检测当前扩展结点的左儿子结点是否为可行结点。如果是,则将其加入到活结点队列Q中。
然后,将其右儿子结点加入到活结点队列中(右儿子结点一定是可行结点)。2个儿子结点都产生后,当前扩展结点被舍弃。
活结点队列中,队首元素被取出作为当前扩展结点。
活结点队列已空,算法终止
★优先队列式分支限界法
解装载问题的优先队列式分支限界法用最大优先队列存储活结点表。
活结点x在优先队列中的优先级定义为从根结点到结点x的路径所相应的载重量Ew(即:当前扩展结点船的载重量Ew)再加上剩余集装箱的重量r之和(即:将上界Ew+r定义为结点优先级)。
优先队列中优先级最大的活结点成为下一个扩展结点。
子集树中叶结点所相应的载重量与其优先级(上界值)相同,即:该叶子结点的上界值等于当前叶子结点处船的重量Ew。
在优先队列式分支限界法中,一旦有一个叶结点成为当前扩展结点,则可以断言该叶结点所相应的解即为最优解。此时可终止算法。
https://blog.csdn.net/weixin_45591044/article/details/111089127
https://blog.csdn.net/wwj_748/article/details/9163211
https://blog.csdn.net/Luoxiaobaia/article/details/109725604
https://www.freesion.com/article/9394920015/
https://cloud.tencent.com/developer/article/1616376
https://blog.csdn.net/vxiao_shen_longv/article/details/98481660