分支限界算法(Branch&Bond)
- 常用于求解优化问题
- 穷举所有的“状态”,利用上界或者下界来提高搜索效率
常用术语
- 活结点,刚被生成,子节点尚未生成的节点
- 当前节点(E-node):正在展开的节点
- 死结点:不需要展开的节点。(被剪枝函数剪掉的树根)
展开方式
- FIFO B_B
- FILO B_B
- LC B_B(Least Cost)
LC B_B
- 在状态树T上进行搜索
- 每个节点N都有值函数C(N),为优化的目标
由两个函数维护活结点
- least 选择展开哪个节点
- add 把子节点加到least选中的那个活结点上
注意:LC B_B 可能会用来求解最大问题,各种优化问题的评判逻辑各异,不能局限于least的字眼
剪枝
- 可行与否:如果某条路径(Path)代表的解不可实现,必然要被剪除。
- 落后与否:若存在一对可行节点A,B。存在以下情况:从A出发所能获得的最优值BestA落后于B出发可得到的最优值BestB,那么就可以认为B领先A,则A将被剪枝。
- 精确计算BestN(MaxN或MinN)存在一定的困难,所以通常以近似计算获得。
- 通常情况下 MaxN>MinN>NowN(N当前的C值)成立。
- 在最大化问题中,我们通常以NowB>MaxA作为评判标准。
- 在最小化问题中,我们通常以NowA>MaxB或者NowA>MinB为评判标准(根据实际问题选择合适的形式)。
优先级
作为一种“相对高效”的穷举算法,我们自然选择最有潜力的活结点作为下一个E-Node展开。在这一思想的指导下,我们选择展开BestN(MaxN或者MinN)最优的节点作为下一个E-Node。
运作LC B_B的Routine
- 展开树根,得到第一层全部子节点
- 在子节点中进行剪枝(可行,落后),可行的叶子节点转4
- 在2后剩余的活结点中选择优先级最高的展开,转2
- 记录对应的Path,存储C值
- 遍历完毕,给出最优解
总的来说,就是“选择E-Node,展开子节点,剪枝,再选择下一个E-Node”,环往复,直到全部可行路径都到达叶子节点。