ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:118.75KB ,
资源ID:28316122      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28316122.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(背包问题的多种解法.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

背包问题的多种解法.docx

1、背包问题的多种解法问题描述0/1 背包问题 :现有n种物品,对1=iC(n 1,W),说明第n个物品被装入了背包 中,前n-1个物品被装入容量为 W wn的背包中;否则,第 n个物品没有装入背包中,前 n-1 个物品被装入容量为 W 的背包中。依此类推,直到确定第一个物品是否被装入背包为止。由此,我们可以得到如下的函数:0C(i, j) C(i 1, j)1, j j wiC(i, j) C(i 1,j)根据动态规划函数,用一个 (n 1) (W 1)的二维数组C存放中间变量,Cij表示把前 i 个物品装入容量为 j 的背包中获得的最大价值。设物品的重量存放在数组 wn中,价值存放在数组 vn

2、中,背包的容量为 W,数组Cn 1W 1存放迭代的结果,数组 xn 存放装入背包的物品,动态规划解 0-1 背包问题的源代码在文件夹动态规划法中。回溯法分析:用回溯法解 0_1 背包问题时, 会用到状态空间树。 在搜索状态空间树时, 只要其左儿子结点是一个可行结点,搜索就进入其左子树。当右子树有可能包含最优解时才进入右子树搜索,否则将右子树剪去。设 r 是当前剩余物品价值总和; cp 是当前价值; bestp 是当前 最优价值。当cp+r E)estp时,可剪去右子树。计算右子树中解的上界可以用的方法是将 剩余物品依其单位重量价值排序,然后依次装入物品,直至装不下时,再装入该物品的一 部分而装

3、满背包。由此得到的价值是右子树中解的上界,用此值来剪枝。为了便于计算上界, 可先将物品依其单位重量价值从大到小排序, 此后只要顺序考察各 物品即可。在实现时,由 MaxBoundary 函数计算当前结点处的上界。它是类 Knap 的私 有成员。 Knap 的其他成员记录了解空间树种的节点信息,以减少函数参数的传递以及递 归调用时所需要的栈空间。在解空间树的当前扩展结点处,仅当要进入右子树时才计算上 界函数 MaxBoundary ,以判断是否可以将右子树减去。进入左子树时不需要计算上界, 因为其上界与父结点的上界相同。在调用函数 Knapsack 之前, 需要先将各物品依其单位重量价值从达到小

4、排序。 为此目 的,我们定义了类 Objiect 。其中, 运算符与通常的定义相反,其目的是为了方便调用 已有的排序算法。在通常情况下,排序算法将待排序元素从小到大排序。在搜索状态空间树时, 由函数 Backtrack 控制。 在函数中是利用递归调用的方法实现了 空间树的搜索。具体的代码见回溯法文件夹。限界分支法:在解 0-1 背包问题的优先队列式界限分支法中,活结点优先队列中结点元素 N 的优先级由该结点的上界函数 MaxBoundary 计算出的值 uprofit 给出。该上界函数在 0-1 背包 问题的回溯法总已经说明过了。 子集树中以结点 N 为根的子树中任一个结点的价值不超过 N.p

5、rofit 。因此我们用一个最大堆来实现活结点优先队列。堆中元素类型为 HeapNode,其私有成员有 uprofit,profit,weight,level, 和 ptr 。对于任意一个活结点 N , N.weight 是 活结点 N 所相应的重量; N.profit 是 N 所相应的价值; N.uprofit 是结点 N 的价值上界, 最大堆以这个值作为优先级。子集空间树中结点类型为 bbnode 。在分支限界法中用到的类 Knap 与 0-1 背包问题的回溯法中用到的类 Knap 很相似。 他们的区别是新的类中没有了成员变量 bestp ,而增加了新的成员 bestx 。 Bestxi=

6、1, 当 且仅当最优解含有物品 i。在类 Knap 中有四个函数:(1 ) 上界函数 MaxBoundary(), 计算节点所对应价值的上界;(2 ) 函数 AddLiveNode() 是将一个新的活结点插入到子集树和优先队列中;(3 ) 函数 MaxKnapsack() 实施对子集树的优先队列式分支界限搜索。其中假定物 品依其单位价值从大到小已经排好序。 相应的排序过程会在算法的预处理部分 完成。算法中 E 是当前扩展结点; cw 是该结点的重量; cp 是该结点的价值; up 是价值上界。算法的 while 循环不断扩展结点,直到子集树的一个叶结点 成为扩展结点为止。 此时优先队列中所有活

7、结点的价值上界均不超过该叶结点 的价值。因此该叶结点相应的解为问题的最优解。在 while 循环内部,算法首先检查当前扩展结点的左儿子结点的可行性。如果 该左儿子结点是可行结点,则将它加入到子集树和活结点优先队列中。当前扩 展结点的右儿子结点一定是可行结点, 仅当右儿子结点满足上界约束时才将它 加入子集树和活结点优先队列。(4 ) 函数 Knapsack() 完成对输入数据的处理。其主要任务是将各物品依其单位重 量价值从达到小排好序。然后调用函数 MaxKnapsack() 完成对子集树的优先 队列式分支限界搜索。具体的实现代码在文件夹分支限界法中。三、 时 空效率分析穷举法:对于一个有 n

