0-1背包问题实验报告:动态规划、贪心算法、回溯法与分支限界法对比分析

0-1背包问题实验报告一:0-1背包问题给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大?在选择装入背包的物品时,对每种物品i只有两种选择,装入或者不装入背包。不能将物品i多次装入,也不能装入部分的物品i。因此,该问题被称为0-1背包问题。本次针对0-1背包问题的实验,主要使用动态规划的方法、贪心算法、回溯法以及分支限界法。测试用例为:n=50,c=1000,每个物品重量为{220,208,198,192,180,180,165,162,160,158,155,130,125,122,120,118,115,110,105,101,100,100,98,96,95,90,88,82,80,77,75,73,70,69,66,65,63,60,58,56,50,30,20,15,10,8,5,3,1,1}每个物品价值为{80,82,85,70,72,70,66,50,55,25,50,55,40,48,50,32,22,60,30,32,40,38,35,32,25,28,30,22,50,30,45,30,60,50,20,65,20,25,30,10,20,25,15,10,10,10,4,4,2,1}下面将分别谈论。二:动态规划法1:基本思想:动态规划算法的基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。其经过分解得到的子问题往往不是相互独立的,可以用一张表来记录所有已解决的子问题的答案,而不论该子问题以后是否会用到。从而使得子问题避免重复计算。2:设计步骤:动态规划算法适用于解最优化问题,通常可按以下几步设计:(1) 找出最优解的特性,并刻画其结构特征。(2) 递归地定义最优值。(3) 以自底向上的方式计算出最优值。(4) 根据计算最优值时得到的信息,构造最优解。步骤(1)~(3)是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤(4)可以省去。若需要求出问题的最优解,则必须执行步骤(4)。3:动态规划算法在0-1背包问题中的应用分析0-1背包问题是一个特殊的整数规划问题。其最优子结构性质具有下述性质:当从最优解中剔除掉一个物品的时候,相应的背包剪掉这个物品的重量的剩余容量构成次级0-1背包子问题,此时在最优解中剩余下的物品应该为这个次级0-1背包问题的最优解。可以递归的定义这一子结构。可以使用二维矩阵来存储计算子结构背包的最优值。程序单列。实验结果为:3090。4:算法分析使用动态规划算法,需要O(nc)的计算时间,时间复杂度与物品数量和背包容量成比例。大量使用的二维矩阵,也使得整个程序的空间规模较大。在能够较为准确的得到解的同时,该算法存在着到背包容量很大,算法需要的计算时间较多的问题。三:贪心算法1:算法思路:贪心算法在解决问题的时候,总是做出当前看来是最好的选择,并不从整体上最优加以考虑。在做出局部意义上的最优选择之后,我们能得到一个近似的最优解,即使它不一定是最优的,但在要求不那么精确地情况下,往往能较为便捷地得到结果。2:基本要素:可以用贪心算法求解的问题一般具备两个重要的性质:(1) 贪心选择性质:所求问题的整体最优解可以通过一系列局部最优的选择来达到。(2) 最优子结构性质:一个问题的最优解包含着其子问题的最优解。3:算法设计:在解0-1背包问题的过程中,借鉴了贪心算法解背包问题的过程。(1) 计算每种物品单位重量的价值Vi/Wi;(2) 依贪心选择策略,按照物品性价比的高低依次将物品装入背包。(3) 当剩余背包容量不足以装入尚未装入的最高性价比的物品,则选择次优物品。直到背包无法再装为止。实验结果为:3087。4:算法分析:使用贪心算法,时间复杂度为O(n*logn)。优于动态规划算法,空间占有也较动态规划少。其缺点在于最终解并不是最优解。四:回溯法1:基本思想:首先明确问题的解空间,可以用一定的方法组织起来,使得回溯法能够方便地搜索整个解空间。例如是一颗解空间树。从根节点出发,以深度优先方式搜索解空间。这个开始的节点成为活结点,同时也成为当前的扩展节点。从当前节点,搜索向纵深方向移至一个新节点。是新节点成为活结点和可扩展节点。如果当前的扩展节点不能再向纵深方向移动,则当前扩展节点成为死结点。此时,往回移动到最近的活结点,使之成为扩展节点。直到整个解空间无活结点。找出解空间中满足约束条件的所有解。比较得出最优。可以使用剪枝函数使得不符合要求的子树被减去。2:算法设计:(1) 以物品单位性价比排序,构建状态树(2) 从根节点开始,进入左子树,搜索子空间树,计算当前价值;(3) 计算右子树上界,当右子树有可能包含最优解时,进入右子树,搜索子空间;否则剪去右子树(4) 重复(2)(3),直到整个解空间搜索完毕。实验结果:3090。3:算法分析:回溯法在最坏的情况下有O(25)个右儿子节点需要计算上界,计算上界的时间为O(n),所以回溯法时间复杂度为O(n*2W)。需要栈来存储中间值,故空间复杂度大。其优点在于适应性好,大多数问题都能使用这种方法。但是随着问题规模的扩大,也会使得问题处理起来的时间花销增大,故而构建良好的剪枝函数成为回溯法的关键所在。五:分支限界法1:基本思想:类似于回溯法,也是基于解空间树的方法。求解目标为找出满足约束条件的一个解,记在某种意义下的最优。以广度优先或以最小耗费优先的方式搜索解空间。在扩展节点处,先生成其所有儿子的分支,再从当前活结点表中选择下一个扩展节点。为了有效地选择,在每一活结点处,计算一个函数值,据此从当前活节点表中选出最有利的节点作为扩展节点,使搜索向解空间树上有最优解的分支推进。2:算法设计:(1) 各物品按性价比有大到小排序,构建解空间树;(2) 由根节点出发,检查当前左儿子结点的可行性,如果可行,将它加入到子集树和活动队列中;(3) 仅当右儿子结点满足上界约束,才将它加入子集树和活结点优先序列。(4) 重复(2)(3)至整个解空间结束。实验结果:3087。3:算法分析:分支限界法运用优先队列扩展了活结点的运行空间。使得算法在广域中可以较为快捷的剪掉冗余枝。整个解空间较之于回溯法是快速聚类的,故其时间复杂度较回溯法优,但在空间上却需要相当一部分的处理能力。对于离散的最优化方法较为适宜,这是分支法好处,却也是其局限所在。
























