Планирование сборочной линии динамического программирования

#algorithm #dynamic-programming

#алгоритм #динамическое программирование

Вопрос:

Я читаю о динамическом программировании в книге Кормена и т. Д. По алгоритмам. ниже приведен текст из книги

Предположим, у нас есть автомобильный завод с двумя линиями assesmly, называемыми строкой 1 и строкой 2. Мы должны определить самое быстрое время, чтобы полностью собрать шасси.

Конечная цель — определить максимально быстрое время прохождения шасси через завод, которое мы обозначаем через Fn. Шасси должно пройти весь путь через станцию «n» либо на линии 1, либо на линии 2, а затем до выхода с завода. Поскольку более быстрый из этих способов является самым быстрым способом на всей фабрике, мы имеем

 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:

Если вы решите проблему рекурсивным способом, что бы вы сделали? Вы бы начали вычислять 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), вы должны вычислить f1 (j), f2 (j) для каждого j в интервале [0, i) — иначе для каждого j, меньшего, чем i . Другими словами, значение f1,2(i) зависит от значения f1,2(0 ..i-1), поэтому каждый раз, когда вы вычисляете f_(i), вы вычисляете КАЖДОЕ f1,2(1 ..i-1) — (потому что это зависит отих значение).

По этой причине количество раз, когда вы вычисляете f_(i), зависит от того, сколько f1,2 есть «над ним».

Надеюсь, это понятно.

Комментарии:

1. в приведенной выше третьей строке последнего абзаца значение f1,2 (i) зависит от значения f1,2(0 ..j), т. Е. Вместо i должно быть j? я прав?

2. Нет, но это должно быть f1,2 (1 … i-1) — (Редактирование ответа)

3. Извините, я должен был быть более ясным: для f1(i) или f2 (i) значение такого f(i) зависит от значения f1(0), f1(1), f1(2), …, f1(i-1), f2 (0), f2 (1), f2 (2), … f2 (i-1).

4. Это просто еще один способ выразить, что f_(i) зависит от f1(j), f2 (j) для каждого j в интервале [0, i) — (иначе для каждого j, меньшего, чем i)