使用分支限界法求解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.优先队列分支限界法:当前价值高的节点优先
文章来源:https://www.toymoban.com/news/detail-542109.html
(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,装第二个和第三个物品。文章来源地址https://www.toymoban.com/news/detail-542109.html
到了这里,关于分支限界法求0-1背包问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!