Algorithm 有序背包问题的正确性/证明
小偷可以选择要偷的Algorithm 有序背包问题的正确性/证明,algorithm,knapsack-problem,greedy,Algorithm,Knapsack Problem,Greedy,小偷可以选择要偷的n物品,但只有一个背包,容量为 取M重量。每个物体都有重量w_i,利润p_i。假设他也知道以下几点: 按增加重量排序时,这些项目的顺序与排序时的顺序相同 通过减小值。给出了一个贪心算法来寻找这个变量的最优解 背包问题。证明其正确性和运行时间 因此,我提出的贪婪算法是根据增加的权重(也就是减少的值)对项目进行排序。这意味着每重量的价格是递减的。因此小偷可以拿走价值最高的物品,直到重量=M。运行时间将是O(n log n),因为排序需要O(n log n),遍历列表需要O(n)。我
n
物品,但只有一个背包,容量为
取M
重量。每个物体都有重量w_i
,利润p_i
。假设他也知道以下几点:
按增加重量排序时,这些项目的顺序与排序时的顺序相同
通过减小值。给出了一个贪心算法来寻找这个变量的最优解
背包问题。证明其正确性和运行时间
因此,我提出的贪婪算法是根据增加的权重(也就是减少的值)对项目进行排序。这意味着每重量的价格是递减的。因此小偷可以拿走价值最高的物品,直到重量=M
。运行时间将是O(n log n)
,因为排序需要O(n log n)
,遍历列表需要O(n)
。我一直坚持的那部分就是正确性的证明。以下是我迄今为止的证据:
假设存在这样一个实例,即上述解决方案(称为GA)不是最优的。将最优解称为OS,OS获取的项目按递增值排序。由于操作系统比遗传算法更为优化,因此遗传算法获得的利润小于或等于操作系统获得的利润。由于GA获取利润/重量比最高的项目,因此第一个元素i
,必须大于或等于OS的第一个元素。由于操作系统更为优化,因此必须存在一个大于或等于遗传算法集合中某个项目j的i
。但由于遗传算法和操作系统在同一集合中完成,且遗传算法总是获取利润/权重最高的项目,因此操作系统中不可能存在大于遗传算法中某个i
有人能帮忙证明吗?谢谢您的解决方案是有效的,关于运行时间的推理是正确的。在续集中,假设输入是“去平凡化”的,即每个发生的obejct实际上都适合于背包,并且不可能选择整个输入 排序生成的项目的排序是
- 贬值
- 增重
i'
表示中断索引,它是排序序列中被贪婪算法拒绝的第一项的索引。为清晰起见,请将相应的对象称为断开对象。注意
w_j > w_i' for each j > i'
保持,这意味着贪婪算法也会拒绝每一个继破碎对象之后的对象(因为它不适合背包,就像破碎对象一样)
总的来说,贪婪算法选择排序序列的前缀;我们的目的是显示任何最佳的解决方案(我们认为固定在续集中)是相同的前缀。
请注意,最佳解决方案,因为它是最佳的,不会为其他对象留下空间
针对一个矛盾,设k
为贪婪解中的最小指标,而不是最优解中的最小指标。由于不可能将对象k
另外选择到最优解中,因此(通过k
的最小值)最优解中必须有一些带有索引的项
k' > k
它允许在最佳解决方案中交换项目。作为
w_k < w_k' and p_k > p_k'
w_kp_k'
在最优解中,objectk'
可以替换为objectk
,这会产生一个利润大于最优解利润的解,这与其最优性是矛盾的
因此,贪婪解中不存在最优解中缺少的项,这意味着贪婪解是最优解的子集。另一方面,贪婪解相对于包含是最大的,这意味着最优解不能包含贪婪解中缺少的项
注意贪婪算法als对于一般背包问题是有用的;在贪婪解和利润最大的项目中取较好的一个,得到比率为2的近似算法