背包问题(1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
背包问题报告
小组成员:张灿、吴雪涛、高坤、
占强、习慧平
小组分工情况
小组成员查找资料制作ppt 编写程序讲解ppt 制作报告
张灿ⅴⅴⅴⅴⅴ
吴雪涛ⅴ
高坤ⅴⅴ
占强ⅴ
习慧平ⅴ
背包问题
一、背包问题的历史由来
它是在1978年由Merkel和Hellman提出的。它的主要思路是假定某人拥有大量物品,重量各不同。此人通过秘密地选择一部分物品并将它们放到背包中来加密消息。背包中的物品中重量是公开的,所有可能的物品也是公开的,但背包中的物品是保密的。附加一定的限制条件,给出重量,而要列出可能的物品,在计算上是不可实现的。背包问题是熟知的不可计算问题,背包体制以其加密,解密速度快而其人注目。在解决大量的复杂组合优化问题时,它常常作为一个子问题出现,从实际的观点看,许多问题可以用背包问题来描述,如装箱问题,货仓装载,预算控制,存储分配,项目选择决策等,都是典型的应用例子。随着网络技术的不断发展,背包公钥密码在电子商务中的公钥设计中也起着重要的作用。然而当问题的规模较大时,得到最优解是极其困难的。但是,大多数一次背包体制均被破译了,因此现在很少有人使用它。
二、背包问题的描述
背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。相似问题经常出现在商业、组合数学,计算复杂性理论、密码学和应用数学等领域中。也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V?
三、背包问题的定义
我们有n种物品,物品j的重量为w j,价格为p j。我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W。如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题。可以用公式表示为:
maximize
subject to
如果限定物品j最多只能选择b j个,则问题称为有界背包问题。可以用公式表示为:
maximize
subject to
如果不限定每种物品的数量,则问题称为无界背包问题。
四、背包问题的研究现状
Dantzing在20 世纪50 年代首先进行了开创性的研究,利用贪婪算法求得了0-1背包问题最优解的上界。1974 年,horowitz 和salmi利用分支限界法解答背包问题,并提出了背包问题的可分性,指出了求解该问题的一条新途径。随后,balas 和zemel 提出了背包问题的“核”思想,使背包问题的研究获得了较大进展。上世纪九十年代以后,随着生物仿生技术和网络技术的飞速发展,各种模拟生物物理规律的并行近似算法不断涌现,例如遗传算法己经在0/1背包问题上得到较好的应用,蚂蚁算法、粒子群算法等仿生算法也在组合优化问题
中得到了很好的应用。
五、求解0-1背包问题常见方法
传统求解该问题的方法可以概括为精确算法和近似算法,其中精确算法有动态规划法、回溯法、分支限界法等,近似算法有遗传算法、贪婪法、粒子群算法、蚁群算法等,由于精确算法的时间复杂性和空间复杂性等缺点,近年来利用近似算法求解背包问题成为重点。
5.1精确算法
5.1.1回溯法
回溯法的基本思想是在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树,其用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。用回溯法求解0-1 背包问题是按照物品的单位价值从大到小排序,计算当前节点的上界,搜索左子树。只有当右子树包含可行解时才搜索右子树。剪去右子树的条件是当前价值加上剩余物品的总价值小于当前的最优总价值时,不需搜索右子树,可将右子树剪去。回溯法用一定的剪枝进行优化,算法的时间复杂度为o(n2n), n为物品个数。
5.1.2动态规划法
动态规划法是上世纪50年代Richard Bellman创建的解决多阶段决策过程最优化的一种数学方法,即把多阶段决策问题变换为一系列相互联系单阶段问题,然后逐个加以解决。它的特点是解决多阶段、离散性问题。动态规划算法的基本思想是把原问题分解成一系列子问题,然后从这些子问题中求出原问题的解。对一个负重能力为 C 的背包,如果选择装入第i 种物品,那么原背包问题就转化为
负重能力为C-ci的子背包问题。动态规划算法是一种经典的背包问题求解算法,其原理简单,算法思路清晰,易于实现。动态规划算法虽然高效,但是对于规模较大的问题它不是一个理想的算法,主要原因就是它的维数障碍,即计算和存储量的需要对于状态空间和决策空间的维数的增长呈指数增长关系。动态规划算法的时间复杂度为o(min(n·C,2^n)),其中n 为物体的个数,C为背包负重。
精确算法的优点是当问题规模较小时一定可以求得最优解,缺点是当问题规模较大时因计算量太大而无法实现。所以一些学者提出了各种近似算法来解决精确算法求解背包问题时的时间复杂性和空间复杂性难题。
5.2近似算法
5.2.1贪婪算法
贪婪算法是一种逐步构造最优解的启发式算法,其基本思想是在每一阶段它都在一定的规则下构造出当前看似最优的一个决策,决策一旦做出就不再更改。贪婪算法常以当前情况为基础作最优选择,而不考虑整体情况,所以贪婪法一般可以快速得到满意的解,因为它省去了为找最优解要穷尽所有可能而必须耗费的大量时间。虽然这种启发式的策略并不一定能够获得最优解,然而在许多情况下确能达到预期的目的。贪婪算法解决优化问题的最关键问题是制定贪婪策略。对于背包问题来说,贪婪的策略有常用的3种。它们是价值贪婪准则、质量贪婪准则和价值密度贪婪准则。每种贪婪策略都采用多步过程来完成背包的装入。在每一步过程中利用贪婪准则选择一个物品装入背包。其中采用价值密度(价值重量比pi/ci)的贪婪准则是从剩余物品中选择可以放入背包的pi/ci值最大的物品,直到超出背包容量限制装不下为止,并将未装入背包的物品编码修正为0。算法的时间复杂度为o(nlogn)。这种策略对于连续背包问题可保证得到最优解,但对于0/1背包问题不一定能得到最优解。因此出现了一些对于贪婪算法的改进方法,例如文献中提出的算法在不增加时间复杂度的基础上,保证求解质量较稳定地优于价值密度贪婪算法及价值密度改进算法。近年来还产生了贪婪法与其他算法结合的混合算法,有赵新超,杨婷婷提出的更贪心粒子群算法, 该算法对超过背包重量限制的粒子的处理方法是去掉已经装进去且性价比最差的物品,直到满足重量约束条件为止,这样在改善粒子质量的同时避免了罚函数方法中敏感的参数选择问题;对于可行粒子的处理措施是将还未装入背包且性价比最好的物品装进背包,直到不能装为止。结果表明更贪心粒子群算法无论在寻优能力、计算速度和稳定性方面都有很好的表现,非常适合于求解大规模背包问题。还有刘茜、马杰良提出的混合遗传算法,它针对遗传操作交叉和变异的过程中不符合约束条件的个体,在解码过程中引入贪婪算法优先装入价值重量比大且物品标记为1 的物品,直至背包容量限制装不下为止,通过引进贪婪算法使得遗传进化过程以良好的种子为基础进行,此外算法在变异操作和进化终止条件的设计上也进行了改进,结果表明该算法在解的质量和求解速度方面都比遗传算法有很大的改良。
5.2.2蚁群算法
蚁群算法是由意大利学者Dorigo M.等提出的一类模拟蚂蚁群体觅食行为的仿生优化算法。算法的基本思想是蚂蚁将根据信息素的多少选择走哪一条路,蚂蚁在觅食过程中会留下一种称为信息素的物质,若蚂蚁从巢穴到食物源所走的