【问题标题】:confusion about rod cutting algorithm - dynamic programming关于棒材切割算法的困惑——动态规划
【发布时间】:2014-09-04 13:12:02
【问题描述】:

我最近看到了一个棒材切割问题,其中 B(i) = 切割长度为 i 单位的棒材的最优价格,p(i)​​ = 长度为 i 单位的棒材的价格。

给出的算法是这样的: B(i) = max(1

不应该是这样的吗: B(i) = max(1 其中 B(1) = p(1);

这样两部分都具有最佳成本,而不是单个杆的成本和第二部分的最佳成本。

for example: B(4) = max{ (B(1) + B(3)); (B(2) + B(2)) }

instead of max{ (p(1) + B(3)); (p(2) + B(2)); (p(3) + B(1)) }

有人可以解释一下吗?

【问题讨论】:

  • 不清楚 p 和 B 之间的关系是什么(语义上,而不是数学上),但原始算法似乎假设 p 是提供的,而不是从 B 确定的。因为你的提议完全忽略了 p ,我猜它不会产生相同的结果。
  • @Scott Hunter 是的,给出的 p 是一定长度的杆的成本

标签: algorithm dynamic-programming


【解决方案1】:

其实这个公式是对的。你有 B(i) = max(1i 的绳索。如果你要剪断它,那么你将剪断一段长度k,其中 k 在1i 之间,然后继续剪断绳子的剩余部分。因此,总体而言,您需要花费 p(k)(削减您决定不再削减的初始部分的价格)和削减剩余 B(i-k) 的价格。这正是公式的作用。

您的解决方案也可以完成这项工作,但它有一个小缺点 - 每个子问题的解决方案取决于两个(而不是一个)更简单的子问题的解决方案。我相信正因为如此,它的平均表现会更差。当然,有一个子问题取决于几个更简单的问题,这不是禁止或错误的。

【讨论】:

  • 我怀疑最优成本不会涉及切割两个部分的最优成本,而不是保留一个部分吗?
  • 不。无论您如何切断绳索,您都可以假设您切断了不再被切断的部分。不失一般性,您可以假设它是被剪切的第一部分。
【解决方案2】:

让我们假设长度为i的杆的最优价格将通过将杆切割成长度为l1, l2, .., lpp部分得到i= l1+ l2 +..+ lpl1<l2<l3<…<lp(为简单起见)。

最优解中存在长度为l1的杆件意味着如果将长度为l1的杆件进一步分解成更小的块,则长度为l1的杆件的价格将会下降。因此,对于长度为l1 的杆件,我们可以说是b[l1] = p[l1]。同样我们已经建立,b[l2] = p[l2], b[l3]= p[l3], ….., b[lp]= p[lp]. => b(i) = b(l1) + b(l2) +..+ b(lp) 是最优的………………..Condition 1

现在考虑长度为l1+l2 的杆的情况。声称b(l1+l2) = b(l1) + b(l2) 是最佳的。让我们假设情况并非如此。存在L 使得b(l1+l2) = b(L) + b(l1+l2-L) 是最优的。这意味着存在长度为L(l1+l2-L) 的杆,使得:

  • b(L) + b(l1+l2-L)>b(l1)+b(l2).
  • => b(l1) + b(l2) + b(l3) +..+ b(lp) < b(L) + b(l1+l2-L) +b(l3) +…+ b(lp).
  • =>这是一个矛盾{见条件1}
  • => b(l1+l2) = b(l1) + b(l2) 是最佳的
  • => 同样,b(l2+l3+l4) = b(l2) + b(l3) + b(l4) 是最优的,以此类推。

现在我们有一个重复出现b(i) = b(k) + b(i-k) for 1<=k<i

  • 发给k=l1, b(i) = b(l1) + b(i-l1) = p[l1] + b(i-l1)
  • k=l1+l2, b(i) = b(l1+l2) + b(i-l1-l2)
    • = b(l1+l2) + b(l3 + l4 +…+lp)
    • = [b(l1) + b(l2)] + b(l3 + l4 +…+lp)
    • = b(l1) + [b(l2) + b(l3 + l4 +…+lp)]
    • = b(l1) + b(l2+l3+l4+…+lp)
    • = b(l1) + b(i-l1)
    • = p[l1] + b(i-l1)
  • k= l1+l2, b(i) = p[k’] + b(i-k’)k’=l1

所以总结一下,如果我们想找到长度为i的杆的最优解,我们尝试将长度为i的杆分解为长度为(l1+l2)(i-l1+l2)的两部分,然后我们递归找到两个杆件的最优解,我们最终找到长度为l1 的最优杆件和长度为i-l1 的杆件的最优解。因此我们可以说:

b(i) = b(k) + b(i-k ) = p[k’] + b(i-k’) for 1<=k,k’<i.

【讨论】:

  • 我在数学上理解这一点,但我仍然无法直观地理解为什么当我们将杆分成两段时,一部分是正常价格,另一部分是最佳价格。再次,数学证明使有道理,但如果我想它似乎并不正确
【解决方案3】:

公式是正确的。我认为当我们认为两个公式都可以替换另一个时,就会出现混淆。
虽然他们计算相同的现象,但它是通过两种不同的方式完成的:

令,B(i) = 切割长度为 i 单位的棒的最优价格,并且 p(i) = 长度为 i 单位的杆的价格。

公式 1:B(i) = max(1

公式 2:B(i) = max(1

考虑一根长度为 4 的杆, 它可以通过以下方式切割:

1) 长度为 4 的未切割

2) 3, 1

3) 2, 2

4) 2、1、1

5) 1、3

6) 1、2、1

7) 1、1、2

8) 1、1、1、1

根据公式1:

选项1对应P(4)

选项 2,5,6,7,8 对应 B(1) + B(3)

选项 3,4,6,7,8 对应 B(2) + B(2)

根据公式2:

选项1对应P(4)

选项2对应P(3) + B(1)

选项 3,4 对应于 P(2) + B(2)

选项 5,6,7,8 对应 P(1) + B(3)

总而言之,1 和 2 计算的是最优解,但方式不同,与 1 相比,2 更紧凑,递归调用更少。

【讨论】:

  • 谢谢你让我明白了,也谢谢你提出的问题
猜你喜欢
  • 1970-01-01
  • 2016-07-05
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多