知识大全 贪婪算法之——背包问题

Posted

篇首语:我们一路走,一路被辜负,一路点燃希望,一路寻找答案。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 贪婪算法之——背包问题相关的知识,希望对你有一定的参考价值。

  在 / 背包问题中 需对容量为c 的背包进行装载 从n 个物品中选取装入背包的物品 每件物品i 的重量为wi 价值为pi 对于可行的背包装载 背包中物品的总重量不能超过背包的容量 最佳装载是指所装入的物品价值最高 即n ?i= pi xi 取得最大值 约束条件为n ?i = wi xi≤c 和xi?[ ] ( ≤i≤n)

  在这个表达式中 需求出xt 的值 xi = 表示物品i 装入背包中 xi = 表示物品i 不装入背包 / 背包问题是一个一般化的货箱装载问题 即每个货箱所获得的价值不同 货箱装载问题转化为背包问题的形式为 船作为背包 货箱作为可装入背包的物品 例 在杂货店比赛中你获得了第一名 奖品是一车免费杂货 店中有n 种不同的货物 规则规定从每种货物中最多只能拿一件 车子的容量为c 物品i 需占用wi 的空间 价值为pi 你的目标是使车中装载的物品价值最大 当然 所装货物不能超过车的容量 且同一种物品不得拿走多件 这个问题可仿照 / 背包问题进行建模 其中车对应于背包 货物对应于物品

   / 背包问题有好几种贪婪策略 每个贪婪策略都采用多步过程来完成背包的装入 在每一步过程中利用贪婪准则选择一个物品装入背包 一种贪婪准则为 从剩余的物品中 选出可以装入背包的价值最大的物品 利用这种规则 价值最大的物品首先被装入(假设有足够容量) 然后是下一个价值最大的物品 如此继续下去 这种策略不能保证得到最优解 例如 考虑n= w=[ ] p =[ ] c = 当利用价值贪婪准则时 获得的解为x= [ ] 这种方案的总价值为 而最优解为[ ] 其总价值为

  另一种方案是重量贪婪准则是 从剩下的物品中选择可装入背包的重量最小的物品 虽然这种规则对于前面的例子能产生最优解 但在一般情况下则不一定能得到最优解 考虑n= w=[ ] p=[ ] c= 当利用重量贪婪策略时 获得的解为x =[ ] 比最优解[ ]要差

  还可以利用另一方案 价值密度pi /wi 贪婪算法 这种选择准则为 从剩余物品中选择可装入包的pi /wi 值最大的物品 这种策略也不能保证得到最优解 利用此策略试解n= w=[ ] p=[ ] c= 时的最优解

  我们不必因所考察的几个贪婪算法都不能保证得到最优解而沮丧 / 背包问题是一个N P 复杂问题 对于这类问题 也许根本就不可能找到具有多项式时间的算法 虽然按pi /wi 非递(增)减的次序装入物品不能保证得到最优解 但它是一个直觉上近似的解 我们希望它是一个好的启发式算法 且大多数时候能很好地接近最后算法 在 个随机产生的背包问题中 用这种启发式贪婪算法来解有 题为最优解 有 个例子与最优解相差 % 所有 个答案与最优解之差全在 %以内 该算法能在O (nl o gn)时间内获得如此好的性能 我们也许会问 是否存在一个x (x< ) 使得贪婪启发法的结果与最优值相差在x%以内 答案是否定的 为说明这一点 考虑例子n = w = [ y] p= [ y] 和c= y 贪婪算法结果为x=[ ] 这种方案的值为 对于y≥ / 最优解的值为 y 因此 贪婪算法的值与最优解的差对最优解的比例为( ( y )/ y* ) % 对于大的y 这个值趋近于 % 但是可以建立贪婪启发式方法来提供解 使解的结果与最优解的值之差在最优值的x% (x< ) 之内 首先将最多k 件物品放入背包 如果这k 件物品重量大于c 则放弃它 否则 剩余的容量用来考虑将剩余物品按pi /wi 递减的顺序装入 通过考虑由启发法产生的解法中最多为k 件物品的所有可能的子集来得到最优解

  例 考虑n = w=[ ] p=[ ] c = 当k= 时 背包按物品价值密度非递减顺序装入 首先将物品 放入背包 然后是物品 背包剩下的容量为 个单元 剩下的物品没有一个合适的 因此解为x = [ ] 此解获得的价值为

  现在考虑k = 时的贪婪启发法 最初的子集为 子集 产生与k= 时相同的结果 考虑子集 置x 为 此时还剩 个单位的容量 按价值密度非递增顺序来考虑如何利用这 个单位的容量 首先考虑物品 它适合 因此取x 为 这时仅剩下 个单位容量了 且剩余物品没有能够加入背包中的物品 通过子集 开始求解得结果为x = [ ] 获得的价值为 若从子集 开始 产生的解为x = [ ] 获得的价值为 考虑子集大小为 和 时获得的最优解为[ ] 这个解是通过k= 的贪婪启发式算法得到的

