回溯算法——01背包问题.docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

实验目的是使学生消化理论知识,加深对讲授内容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。

上机实验一般应包括以下几个步骤:

、准备好上机所需的程序。手编程序应书写整齐,并经人工检查无误后才能上机。

、上机输入和调试自己所编的程序。一人一组,独立上机调试,上机时出现的问题,最好独立解决。

、上机结束后,整理出实验报告。实验报告应包括:题目、程序清单、运行结果、对运行情况所作的分析。

一、实验目的与要求

实验八 回溯算法——0-1背包问题

熟悉0-1背包问题的回溯算法。

掌握回溯算法。二、实验内容

用回溯算法求解下列“0-1背包”问题:

给定n种物品和一个背包。物品i的重量是w,其价值为v,背包的容量为C。问应如

i i

何选择装入背包的物品,使得装入背包中物品的总价值最大?

三、实验步骤

理解算法思想和问题要求;

编程实现题目要求;

上机输入和调试自己所编的程序;

验证分析实验结果;

整理出实验报告。

实验提示:

回溯算法求解0-1背包问题分析

回溯法通过系统地搜索一个问题的解空间来得到问题的解。为了实现回溯,首先需要针

对所给问题,定义其解空间。这个解空间必须至少包含问题的一个解(可能是最优的。)然

后组织解空间。确定易于搜索的解空间结构。典型的组织方法是图或树。一旦定义了解空间的组织方法,即可按照深度优先策略从开始结点出发搜索解空间。并在搜索过程中利用约束函数在扩展结点处剪去不满足约束的子树,用目标函数剪去得不到最优解的子树,避免无效搜索。用回溯法解题的步骤:

针对所给问题定义问题的解空间;

确定易于搜索的解空间结构;

以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效的搜索。

0-1背包问题的数学描述为:n个物品,物品i的重量是w、其价值为v,其中0≤i≤

i i

n-1,背包的容量为C。用x

i

表示物品i被装入背包的情况,如果物品Pi被选中,则x=1;

i

否则x=0。求满足目标函数F?max?n?1x?v

和约束方程?n?1x?w

?C的物品组合(x,

x,x

i

,…,x

i i

i?0

)与相应的总价值V。

i i 0

i?0

1 2 n-1

针对所给问题定义问题的解空间。

根据上述0-1背包问题的数学描述,解向量可以表示成X={x,x,x,…,x )|x=1

0 1 2 n-1 i

或x=0}。若n=3,则此0-1背包问题的解空间为{(0,0,0),(0,0,1),(0,1,0),

i

(0,1,1),(1,0,0),(1,0,1),(1,1,0),(1,1,1)}。

确定易于搜索的解空间结构。

可以用树的形式将解空间表达出来。树中从第i层到第i+1层的边上的值表示解向量中

x的取值,并假定第i层的左子树描述物品Pi被装入背包的情况,右子树描述物品Pi被拒

i

绝的情况。则该0-1背包问题的状态空间树就表示为一棵高度为n的完全二叉树(如图l所

示)。从根结点到叶子结点的任一路径就对应解空间中的一个解向量。

以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效的搜索。

构造出问题的状态空间树以后,就可以从其根结点出发搜索解空间,即决定每个物品的取舍。为了使目标函数的值增加最快,可以优先选择价值最大的物品装入背包,然后是价值量次之的物品,……,直至背包装不下为止。但是,如果所选择的物品重量很大,使得背包载重量消耗速度太快,以至后续能装入背包的物品迅速减少,使得继续装入背包的物品在满足了约束方程的要求以后,无法达到目标函数的要求。因此,最好优先选择那些既使目标函数的值增加最快。又能使背包载重量消耗速度较慢的物品装入背包。为了达到这个目的,首先把所有物品按价值重量比的非增顺序排列,然后按照这个顺序进行搜索。在装包过程中,要尽量优先选择价值重量比较高的物品装入背包。表现在搜索过程中,就是要尽量沿着左子树结点前进。当不能继续前进时(假设该结点为T),就得到问题的一个部分解,并把搜索转移到右子树。估计由该部分解所能得到的最大价值,即结点T的上限。可以用贪婪算法处理剩余物品:将按照价值重量比非增顺序排列的剩余物品依次装入背包,至无法完全装入下一个物品时,就将该物品的一部分装满背包。这样就可以得到一个上限。如果该值为当前最优值:继续由右子树向下搜索,扩大部分解,直至找到可行解;保存可行解,并把可行解的值作为当前最优值,向上回溯,寻找其他可行解;若该值小于当前最优值:丢弃当前正在搜索的部分解,向上回溯。反复使用此方法,直至搜索完整

文档评论(0)

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

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

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

1亿VIP精品文档

相关文档