【问题标题】:Reducing knapsack problem to an inverse knapsack problem将背包问题简化为逆背包问题
【发布时间】:2019-10-03 17:47:34
【问题描述】:

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完全的?

【问题讨论】:

    标签: algorithm knapsack-problem proof np-complete proof-of-correctness


    【解决方案1】:

    反向背包是我的最爱之一。虽然我从未明确证明它是 NP 完备的,但我确实知道如何将问题重新表述为背包问题本身,这应该可以解决问题:

    与其将对象添加到空袋子中,不如考虑选择要从已满袋子中取出的对象的问题。然后,由于权重的数量不能少于给定的数量,我们必须只删除对象的总数(权重-最小权重)。

    既然要最小化价格,那么必须最大化要移除的对象的价格。

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

    我们已经把这个问题改成了原来的背包问题,因此它也必须是NP完全的。

    这种方法的美妙之处在于我个人不知道用什么 NP 来完成它;我刚刚证明了反向背包和背包是完全等价的。

    【讨论】:

    • 我不太相信——如何保证剩余的物品能装进背包,即重量不超过W
    • 它们的权重必须大于W,如倒数所示?
    【解决方案2】:

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

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

    n * w_max
    

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

    中完成
    log( n * w_max )
    

    iterations,一个在输入的编码大小中呈多项式界限的数字,对第二个问题使用相同数量的算法调用。所描述的算法是从第一个问题到第二个问题的多项式还原。

    【讨论】:

      【解决方案3】:

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

      如果您想证明问题B 是NP 完全问题,您必须证明存在从AB 的多项式时间缩减,其中A 已知是NP 完全问题问题。
      从问题A 到问题B 的多项式时间减少是一种算法,它使用对问题B 的子程序的多项式调用次数以及这些子程序调用之外的多项式时间来解决问题A。 (source)。

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

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

      等价于

      • (ii) 找到一个对象子集,使得它们的权重之和至少为 M-W 并且它们的值之和最小。

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

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

      【讨论】:

      • 我明白了; ConfusedSoul 的回答中没有选择M-W 作为第二个公式的界限。不过,我相信我的回答也是正确的。
      • 是的,这个想法是对的,只是解释得有点混乱。另外,看到一个解决方案是另一个解决方案的补充,可以清晰地可视化(选择我们采取的对象相当于选择我们不采取的​​对象)。
      猜你喜欢
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 2010-12-22
      • 2012-06-17
      • 1970-01-01
      相关资源
      最近更新 更多