cha138/Article/program/sjjg/201311/23595

相关参考

知识大全 贪婪算法之——货箱装船

  这个问题来自例船可以分步装载每步装一个货箱且需要考虑装载哪一个货箱根据这种思想可利用如下贪婪准则从剩下的货箱中选择重量最小的货箱这种选择次序可以保证所选的货箱总重量最小从而可以装载更多的货箱根据这

知识大全 贪婪算法之——单源最短路径

  在这个问题中给出有向图G它的每条边都有一个非负的长度(耗费)a[i][j]路径的长度即为此路径所经过的边的长度之和对于给定的源顶点s需找出从它到图中其他任意顶点(称为目的)的最短路径图a给出了一个

知识大全 贪婪算法之——拓扑排序

  一个复杂的工程通常可以分解成一组小任务的集合完成这些小任务意味着整个工程的完成例如汽车装配工程可分解为以下任务将底盘放上装配线装轴将座位装在底盘上上漆装刹车装门等等任务之间具有先后关系例如在装轴之

知识大全 贪婪算法之——二分覆蓋

  二分图是一个无向图它的n个顶点可二分为集合A和集合B且同一集合中的任意两个顶点在图中无边相连(即任何一条边都是一个顶点在集合A中另一个在集合B中)当且仅当B中的每个顶点至少与A中一个顶点相连时A的

知识大全 第 1 章 贪婪算法

  虽然设计一个好的求解算法更像是一门艺术而不像是技术但仍然存在一些行之有效的能够用于解决许多问题的算法设计方法你可以使用这些方法来设计算法并观察这些算法是如何工作的一般情况下为了获得较好的性能必须对

知识大全 贪婪算法思想

  在贪婪算法(greedymethod)中采用逐步构造最优解的方法在每个阶段都作出一个看上去最优的决策(在一定的标准下)决策一旦作出就不可再更改作出贪婪决策的依据称为贪婪准则(greedycrite

知识大全 数据结构之算法和算法分析[4]

  一个算法是由控制结构和原操作构成的其执行时间取决于两者的综合效果为了便于比较同一问题的不同的算法通常的做法是从算法中选取一种对于所研究的问题来说是基本运算的原操作以该原操作重复执行的次数作为算法的

知识大全 数据结构之算法和算法分析[5]

  ⒉空间复杂度  一个程序的空间复杂度(Spaceplexity)是指程序运行从开始到结束所需的存储量  程序的一次运行是针对所求解的问题的某一特定实例而言的例如求解排序问题的排序算法的每次执行是对

知识大全 数据结构之算法和算法分析[2]

  算法与数据结构是相辅相承的解决某一特定类型问题的算法可以选定不同的数据结构而且选择恰当与否直接影响算法的效率反之一种数据结构的优劣由各种算法的执行来体现  要设计一个好的算法通常要考虑以下的要求 

知识大全 数据结构之算法和算法分析[1]

  算法与数据结构的关系紧密在算法设计时先要确定相应的数据结构而在讨论某一种数据结构时也必然会涉及相应的算法下面就从算法特性算法描述算法性能分析与度量等三个方面对算法进行介绍  算法特性  算法(Al