回溯法和分支限界法解决0-1背包题要点.pdf

回溯法和分支限界法解决0-1背包题要点.pdf

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
0-1 背包问题 计科 1 班 朱润华 2012040732 方法 1:回溯法 一、回溯法描述: 用回溯法解问题时, 应明确定义问题的解空间。 问题的解空间至少包含问题的一个 (最 优)解。对于 0-1 背包问题,解空间由长度为 n 的 0-1 向量组成。该解空间包含对变量的所 有 0-1 赋值。例如 n=3 时,解空间为: {(0 ,0,0 ),(0 , 1, 0),(0 ,0 ,1),(1,0 ,0 ), (0 , 1, 1),(1, 0, 1),(1, 1, 0),(1, 1, 1)} 然后可将解空间组织成树或图的形式, 0-1 背包则可用完全二叉树表示其解空间给定 n 种物品和一背包。 物品 i 的重量是 wi ,其价 值为 vi ,背包的容量为 C。问 : 应如何选择装入背包的物品,使得装入背包中物品的总价值 最大 ? 形式化描述:给定 c 0, wi 0, vi 0 , 1 ≤i ≤n. 要求找一 n 元向量 (x1,x2, …,xn,), xi ∈{0,1}, ? ∑ wi xi ≤ c, 且∑ vi xi 达最大 . 即一个特殊的整数规划问题。 二、回溯法步骤思想描述: 0-1 背包问题是子集选取问题。 0-1 背包问题的解空间可以用子集树表示。在搜索解空 间树时, 只要其左儿子节点是一个可行节点, 搜索就进入左子树。 当右子树中有可能含有最 优解时,才进入右子树搜索。否则,将右子树剪去。设 r 是当前剩余物品价值总和, cp 是 当前价值; bestp 是当前最优价值。当 cp+r=bestp 时,可剪去右子树。计算右子树上界的 更好的方法是将剩余物品依次按其单位价值排序, 然后依次装入物品, 直至装不下时, 再装 入物品一部分而装满背包。 例如: 对于 0-1 背包问题的一个实例, n=4,c=7,p=[9,10,7,4],w=[3,5,2,1] 。这 4 个物 品的单位重量价值分别为 [3,2,3,5,4] 。以物品单位重量价值的递减序装入物品。先装入物 品 4,然后装入物品 3 和 1. 装入这 3 个物品后, 剩余的背包容量为 1,只能装 0.2 的物品 2。 由此得一个解为 [1,0.2,1,1] ,其相应价值为 22。尽管这不是一个可行解,但可以证明其价 值是最优值的上界。因此,对于这个实例,最优值不超过 22。 在实现时,由 Bound 计算当前节点处的上界。类 Knap 的数据成员记录解空间树中的节 点信息, 以减少参数传递调用所需要的栈空间。 在解空间树的当前扩展节点处, 仅要进入右 子树时才计算上界 Bound, 以判断是否可将右子树剪去。进入左子树时不需要计算上界,因 为上界预期父节点的上界相同。 三、回溯法实现代码: #include stdafx.h #include iostream using namespace std; templateclass Typew,class Typep class Knap { templateclass Typew,class Typep friend Typep Knapsack(Typep [],Typew [],Typew,int); private: Typep Bound(int i); void Backtrack(int i); Typew c; // 背包容量 int n; // 物品数 Typew *w; // 物品重量数组 Typ

文档评论(0)

tianya189 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档