一、问题描述:
假定有N=4 件商品,分别用 A、B、C、D 表示。每件商品的重量分别为3kg、2kg、5kg 和 4kg,对应的价值分别为66元、40元、95元和 40元。
现有一个背包,可以容纳的总重量为9kg,问:如何挑选商品,使得背包里商品的总价值最大?
注意:0-1背包:1件商品,要么选,要么不选。
目标:在不超过背包重量的前提下,选择一种组合方式,使其价值最大。
每个商品只有两种选择方案:
1、选 2、不选
分别用1,0表示。
我们想到用二叉树的结构该组合问题。
二叉树的深度就是商品的个数,每一层都是对其中一些商品进行判断。
左子树:选该商品。右子树:不选该商品。
二叉树将排列组合问题转换成道路选择问题。
每个叶子结点就是一种商品组合方式。
首先去掉4个超出背包重量的,然后就可以挑选出价值最大的(蓝色部分)
当n较大时,如何提升效率,用最少的次数快速找到最优的道路
1.剪枝。
如图,到蓝色结点的位置,A,B都选择,这一点是确定的。
如果A和B的重量>背包重量,后面的选择情况不用再看,直接剪掉
2.从每个结点出发总是分为两条道路,如果我们可以在每一个结点设置一个路标,提示向左走还是向右走,也会提高效率。
3.我们沿着某一条道路前进,到达某一结点时,发现此路不好,此时有没有一种方案可以快速引导我们切换到另一条道路,这样可以大大减少道路试探次数。
二、分支限界法(Branch and Bound)
分支:分为不同的道路
限界:计算每个结点总价值的上界。
每个结点将道路分为两部分:已经确定的和未确定的。
已确定的:按照商品如实确定重量总和和价值总和。
未确定的:按照贪心法,优先选择单位重量价值最高的。
当背包剩余重量小于商品的总重量:假定此时可以将商品的一部分放入背包。
第一,如实计算已选道路
第二,贪心法计算未知道路
分支限界法的具体步骤:
每次从某一结点出发,分别计算其左孩子右孩子节点的最优价值
并将结果存入一个列表中
然后扫描该列表,弹出那个最大最有价值的结点,作为新结点重复上面的步骤。
直到弹出的最大最优价值为叶子结点。
此叶子结点即为获得背包最大价值的最优组合方式。
因为它比其它道路最优的道路还要好,那么它一定大于其他道路的真实价值。