【问题标题】:Incrementally computing knapsack增量计算背包
【发布时间】:2016-05-24 20:34:08
【问题描述】:

有没有办法逐步计算背包问题?任何近似算法?我正在尝试解决以下场景中的问题。

让 D 是我的数据集,它没有排序,也不应该排序。 D分为3个子集,即D1、D2和D3。如果需要,可以分别订购 D1、D2 和 D3。我想为集合 (D1,D2) 和 (D2,D3) 计算单独的背包解决方案,但我不想避免两次计算 D2。所以,基本上,我想:

  • compute (D2) // 做一些操作
  • 将其保存为中间结果
  • 将其与 D1 一起使用并获得 (D1, D2) 的背包结果
  • 将其与 D3 一起使用并获得 (D2,D3) 的背包结果

这样在 D2 上的数据遍历只进行一次。有没有办法像这样逐步解决背包问题?

【问题讨论】:

  • 假设您的意思是 0/1 背包问题,是的。如果仅针对 D2 执行通常的 DP 解决方案,则记忆的部分结果适用于引导 (D2, D1) 或 (D2, D3) 的 DP 解决方案。要计算两者的解决方案,您需要复制仅 D2 计算的部分结果。我还没有准备好回答背包问题的其他变体。
  • 感谢您的回复。是的,我的意思是 0/1 背包问题。据我所知,如果 (D2,D1) 的组合没有排序,那么组合 DP 的两个解决方案效率不高。在我的情况下,D1 和 D2 是单独排序的,集合 S = (D2 U D1) 或 S= (D2 U D3) 不一定是排序的。
  • 我不确定您所说的“排序”是什么意思。 @JohnBollinger 所指的 DP 不关心元素的顺序,因此您无需对它们进行任何排序——您只需将 D2 中的元素移到前面即可。

标签: algorithm complexity-theory knapsack-problem approximation subset-sum


【解决方案1】:

维基百科给出了 0/1 背包的伪代码:https://en.wikipedia.org/wiki/Knapsack_problem#0.2F1_knapsack_problem

 // Input:
 // Values (stored in array v)
 // Weights (stored in array w)
 // Number of distinct items (n)
 // Knapsack capacity (W)

 for j from 0 to W do:
     m[0, j] := 0

 for i from 1 to n do:
     for j from 0 to W do:
         if w[i-1] > j then:
             m[i, j] := m[i-1, j]
         else:
             m[i, j] := max(m[i-1, j], m[i-1, j-w[i-1]] + v[i-1])

这会构建一个二维数组,这样m[n, W](最后一行中的最后一个元素)就是解决方案——您可以在 D2 上运行它。

然后你编写另一个算法,将这个数组作为输入,

  1. 不使用for j ... 部分来初始化数组
  2. for i from D2.count+1 to (D2.count + other.count) do: 是否从另一个停止的地方开始。 (在 w 和 v 数组中查找时必须调整 i)

【讨论】:

    猜你喜欢
    • 2013-06-10
    • 2010-11-23
    • 1970-01-01
    • 2023-02-17
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多