微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

订购背包问题的正确性/证明

如何解决订购背包问题的正确性/证明

小偷可以选择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 举报,一经查实,本站将立刻删除。