分支限界法求解0-1背包问题。

一、问题描述:

假定有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)

分支:分为不同的道路

限界:计算每个结点总价值的上界。

每个结点将道路分为两部分:已经确定的和未确定的。

已确定的:按照商品如实确定重量总和和价值总和。

未确定的:按照贪心法,优先选择单位重量价值最高的。

当背包剩余重量小于商品的总重量:假定此时可以将商品的一部分放入背包。

第一,如实计算已选道路

第二,贪心法计算未知道路

以该粉色结点为例

分支限界法的具体步骤:

每次从某一结点出发,分别计算其左孩子右孩子节点的最优价值

并将结果存入一个列表中

然后扫描该列表,弹出那个最大最有价值的结点,作为新结点重复上面的步骤。

直到弹出的最大最优价值为叶子结点。

此叶子结点即为获得背包最大价值的最优组合方式。

因为它比其它道路最优的道路还要好,那么它一定大于其他道路的真实价值。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值