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'
在最优解中,object
k'
可以替换为object
k
,这会产生一个利润大于最优解利润的解,这与其最优性是矛盾的

因此,贪婪解中不存在最优解中缺少的项,这意味着贪婪解是最优解的子集。另一方面,贪婪解相对于包含是最大的,这意味着最优解不能包含贪婪解中缺少的项

注意贪婪算法als对于一般背包问题是有用的;在贪婪解和利润最大的项目中取较好的一个,得到比率为2的近似算法