动态编程装配线调度

时间:2011-11-03 11:55:39

标签: algorithm dynamic-programming

我正在阅读关于Cormen的动态编程等关于算法的书。以下是书中的文字

假设我们的汽车工厂有两条称为第1行和第2行的评估线。我们必须确定最快的时间来获得底盘。

最终目标是确定在整个工厂中获得底盘的最快时间,我们用Fn表示。 chasssis必须在1号线或2号线的“n”站一直到工厂出口。由于这些方式中的更快速度是整个工厂中最快的方式,我们有

Fn = min(f1[n] + x1, f2[n]+x2) ---------------- Eq1

Above x1 and x2 final additional time for comming out from line 1 and line 2

我有以下递归方程。考虑以下是Eq2。

f1[j]  = e1 + a1,1                                    if j = 1
             min(f1[j-1] + a1,j, f2[j-1] + t2,j-1 + a1,j  if j >= 2

f2[j]  = e2 + a2,1                                    if j = 1
             min(f2[j-1] + a2,j, f1[j-1] + t1,j-1 + a2,j  if j >= 2

设Ri(j)是递归算法中对fi [j]的引用数。

从等式R1(n)= R2(n)= 1

从上面的等式2我们有

R1(j) = R2(j) = R1(j+1) + R2(j+1)  for j = 1, 2, ...n-1

我的问题是作者如何使用R(n)= 1,因为我们基本情况为0而不是n,这里我们将如何在代码中编写递归函数 例如C代码?

另一个问题是作者如何提出R1(j)和R2(j)?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果以递归方式解决问题,你会怎么做? 你开始计算F(n)。 F(n)会递归调用f1(n-1)和f2(n-1)直到到达叶子(f1(0),f2(0)),对吗?

因此,这就是递归解决方案中对F(n)的引用数量为1的原因,因为您只需要计算一次f1(n)和f2(n)。这不适用于f1(n-1),它是在计算f1(n)和计算f2(n)时引用的。

现在,他怎么想出R1(j)= R2(j)= R1(j + 1)+ R2(j + 1)? 好吧,以递归方式计算它,每次你需要f1(i)时,你必须为区间[0,i]中的每个j计算f1(j),f2(j) - 每个j更小的AKA比我。 换句话说,f1,2(i)的值取决于f1,2(0..i-1)的值,所以每次计算f_(i)时,你都计算每个f1,2( 1..i-1) - (因为它取决于它们的值)。

因此,计算f_(i)的次数取决于“在他之上”有多少f1,2。

希望这很清楚。