01背包问题不同算法设计、分析与对比报告.pdfVIP

  • 100
  • 0
  • 约1.93万字
  • 约 10页
  • 2021-11-21 发布于上海
  • 举报

01背包问题不同算法设计、分析与对比报告.pdf

实验三 01 背包问题不同算法设计、分析与对比 一.问题描述 给定 n 种物品和一背包。 物品 i 的重量是 wi ,其价值为 vi ,背包的容量为 c 。 问题:应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。 说明:在选择装入背包的物品时,对每种物品 i 只有两个选择,装入背包或 不装入背包,也不能将物品装入背包多次。 二.实验内容与要求 实验内容: 1. 分析该问题适合采用哪些算法求解(包括近似解)。 动态规划、贪心、回溯和分支限界算法。 2. 分别给出不同算法求解该问题的思想与算法设计,并进行算法复杂性分 析。 动态规划: 递推方程: m(i,j) = max{m(i-1,j),m(i-1,j-wi)+vi} j = wi; m(i-1,j) j wi; 时间复杂度为 O(n). 贪心法: 算法思想:贪心原则为单位价值最大且重量最小,不超过背包最大承重量 为约束条件。 也就是说, 存在单位重量价值相等的两个包, 则选取重量较小的那 个背包。但是, 贪心法当在只有在解决物品可以分割的背包问题时是正确的。 贪 心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考 虑,它所作出的选择只是在某种意义上的局部最优选择。 用贪心法设计算法的特点是一步一步地进行, 根据某个优化测度 (可能是目 标函数,也可能不是目标函数),每一步上都要保证能获得局部最优解。每一步 只考虑一个数据, 它的选取应满足局部优化条件。 若下一个数据与部分最优解连 在一起不再是可行解时,就不把该数据添加到部分解中, 直到把所有数据枚举完,或者不能再添加为止。 回溯法: 回溯法:为了避免生成那些不可能产生最佳解的问题状态, 要不断地利用限 界函数 (bounding function) 来处死那些实际上不可能产生所需解的活结点, 以 减少问题的计算量。这种具有限界函数的深度优先生成法称为回溯法。 对于有 n 种可选物品的 0/1 背包问题,其解空间由长度为 n 的 0-1 向量组成 , 可用子集数表示。 在搜索解空间树时, 只要其左儿子结点是一个可行结点, 搜索 就进入左子树。当右子树中有可能包含最优解时就进入右子树搜索。 时间复杂度为: O(2 n ) 空间复杂度为: O(n) 分支限界算法: 首先,要对输入数据进行预处理, 将各物品依其单位重量价值从大到小进行 排列。在优先队列分支限界法中, 节点的优先级由已装袋的物品价值加上剩下的 最大单位重量价值的物品装满剩余容量的价值和。 算法首先检查当前扩展结点的左儿子结点的可行性。 如果该左儿子结点是可 行结点,则将它加入到子集树和活结点优先队列中。 当前扩展结点的右儿子结点 一定是可行结点, 仅当右儿子结点满足上界约束时才将它加入子集树和活结点优 先队列。当扩展到叶节点时为问题的最优值。 3. 设计并实现所设计的算法。 4. 对比不同算法求解该问题的优劣。 这动态规划算法和贪心算法是用来分别解决不同类型的背包问题的, 当一件 背包物品可以分割的时候, 使用贪心算法, 按物品的单位体积的价值排序, 从大 到小取即可。 当一件背包物品不可分割的时候,(因为不可分割,所以就算按 物品的单位体积的价值大的先取也不一定是最优解)

文档评论(0)

1亿VIP精品文档

相关文档