8、个元素的集合,其子集数量为 2n ,所以,不论生成子集的算法效率有 多高,穷举法都会导致一个 O(2n) 的算法。递归法:在递归法的算法体中有一个 if 判断中出现了两次递归调用比较大小所以它们之间的递归关系式可以大体表示为: T(n) 2T(n 1) C,其中T(n)表示递归法的时间复杂度, C是常数。求解递归方程可以知道 T(n)的量级为o(2n)。所以递归法解0-1背包问题的 时间复杂度为O(2n)。递归法是耗费空间最多的算法,每次递归调用都需要压栈,导致 栈的使用很频繁。动态规划法:由于函数 Knapsack 中有一个两重 for 循环,所以时间复杂度为 O(n+1)x(m+1). 空

9、间复复杂度也是 O(n+1)x(m+1) ,即 O(nm ).回溯法:由于计算上界的函数 MaxBoundary 需要O(n)时间,在最坏情况下有 O(2n)个右儿 子结点需要计算上界,所以解 0-1 背包问题的回溯法算法 BackTrack 所需要的计算时 间为 O(n2n).限界分支法:在使用限界分治法时, 就是使用更好的限界剪枝函数使得不必要的解被剔除, 但是在最坏情况下的解仍然是和回溯法是相同的。本算法中也是用到了计算上界的函数MaxBoundary 需要O(n)的时间,而且在最坏情况下有 O(2n)个结点需要计算上界,所以在最坏情况下的时间复杂度仍然为 O(n2n) 。四、运行结果递

10、归法输出结果:题 递归法J曲容重Z和物詁个牧W :C;u KXAdnni n SstrartorKDekto fA 算法恨IE痕饭 呃 502 00 王母 0.1 苜包口弧 谴归曲Knawxwe0 10植输入每个物吕的重量缶)和物品的价值3):H 3412 3224昭16 67b b49 3S3 4G21 56IS419 ?9背包的最优辭为:225最优解条禅下选择的脊剋为二孟容臺*节和物器个数(町=动态规划法输出结果:4b006Bi3466和价值32 3b的容量()和物詁个数叶丄肯10軒次输入每个物品的重量(- 0 34 12 竝 24 Sb lb 67 b ! 胃赳的最优解为:P2&杲忧解条

11、件T的囲罩的背包九1 & a 1莊此过程中用刮的Bn “ 1数组数据为 0U甘回溯法输出结果:p肯包何题一一回砸i 淸辅入皆R容量5: 植输入物品曲个教:楕输人切1界价喈:34 32 盹 t7 &4 32 45 血 7& 请捕入物品的重# =姑 1H 昭 “ 乎 35 21 18 1?K藝g值为 B8tp Sf/oC:UsersAdm n istrator De? kto pfEit120030502 DO J3 王母0.1 苜包口亚叵滯熱B氛分枝限界法输出结果:I C ;U sersXAdrrn n i5tratorDe?ktc pjfEJlE1SZC030602 00 王母口丄苜包冃左袁股

12、齐洼“ I 1=1 丨同背包何题一一分核限网i肾辆入皆包曲容量(c)糸威品个数 M : 18 ?障一钦输入每个物品的重量G)和价值 4 Li ?* $4 9B 12V 136 4LG 14背包的最优解为:3Q最优解条样丁的隽擇的背旦为3 110 0 0请输入背包的容量(C)和物品个数(町,五、分析输出结果第一组:背包容量:18 ;物品数目:7;每个物品重量为:11 2489610 ;每个物品价值为:7 881213414。第二组:背包容量:50 ;物品数目:10;每个物品重量为:812241669 35 2118 19 ;每个物品价值为:343256675432 45 5646 70。(但是可

13、能是算法设计时的冋四种实现的算法中,只有回溯法没能够得到预期的最优解。题,其实回溯法是穷举法的变形,肯定能够得到最优解的,这里是我设计函数的问题。 从递归法的输出可知,它的结果就是我们想要的最优解)。从时间复杂度和空间复杂度分析可知, 动态规划法的时间复杂度是最小的, 但是同时它的空间复杂度又是最大的。 这里就可以看出在设计算法的过程中要考虑它们的平衡问题。 在时间要求比较快的情况下,我们就可以选择动态规划法;在空间要求比较高时,我们就可以使用穷举法或是分枝限界法等其他改进的穷 举法。各种算法在解背包问题时的比较如下表所示:算法名称时间复杂度优点缺点改进穷举法0(2n)最优解速度慢剪枝递归法0

14、(2n)最优解空间消耗大用数组存动态规划法O(nm)最优解速度慢递归方程求解贪心法O(n log 2 n)不疋疋最优解速度快可以作为启发回溯法O( n2n)最优解速度慢改进剪枝分枝限界法O( n2n)最优解速度慢优化限界函数从计算复杂性理论看,背包问题是NP完全问题。半个多世纪以来,该问题一直是算法 与复杂性研究的热门话题。通过对 0-1背包问题的算法研究可以看出,回溯法和分枝限界法等可以得到问题的最优解, 可是计算时间太慢; 动态规划法也可以得到最优解, 当m 2n时,算法需要 O(n2n)的计算时间,这与回溯法存在一样的缺点一一计算速度慢;采用贪心 算法,虽然耗费上优于前者,但是不一定是最优解。目前,以上几种方法中回溯法、动态规 划法、贪心法都广泛地应用到不同的实际问题中,并在应用中不断地改进。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1