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

使用分支限界法求解01背包问题,3个物品,重量和价值,背包容量

(1)画出解空间树

(2)Say如何剪枝

(3)求出最优解


假设物品的个数n=3,背包容量W = 30, 重量w =(16,15,15),价值v =(45,25,25)



(1)队列式(FIFO)分支限界法:按照队列先进先出(FIFO)原则选取下一个结点为扩展结点。
(2)优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的结点成为当前扩展结点。


(1)画出解空间树

迷惑点解空间树书上给的是一个排列树,把超重的情况也画出来了,其实是无用功,那么如果考虑超重的话,就在D的时候就已经超重了,就不需要画出来,但是书上却把它称之为搜索空间树,所以我们画解空间树应该画哪种呢?

a.队列分支限界法

b.优先队列分支限界法:当前价值高的节点优先

 

(2)Say如何剪枝

限界函数代码:

void bound(NodeType &e)   //计算分支结点e的上界
{ 
int i=e.i+1;
int sumw=e.w;
double sumv=e.v;
while((sumw+w[i]<=W)&&i<=n)
{
  sumw+=w[i];
  sumv+=v[i];
  i++;
}
if(i<=n)               //余下物品只能部分装入
   e.ub=sumv+(W-sumw)*v[i]/w[i];
else                   //余下物品全部可以装入
   e.ub=sumv; 
}

 剪枝:如果超重需要剪枝,如果这个结点对应的上界不比当前最优值更大,则说明相应的子树不含问题的最优解,因此该节点也需要剪枝。

 (3)求出最优解

 

 

由图可知最优解为50,装第二个和第三个物品。

  • 11
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
分支限界算法是一种常用于解决组合优化问题的算法,而0-1背包问题是其中的一个经典问题。Java语言通过利用分支限界算法来设计0-1背包问题算法。 0-1背包问题的描述是:有一组物品,每件物品都有自己的重量和价值。现在有一个背包,它能够承载的重量是固定的。需要从这组物品中选择一部分放入背包中,以使得背包的总价值最大化,同时不能超过背包的承载重量。 Java中通过利用分支限界算法来解决0-1背包问题算法步骤如下: 1. 创建一个优先队列,用于存放待扩展的子节点,其中节点的优先级按照价值密度从大到小排序。价值密度定义为单位重量的价值,即价值除以重量。 2. 初始化一个根节点,设置初始状态为背包为空,当前价值为0,当前重量为0。 3. 将根节点加入优先队列。 4. 从优先队列中取出优先级最高的节点,判断该节点是否为叶子节点。如果是叶子节点,则将其价值与当前最大价值进行比较,如果大于当前最大价值,则更新当前最大价值。 5. 如果不是叶子节点,则根据节点的当前状态,扩展出两个子节点,一个是将下一个物品放入背包中,另一个是不放入。 6. 对于每个子节点,计算其价值下界。价值下界通过节点的当前价值加上将剩余物品按照价值密度从大到小依次放入背包的价值。如果价值下界小于当前最大价值,则不需要对该子节点进行扩展。 7. 将扩展出来的子节点加入优先队列。 8. 重复步骤4至步骤7,直到优先队列为空。 9. 输出当前最大价值即为背包问题的最优解。 这样,利用分支限界算法,就可以在Java中设计出解决0-1背包问题算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值