繁体   English   中英

将背包问题简化为逆背包问题

[英]Reducing knapsack problem to an inverse knapsack problem

1)假设我们有一个常见的0-1背包问题。 给定一组从1到n的n个项,每个项的权重为w_i,值为v_i,最大权重为W。在这里,我们需要选择一些对象,以使v_i的总和最大化,从而所选对象的w_i之和不会超过给定的W数。

       maximize∑(v_i*x_i), such that ∑(w_i*x_i)≤ W

2)现在假设我们有同样的问题,但是我们需要选择对象,以使它们的值之和最小,并且其权重之和不能小于给定的数字。

      minimize∑(v_i*x_i), such that ∑(w_i*x_i)≥ W.

知道第一个问题是NP完全的,我如何证明第二个问题具有相同的复杂性,换句话说NP也是完整的吗?

知道第一个问题是NP完全的,我如何证明第二个问题具有相同的复杂性,换句话说NP也是完整的吗?

如果要证明问题B是NP完全问题,则必须证明存在从AB的多项式时间约简,其中已知A是NP完全问题。
从一个问题的多项式时间减少A一个问题B是解决问题的算法A使用呼叫的多项式数为问题的子程序B那些子程序调用的外部,并且多项式时间。( )。

因此,根据您的情况,您可以轻松地将多项式时间从背负问题简化为逆背负问题。
这两个问题是等效的(找到一个最佳解决方案可以立即解决另一个问题)。
S为对象的集合, MS的对象的权重之和, W为背包的容量。 然后,我们有:

  • (i)找到对象的子集,以使它们的权重之和不超过W并且其值之和最大

相当于

  • (ii)找到对象的子集,以使它们的权重之和至少为MW并且其值之和最小。

这是因为,如果S'(i)的最优解,则S\\S'(ii)的最优解(ii)反之亦然)。

这是多项式时间减少( O(1)调用子程序,多项式运算次数),因此反向背包确实是NP完全的。

关键思想似乎是交换价值和权重,并对第二个问题使用二元搜索来构造约简。

给定第一个公式的实例I的值v_i和权重w_i ,通过交换利润和权重来构造第二个问题的实例。 所有权重的总和(现在是利润)由

n * w_max

其中w_max是最大重量。 这个数字本身在输入的编码长度中是指数的。 但是,我们可以使用二进制搜索来确定最大可实现利润,从而不超过初始容量W 这可以在

log( n * w_max )

迭代,即对输入的编码大小进行多项式限定的数字,对第二个问题使用相同次数的算法调用。 所描述的算法是从第一个问题到第二个问题的多项式预测。

逆背包是我的最爱之一。 尽管我从未明确证明它是NP完整的,但我确实知道如何将问题重新构造为背包问题本身,这应该可以解决问题:

与其将对象添加到空袋子中,不如考虑从要装满的袋子中选择要去除的对象的问题。 然后,由于权重的数量不能少于给定的数量,因此就对象而言,我们最多只能删除总计(权重-最小权重)。

由于要使价格最小化,因此必须将要移除的物体的价格最大化。

我们剩下最初的背包问题,在这里我们必须选择一组物品(要移走),以使它们的价格最大化,并且它们的总重量不超过最小重量。 (最后,我们将未删除的项目作为解决方案)

我们已经将问题改成恰好是原始的背包问题,因此它也必须是NP完全的。

这种方法的优点是我个人不知道什么NP可以完成它。 我刚刚证明反向背包和背包是完全等效的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM