当前位置:   article > 正文

回溯法之0-1背包问题(算法思路解析)_用回溯法求解0-1背包问题,假如4件物品(按照价值密度排序)的重量与价值分别是:w={5

用回溯法求解0-1背包问题,假如4件物品(按照价值密度排序)的重量与价值分别是:w={5

回溯法解0-1背包问题

问题描述

输入:n件物品的价值和重量{<w1, v1>, <w2, v2>,…, <wn, vn>}和背包容量C

输出:(x1, x2, …, xn),xi∈{0, 1}满足放入的物品重量小于背包容量的前提下价值最大

优化目标:价值最大化

实例讲解

假设:
物品个数为 n=3
背包的容量为 C=30
物品的重量分别为 w={16,15,15}
物品的价值分别为 v={45,25,25}

1.此时的解空间可以为(x1, x2, x3)的所有可能取{(0,0,0), (0,0,1), (0,1,0), (0,1,1), (1,0,0), (1,0,1), (1,1,0), (1,1,1)}

2.构造解空间树:

在这里插入图片描述
3.遍历解空间(深度优先)

从根往下遍历时,要求每次经过节点都计算此时是否满足容量的条件,当某个分支可以满足重量要求时,记录它的价值总量,以便最后选择最好的价值量。

例如第一次遍历时,经过x1=1,x2=1时,此时重量为31,超过了背包容量,那么我们回溯到x1=1处,并使用剪枝算法的约束函数剪去x2=1这个分支,并遍历x2=0这个分支,再从x2往下拓展x3=1或者0的情况。

概念介绍

扩展结点:一个正在产生儿子的结点称为扩展结点

活结点:一个自身已生成但其儿子还没有全部生成的节点称做活结点

死结点:一个所有儿子已经产生的结点称做死结点

深度优先的问题状态生成法:如果对一个扩展结点R,一旦产生了它的一个儿子C,就把C当做新的扩展结点。在完成对子树C(以C为根的子树)的穷尽搜索之后,将R重新变成扩展结点,继续生成R的下一个儿子(如果存在)

回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(bounding function)来处死那些实际上不可能产生所需解的活结点,以减少问题的计算量。具有限界函数的深度优先生成法称为回溯法

算法扩展-一般背包问题

在0-1背包中,物品不可拆分,但在一般背包中我们可以将物品拆分,例如将物品1的0.1部分装入背包。

解题思路:

  1. 将物品按照单位重量价值排序。
  2. 先装价值高的,一直到背包装满为止。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/333058
推荐阅读
相关标签
  

闽ICP备14008679号