【发布时间】:2018-01-03 15:02:13
【问题描述】:
我已经获得了一个证据,该证据会诋毁关于 0/1 背包问题的普遍看法,我真的很难说服自己我是对的,因为我在任何地方都找不到任何东西 来支持我的主张,所以我将首先陈述我的主张,然后证明它们,我将感谢任何人尝试进一步证实我的主张或反驳它们。感谢任何合作。
断言:
- 用于解决背包问题的 bnb(分支定界)算法的大小并非与 K(背包容量)无关。
- bnb 树完整空间的大小总是为 O(NK),其中 N 是项目数,不是 O(2^N)
- bnb 算法在时间和空间上总是优于标准动态规划方法。
前置假设:bnb算法容易出现无效节点(如果剩余容量小于当前item的权重,我们不打算扩展它。另外,bnb算法已经完成以深度优先的方式。
草率证明:
这是解决背包问题的递归公式:
值(i,k) = max (值(i-1,k) , 值(n-1 , k-weight(i)) + 值(i)
但是如果 k
现在想象这个例子:
K = 9
N = 3
V W:
5 4
6 5
3 2
现在这里是这个问题的动态解决方案和表格:
现在想象一下,不管这是否是一个好主意,我们只想通过记忆而不是表格使用递归公式来执行此操作,使用地图/字典或简单数组来存储访问的单元格。为了使用记忆化解决这个问题,我们应该解决表示的单元格:
现在这与我们使用 bnb 方法获得的树完全一样:
现在是草率的证明:
- Memoization 和 bnb 树的节点数相同
- 记忆节点取决于表的大小
- 表大小取决于 N 和 K
- 因此bnb不独立于K
- 记忆空间以 NK 为界,即 O(NK)
- 因此 bnb 树的完整空间(或者如果我们以广度优先方式进行 bnb 的空间)总是 O(NK) 而不是 O(N^2) 因为整棵树不会被构造出来,它就像妈妈化一样。
- Memoization 比标准动态编程有更好的空间。
- bnb 比动态规划有更好的空间(即使是在广度优先的情况下)
- 没有松弛的简单 bnb(仅消除不可行的节点)将比记忆化有更好的时间(记忆化必须在查找表中搜索,即使查找可以忽略不计,它们仍然是相同的。)李>
- 如果我们忽略记忆的查找搜索,它比动态更好。
- 因此bnb算法在时间和空间上总是优于动态。
问题:
如果无论如何我的证明是正确的,就会出现一些有趣的问题:
- 为什么要使用动态编程?根据我的经验,你可以在 dp knapsack 中做的最好的事情是拥有最后两列,如果你从下到上填充它,你可以将它进一步改进为一列,它会有 O(K) 空间但仍然不能(如果上述断言是正确的)击败 bnb 方法。
- 如果我们将 bnb 与松弛修剪相结合(关于时间),我们还能说 bnb 更好吗?
ps:很抱歉发了这么长的帖子!
编辑:
由于其中两个答案都集中在记忆上,我只想澄清一下,我根本不关注这个!我只是使用记忆作为一种技术来证明我的断言。我的主要关注点是分支定界技术与动态编程,这是另一个问题的完整示例,由 bnb + 松弛解决(来源:Coursera - 离散优化):
【问题讨论】:
-
我投票结束这个问题,因为它更适合cs.stackexchange.com
-
我怎样才能把它移到那里?
-
您可能希望避免使用“a Total Joke”之类的短语;它引发了人们的疯狂警报。
-
总结一下:我在解决修改后的变更问题和随后的调查中发现标准(“经典”)DP解决方案远不如同样使用内存的体面BnB解决方案- 受限的记忆缓存。我还没有找到任何个测试用例,其中 BnB+memoization 解决方案甚至与经典 DP 解决方案一样慢。这让我不解为什么它是经典的解决方案。
标签: algorithm tree dynamic-programming knapsack-problem branch-and-bound