如何解决订购背包问题的正确性/证明
小偷可以选择n
个对象来窃取,但只有一个容量为
减轻M
的重量。每个对象我的权重为w_i
,利润为p_i
。假设他还知道以下内容:
这些项目按增加的重量排序的顺序与它们排序时的顺序相同
通过降低价值。给出一个贪婪算法,以找到针对该变体的最佳解决方案
背包问题。证明正确性和运行时间。
所以我想出的贪婪算法是根据增加的权重(也就是减少的值)对商品进行排序。这意味着每重量的价格按降序排列。因此,小偷可以拿到价值最高的物品,直到重量>= M
。运行时间为O(n log n)
,因为排序花费O(n log n)
,而遍历列表花费O(n)
。我坚持的部分是正确性的证明。到目前为止,这是我的证明:
假设存在这样的情况,即上述解决方案(称为GA)不是最优的。将最佳解决方案称为OS,并将OS占用的项目按增值排序。由于OS比GA更理想,因此从GA获得的利润小于或等于从OS获得的利润。由于Google Analytics(分析)会采用获利/权重比最高的项目,因此第一个元素i
必须大于或等于OS的第一个元素。因为OS更理想,所以必须存在一个i
,它大于或等于GA集中的项目j。但是,由于GA和OS在同一个集合上完成,并且GA始终采用利润/权重最高的商品,因此OS中的i
不能大于GA中的j
。
有人可以提供证明吗?谢谢
解决方法
您的解决方案是有效的,并且运行时间的推论是正确的。在续篇中,假设输入是“去平凡的”,这意味着每个发生的对象实际上都适合背包,并且不可能选择整个输入。
排序产生的项目的排序均为
- 价值下降
- 增加体重
使其成为general knapsack problem的特例。有关作证证明的论据如下。让i'
表示 breaking index ,它是排序序列中第一项的索引,被贪婪算法拒绝。为了清楚起见,请将相应的对象称为中断对象。请注意
w_j > w_i' for each j > i'
成立,这意味着贪心算法还会拒绝继破碎对象之后的每个对象(因为它不像破碎对象那样适合背包)。
总共,贪心算法会选择排序序列的前缀;我们旨在证明任何最佳解决方案(我们认为在续集中都已确定)具有相同的前缀。
请注意,最佳解决方案尽管是最佳的,但不会为其他对象留出空间。
针对一个矛盾,让k
是出现在贪婪解中而不是最优解中的最小索引。由于不可能另外选择对象k
作为最优解,因此(通过k
的最小值)必须在最优解中包含一些具有索引的项
k' > k
允许在最佳解决方案中交换项目。为
w_k < w_k' and p_k > p_k'
在最优解中,对象k'
可以用对象k
替换,这会产生收益大于最优解之一的解决方案,这与最优性是矛盾的。 / p>
因此,贪婪解决方案中没有最优解决方案中缺少的项目,这意味着贪婪解决方案是最优解决方案的子集。另一方面,贪婪解在包含上是最大的,这意味着最优解不能包含贪婪解中缺少的项。
请注意,贪婪算法als对于一般背包问题很有用;取其中一个更好的贪婪解决方案和一个利润最大的项目,得出比率为2的近似算法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。