§ 3. Динамическое программирование

Содержание

Слайд 2

Динамическое программирование – это процесс пошагового решения задач, когда на каждом

Динамическое программирование – это процесс пошагового решения задач, когда на каждом

шаге из множества допустимых решений выбирается одно решение, оптимизирующее целевую функцию.
Слайд 3

Динамическое программирование применимо для задач, обладающих следующими свойствами: Свойство оптимальности для подзадач. Наличие перекрывающихся подзадач.

Динамическое программирование применимо для задач, обладающих следующими свойствами:
Свойство оптимальности для

подзадач.
Наличие перекрывающихся подзадач.
Слайд 4

Разбиение на подзадачи в методе ветвей и границ: Ω

Разбиение на подзадачи в методе ветвей и границ:


Слайд 5

Наличие перекрывающихся подзадач: Ω

Наличие перекрывающихся подзадач:


Слайд 6

При использовании динамического программирования каждая из подзадач решается только один раз

При использовании динамического программирования каждая из подзадач решается только один раз

и ее решение запоминается в специальной таблице.
При повторном появлении подзадачи она не решается, а ответ берется из таблицы.
Слайд 7

Принцип оптимальности для подзадач. Говорят, что для задачи выполнен принцип оптимальности

Принцип оптимальности для подзадач.
Говорят, что для задачи выполнен принцип оптимальности для

подзадач, если
оптимальное решение задачи содержит оптимальные решения подзадач.
Пример – кратчайший путь в графе. Каждый фрагмент кратчайшего пути также является кратчайшим путем.

A

B

C

E

D

Слайд 8

Задача о перемножении матриц. Дано n матриц M1, M2, …, Mn

Задача о перемножении матриц.
Дано n матриц M1, M2, …, Mn
Матрица Mi

имеет размеры pi-1 на pi
Для перемножения матрицы A размером m x k
на матрицу B размером k x n требует mkn операций
C = AB
Необходимо расставить скобки в произведении
M1M2…Mn
то есть требуется найти порядок перемножения матриц, при котором общее число операций минимально.
Слайд 9

Пример: M1 10 x 100 M2 100 x 5 M3 5

Пример:
M1 10 x 100
M2 100 x 5
M3 5 x 50
((M1 M2) M3)
M1 *M2

10*100*5 = 5000
* M3 10*5*50 = 2500
сумма = 7500
(M1 (M2 M3))
M2 *M3 100*5*50 = 25000
M1 * 10*100*50 = 50000
сумма = 75000
Слайд 10

Обозначим Mi...j = MiMi+1…Mj Mi...j = (Mi…Mk)*(Mk+1…Mj) для некоторого i fij

Обозначим Mi...j = MiMi+1…Mj
Mi...j = (Mi…Mk)*(Mk+1…Mj) для некоторого i<=kfij – минимальное

число операций для вычисления Mi...j
Нас интересует f1n
Очевидно, что fii = 0
Рекуррентное соотношение:
fij = mink {fik + fk+1j + pi-1 pk pj }, i < j
Для запоминания порядка перемножения:
gij = argmink {fik + fk+1j + pi-1 pk pj }
Слайд 11

Псевдокод алгоритма: for i = 1 to n do fii =

Псевдокод алгоритма:
for i = 1 to n do
fii = 0
i =

1, j = 2, t = 2
while j – i < n do
fij = ∞
for k = i to j – 1 do
t = fik+fk+1j+pi-1pkpj
if t < fii then
fij = t, gij = k
i++, j++
if j = n then
i = 1, t++, j = t
Слайд 12

Перемножение матриц: MULT (i, j) if j > i then X

Перемножение матриц:
MULT (i, j)
if j > i then
X = MULT (i,

gij)
Y = MULT (gij+1, j)
return XY
else
return Mi
Запуск:
MULT (1, n)
Слайд 13

Численный пример: n = 4

Численный пример:
n = 4

Слайд 14

Разбиение на подзадачи: 1..4 1..1 2..4 1..2 3..4 1..3 4..4 2..2

Разбиение на подзадачи:

1..4

1..1

2..4

1..2

3..4

1..3

4..4

2..2

3..4

2..3

4..4

1..1

2..2

3..3

4..4

1..1

2..3

1..2

3..3

3..3

4..4

2..2

3..3

2..2

3..3

1..1

2..2