Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Введение__________________________________________________________1
1 Динамическое программирование__________________________________3
1.1 Понятия динамического программирования______________________3
1.2 Метод динамического программирования________________________6
1.3 Идеи метода динамического программирования__________________10
1.4 Общая структура динамического программирования_____________12
2 Практические задачи динамического программирования____________14
2.1 Последовательности__________________________________________14
2.2 Одномерное динамическое программирование____________________15
2.3 Двумерное динамическое программирование_____________________16
2.4 Задачи на подпоследовательности______________________________18
Заключение______________________________________________________24
Список использованной литературы__________________________________26
ВВЕДЕНИЕ
(2)
Условие аддитивности целевой функции. Общий выигрыш за N шагов
вычисляется по формуле
N
S Wk ( x k 1 , u k ).
k 1
(3)
Определение. Оптимальной стратегией управления u* называется
u1 , u 2 ,..., u N
Возникает вопрос: как выбрать шаговые управления , чтобы
величина S обратилась в максимум?
Поставленная задача является задачей оптимального управления, а
управление, при котором показатель S достигает максимума, называется
u*
оптимальным. Оптимальное управление многошаговым процессом состоит
из совокупности оптимальных шаговых управлений:
u * (u1* , u 2* ,..., u N* )
Wm ( S ) max f m ( S , x m )
выигрыш по формуле xmi
(7)
8. Произвести условную оптимизацию (m-1)-го, (m-2)-го и т.д. шагов по
формуле (6), полагая в ней i=(m-1),(m-2),…, и для каждого из шагов указать
условное оптимальное управление xi(S), при котором максимум достигается.
Заметим, что если состояние системы в начальный момент известно (а это
обычно бывает так), то на первом шаге варьировать состояние системы не
нужно - прямо находим оптимальный выигрыш для данного начального
состояния S0. Это и есть оптимальный выигрыш за всю операцию
W * W1 ( S 0 ) (8)
9. Произвести безусловную оптимизацию управления, «читая»
соответствующие рекомендации на каждом шаге. Взять найденное оптимальное
x1* x1 ( S 0 ) ;
управление на первом шаге изменить состояние системы по
формуле (5); для вновь найденного состояния найти оптимальное управление
на втором шаге х2* и т.д. до конца.
Данные этапы рассматривались для аддитивных задач, в которых
выигрыш за всю операцию равен сумме выигрышей на отдельных шагах.
Метод динамического программирования применим также и к задачам с так
называемым «мультипликативным» критерием, имеющим вид произведения:
m
W wi
i 1 (9)
(если только выигрыши wi положительны). Эти задачи решаются точно
так же, как задачи с аддитивным критерием, с той единственной разницей, что в
основном уравнении (6) вместо знака «плюс» ставится знак «умножения»:
Wi ( S ) max f i ( S , x i ) * Wi 1 ( i ( S , xi ))
xi
int F(int n) {
if (n < 2) return 1;
else return F(n - 1) + F(n - 2);}
int F(int n) {
if (A[n] != -1) return A[n];
if (n < 2) return 1;
else {
A[n] = F(n - 1) + F(n - 2);
return A[n];
}
}
Приведенное решение является корректным и эффективным. Но для
данной задачи применимо и более простое решение:
F[0] = 1;
F[1] = 1;
for (i = 2; i < n; i++) F[i] = F[i - 1] + F[i - 2];
Таким образом, для клетки (i, j) число маршрутов A[i][j] будет равно
A[i – 1][j] + A[i][j – 1], то есть задача сводится к двум подзадачам. В данной
реализации используется два параметра — i и j — поэтому применительно к
данной задаче мы говорим о двумерном динамическом программировании.
Теперь мы можем пройти последовательно по строкам (или по столбцам)
массива A, находя число маршрутов для текущей клетки по приведенной выше
формуле. Предварительно в A[0][0] необходимо поместить число 1.
В задаче 3 в клетку с координатами (i, j) мы можем попасть из клеток с
координатами (i – 1, j), (i, j – 1) и (i – 1, j – 1). Допустим, что для каждой из этих
трех клеток мы уже нашли маршрут минимального веса, а сами веса поместили
в W[i – 1][j], W[i][j – 1], W[i – 1][j – 1].
Чтобы найти минимальный вес для (i, j), необходимо выбрать
минимальный из весов W[i – 1][j], W[i][j – 1], W[i – 1][j – 1] и прибавить к нему
число, записанное в текущей клетке:
W[i][j] = min(W[i–1][j], W[i][j – 1], W[i – 1][j – 1]) + A[i][j];
Данная задача осложнена тем, что необходимо найти не только
минимальный вес, но и сам маршрут. Поэтому в другой массив мы
дополнительно для каждой клетки будем записывать, с какой стороны в нее
надо попасть.
На рисунке 3 приведен пример исходных данных и одного из шагов
алгоритма.