Динамическое программирование. Основные концепции

Содержание

Слайд 2

Цель лекции

Изучить базовые идеи динамического программирования и простейшие примеры его применения
Изучить методы

Цель лекции Изучить базовые идеи динамического программирования и простейшие примеры его применения
реализации этих алгоритмов на языке программирования Pascal (Delphi)

Слайд 3

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

Динамическое программирование – не метод составления программ, а

Чем не является динамическое программирование Динамическое программирование – не метод составления программ,
метод составления алгоритмов
Динамическое программирование не имеет ничего общего с динамической памятью

Слайд 4

Где используется динамическое программирование?

Алгоритм обработки графов
Алгоритмы обработки строк
Биоинформатика
Распознавание речи
Оптимизация запросов к базам

Где используется динамическое программирование? Алгоритм обработки графов Алгоритмы обработки строк Биоинформатика Распознавание
данных
Обработка изображений

Слайд 5

Числа Фибоначчи

Пример почти динамического программирования
Fib(0) = Fib(1) = 1
Fib(n) = Fib(n-1) +

Числа Фибоначчи Пример почти динамического программирования Fib(0) = Fib(1) = 1 Fib(n)
Fib(n-2), n > 1

Слайд 6

Простой способ вычисления

function fib(n : longint) : longint;
begin
if (n < 2) then

