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

本文探讨了使用分支限界法解决01背包问题的方法,包括解空间树的构建、剪枝策略和最优解的求解。在案例中,设有3个物品,背包容量为30,物品重量和价值分别为(16, 15, 15)和(45, 25, 25)。通过队列式和优先队列式分支限界法,展示了如何进行剪枝以提高效率,并得到了最优解50,选择装入第二个和第三个物品。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用分支限界法求解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,装第二个和第三个物品。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值