Branch and Bound
Branch and Bound (BB) is another powerful tool in discrete optimization (platitude一则)
我们继续以背包问题来介绍这一算法。
首先考察一个naive way in solving knapsack problem:现在有 1,2,…,n这么多个物品,那么对于物品1,我可以选择或者不选择---->这就分了两个岔,对于每个岔,对于物品2我都可以选择或者不选择---->这就分了四个岔… 我们其实只需要检查所有不同的选择,也不过就(?) 2 n 2^n 2n种组合。当n比较小的时候,其实穷举就行了,但是如果n比较大…(电脑:跑你🐴呢?)
那么,有没有方法可以减小需要验证的数量呢?例如,现在某一个分叉已经只有两个物品可以选择了,而所能获得的最大价值也不过10元,远远小于某一个分叉,which has ALREADY obtained 100元。那么,这种情况下,是不是可以直接将那个继续选下去也最多不过10元的分叉给砍掉呢?
基于这样的想法,BB被提出了。Branch指的还是分叉,Bound就是用一个最大值或者最小值来作为上界/下界。当某一个分叉1的最大值小于当前某个分叉2已经取得的值,那么显然分叉1就可以被砍掉了。这或许可以大大减小我们需要验证的数量!
关于 Bound: 如何找到上界或者下界?一个常用的方法就是将 decision variables的范围扩大,比如从整数域扩展到实数域(例如 {0,1} —> [0, 1]),这样既可以保证得到了上界/下界,也可以快速地求解(Linear Optimization problem is NOT a Problem. It’s highly mature! )
The General Framework:
at a really high level, BnB is something like this: (w.l.o.g. Assume want to find the maximum of f ( x ) f(x) f(x))
- 用某种粗糙的(heuristic)的方法找出一个解