Простой способ вычисления function fib(n : longint) : longint; begin if (n
begin
result := 1;
exit;
end;
result := fib(n - 1) + fib(n - 2);
end;

Слайд 7

Дерево вычислений

Медленно работает – время пропорционально значению числа Фибоначчи, которые растут примерно

Дерево вычислений Медленно работает – время пропорционально значению числа Фибоначчи, которые растут
как 1.6n
Много одинаковых поддеревьев

Слайд 8

Метод запоминания ответов

После того, как число вычислено надо его запомнить, а не

Метод запоминания ответов После того, как число вычислено надо его запомнить, а
считать заново
В массиве логического типа calculated хранится информация о том, вычислено соответствующее число или нет
В массиве ans хранится вычисленное число

Слайд 9

Более быстрое вычисление

function fib(n : longint) : longint;
begin
if (n < 2) then

Более быстрое вычисление function fib(n : longint) : longint; begin if (n
begin
result := 1;
exit;
end;
if (calculated[n]) then begin
result := ans[n];
exit;
end;
result := fib(n - 1) + fib(n - 2);
calculated[n] := true;
ans[n] := result;
end;

Слайд 10

Ациклический граф вычислений

Содержит n вершин
Каждое число вычисляется ровно один раз

Ациклический граф вычислений Содержит n вершин Каждое число вычисляется ровно один раз

Слайд 11

Что позволило ускорить вычисление?

Перекрывающиеся подзадачи (много одинаковых поддеревьев)
Небольшое число различных подзадач (для

Что позволило ускорить вычисление? Перекрывающиеся подзадачи (много одинаковых поддеревьев) Небольшое число различных
вычисления Fib(n) – примерно n подзадач)
Возможность записывать ответы для подзадач

Слайд 12

Признаки возможности применения ДП

Возможность разбиения задачи на подзадачи (метод «разделяй-и-властвуй»)
Наличие свойства оптимальности

Признаки возможности применения ДП Возможность разбиения задачи на подзадачи (метод «разделяй-и-властвуй») Наличие
для подзадач – оптимальный ответ для большой задачи строится на основе оптимальных ответов для меньших
Наличие перекрывающихся подзадач

Слайд 13

Этапы решения задачи методом динамического программирования

Разбиение задачи на подзадачи
Построение рекуррентной формулы для

Этапы решения задачи методом динамического программирования Разбиение задачи на подзадачи Построение рекуррентной
вычисления значения функции
Вычисление значения функции для всех подзадач
Восстановление структуры оптимального ответа

Слайд 14

Задача о наибольшей общей подпоследовательности

На примере этой задачи будут рассматриваться указанные четыре

Задача о наибольшей общей подпоследовательности На примере этой задачи будут рассматриваться указанные
этапа
На базе этой задачи построена программа diff, которая используется в Linux для сравнения файлов
Задача имеет приложения в биоинформатике

Слайд 15

Постановка задачи

Заданы две строки: a1a2…an и b1b2…bm
Необходимо найти строку максимальной длины, которая

Постановка задачи Заданы две строки: a1a2…an и b1b2…bm Необходимо найти строку максимальной
встречается в обеих заданных строках как подпоследовательность

AGCAT
GAC

GA

Слайд 16

Медленное решение

Перебрать все подпоследовательности одной из строк и проверить их вхождение в

Медленное решение Перебрать все подпоследовательности одной из строк и проверить их вхождение
другую строку
Число подпоследовательностей строки длиной n – 2n
Поэтому время работы такого решения – O(m2n)

Слайд 17

Разбиение на подзадачи (1)

Рассмотрим строки : a1a2…an и b1b2…bm
Если последние символы совпадают

Разбиение на подзадачи (1) Рассмотрим строки : a1a2…an и b1b2…bm Если последние
(an=bm), то их нужно включить в ответ и отбросить
Если они различны, то нужно попробовать отбросить только an, а потом только bm

Слайд 18

Разбиение на подзадачи (2)

Подзадачами являются задачи такого типа «Найти наибольшую общую подпоследвательность

Разбиение на подзадачи (2) Подзадачами являются задачи такого типа «Найти наибольшую общую
строк a1a2…ai и b1b2…bk»
Обозначим ответ (длину последовательности) на эту подзадачу как len[i][k]

Слайд 19

Рекуррентная формула

Рекуррентная формула

Слайд 20

Начальные условия

len[0][k] = 0 для всех k
len[i][0] = 0 для всех i

Начальные условия len[0][k] = 0 для всех k len[i][0] = 0 для всех i

Слайд 21

Два метода вычисления

«Сверху вниз» – рекурсия с запоминанием ответов
«Снизу вверх» – заполнение

Два метода вычисления «Сверху вниз» – рекурсия с запоминанием ответов «Снизу вверх» – заполнение таблицы
таблицы

Слайд 22

Метод «сверху вниз»

Решение больших подзадач начинается до того, как получены ответы для

Метод «сверху вниз» Решение больших подзадач начинается до того, как получены ответы
маленьких
Маленькие решаются в процессе решения больших

Слайд 23

Программа

function calc(i, k : integer) : integer;
begin
if (calculated[i][k]) then begin
result := len[i][k];
exit;
end;
if

Программа function calc(i, k : integer) : integer; begin if (calculated[i][k]) then
(i = 0) or (k = 0) then begin
result := 0;
exit;
end;
if (a[i] = b[k]) then begin
result := calc(i – 1, k – 1) + 1;
end else begin
result := max(calc(i – 1, k), calc(i, k – 1));
end;
calculated[i][k] := true;
len[i][k] := result;
end;

Слайд 24

Преимущества и недостатки

Преимущества:
Достаточно просто пишется на основе рекуррентной формулы
Вычисляются ответы только для

Преимущества и недостатки Преимущества: Достаточно просто пишется на основе рекуррентной формулы Вычисляются
тех подзадач, которые действительно нужны
Недостатки:
Некоторое замедление из-за накладных затрат на рекурсию

Слайд 25

Метод «снизу вверх»

Заполняется таблица ответов на подзадачи в порядке возрастания размера подзадачи
Когда

Метод «снизу вверх» Заполняется таблица ответов на подзадачи в порядке возрастания размера
начинается решение большой подзадачи, меньшие уже решены

Слайд 26

Программа

len[0][0] := 0;
for i := 1 to n do begin
len[i][0] := 0;
end;
for

Программа len[0][0] := 0; for i := 1 to n do begin
k := 1 to m do begin
len[0][k] := 0;
end;
for i := 1 to n do begin
for k := 1 to m do begin
if (a[i] = b[k]) then begin
len[i][k] := len[i – 1][k – 1] + 1;
end else begin
len[i][k] := max(len[i–1][k], len[i][k-1]);
end;
end;
end;

Слайд 27

Преимущества и недостатки

Преимущества:
Требуется меньше памяти, чем при методе «сверху вниз» и отсутствует

Преимущества и недостатки Преимущества: Требуется меньше памяти, чем при методе «сверху вниз»
рекурсия
Быстрее работает в случае, когда необходимо вычислить ответы для всех подзадач
Недостатки:
Порядок заполнения таблицы не всегда прост (например, может потребоваться заполнять по диагоналям)

Слайд 28

Пример

Красный цвет – начальные условия
Зеленый цвет – случай ai = bk
Желтый цвет

Пример Красный цвет – начальные условия Зеленый цвет – случай ai =
– случай ai ≠ bk

Слайд 29

Восстановление структуры оптимального ответа

Верхний путь – GA
Нижний путь – AC

Восстановление структуры оптимального ответа Верхний путь – GA Нижний путь – AC

Слайд 30

Программа

procedure restore(i, k : integer);
begin
if (i = 0) or (k = 0)

Программа procedure restore(i, k : integer); begin if (i = 0) or
then begin
exit;
end;
if (a[i] = b[k]) then begin
restore(i – 1, k – 1);
write(a[i]);
end else begin
if (len[i – 1][k] = len[i][k]) then begin
restore(i – 1, k);
end else begin
restore(i, k – 1);
end;
end;
end;

Слайд 31

Как делать в общем случае?

Такой метод работает в этой задаче, но не

Как делать в общем случае? Такой метод работает в этой задаче, но
понятно, как его адаптировать к другим
Общий метод состоит в том, чтобы запоминать, какой из вариантов в рекуррентной формуле был реализован

Слайд 32

Вычисление функции с запоминанием выбранного варианта

for i := 1 to n do

Вычисление функции с запоминанием выбранного варианта for i := 1 to n
begin
for k := 1 to m do begin
if (a[i] = b[k]) then begin
len[i][k] := len[i – 1][k – 1] + 1;
back[i][k] := 1;
end else begin
if (len[i - 1][k] > len[i][k - 1]) then begin
len[i][k] := len[i–1][k];
back[i][k] := 2;
end else begin
len[i][k] := len[i][k - 1];
back[i][k] := 3;
end;
end;
end;
end;

Слайд 33

Восстановление ответа

procedure restore(i, k : integer);
begin
if (i = 0) or (k =

Восстановление ответа procedure restore(i, k : integer); begin if (i = 0)
0) then begin
exit;
end;
if (back[i][k] = 1) then begin
restore(i – 1, k – 1);
write(a[i]);
end else if (back[i][k] = 2) then begin
restore(i – 1, k);
end else begin
restore(i, k – 1);
end;
end;

Слайд 34

Упражнение – 1

Путь с максимальной суммой. Задан прямоугольник размером n на

Упражнение – 1 Путь с максимальной суммой. Задан прямоугольник размером n на
m, в каждой клетке которого находится число. За один ход можно сдвинуться вверх или вправо. Необходимо найти путь из левого нижнего угла в правый верхний с максимальной суммой чисел в посещенных клетках

Слайд 35

Упражнение – 2

Число путей. Задан прямоугольник размером n на m, некоторые

Упражнение – 2 Число путей. Задан прямоугольник размером n на m, некоторые
клетки которого вырезаны. За один ход можно сдвинуться вверх или вправо. Необходимо найти число путей из левого нижнего угла в правый верхний

Слайд 36

Упражнение – 3

Максимальный подпалиндром. Задана строка. Необходимо найти наибольшую по длине

Упражнение – 3 Максимальный подпалиндром. Задана строка. Необходимо найти наибольшую по длине
подпоследовательность, которая является палиндромом (читается одинаково с обеих сторон)

Слайд 37

Упражнение – 4

Наибольшая возрастающая подпоследовательность. Задана последовательность из n чисел. Необходимо найти

Упражнение – 4 Наибольшая возрастающая подпоследовательность. Задана последовательность из n чисел. Необходимо
ее наибольшую по длине подпоследовательность, числа которой расположены в возрастающем порядке

Слайд 38

Литература

Кормен, Лейзерсон, Ривест, Штайн «Алгоритмы. Построение и анализ», глава 15

Литература Кормен, Лейзерсон, Ривест, Штайн «Алгоритмы. Построение и анализ», глава 15

Слайд 39

Выводы

Динамическое программирование – метод составления алгоритмов
Оно применимо в случае наличия перекрывающихся подзадач
Решение

Выводы Динамическое программирование – метод составления алгоритмов Оно применимо в случае наличия
задачи методом ДП состоит из четырех этапов:
Разбиение задачи на подзадачи
Построение рекуррентной формулы для вычисления значения функции
Вычисление значения функции для всех подзадач
Восстановление структуры оптимального ответа
Имя файла: Динамическое-программирование.-Основные-концепции.pptx
Количество просмотров: 193
Количество скачиваний: 0