Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций СиАОД.docx
Скачиваний:
9
Добавлен:
01.03.2025
Размер:
4.62 Mб
Скачать
  1. Динамическое программирование

Динамическое программирование решает задачу, разбивая её на подзадачи и объединяя их решения.. Динамическое программирование применимо тогда, когда подзадачи не являются независимыми, иными словами, когда у подзадач есть общие «подподзадачи»

Алгоритм, основанный на динамическом программировании, решает каждую из подзадач единожды и запоминает ответы в специальной таблице. Это позволяет не вычислять заново ответ к уже встречавшейся подзадаче.

В типичном случае динамическое программирование применяется к задачам оптимизации

У такой задачи может быть много возможных решений; их «качество» определяется значением какого-то параметра, и требуется выбрать оптимальное решение, при котором значение параметра будет минимальным или максимальным (в зависимости от постановки задачи). В общем случае, оптимум может достигаться для нескольких разных решений.

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

Надо:

1) описать строение оптимальных решений,

2) выписать рекуррентное соотношение, связывающее оптимальные значения параметра для подзадач,

3) двигаясь снизу вверх, вычислить оптимальное значение параметра для подзадач,

4) пользуясь полученной информацией, построить оптимальное решение.

    1. Перемножение нескольких матриц

Мы хотим найти произведение

A1A2…An (1)

последовательности п матриц (A1, A2, ….., An). Мы будем пользоваться стандартным алгоритмом перемножения двух матриц в качестве подпрограммы. Но прежде надо расставить скобки в (1), чтобы указать порядок умножений.

Будем говорить, что в произведении матриц полностью расставлены, если это произведение либо состоит из одной-единственной матрицы, либо является заключенным в скобки произведением двух произведений с полностью расставленными скобками.

Поскольку умножение матриц ассоциативно, конечный результат вычислений не зависит от расстановки скобок.

В произведении A1A2A3A4 можно полностью расставить скобки пятью разными способами:

(A1(A2(A3A4)))

(A1((A2A3)A4))

((A1A2)(A3A4))

((A1(A2A3))A4)

(((A1A2)A3)A4)

Способ расстановки скобок может сильно повлиять на стоимость перемножения матриц.

Стандартный алгоритм перемножения матриц.

rows и columns - количество строк и столбцов матрицы

MATRIX-MULTIPLY (A, B)

1 if columns [A]  rows [B]

2 then error “умножить нельзя”

3 else for i  1 to rows [A]

4 do for j  1 to columns [B]

5 do C[i,j]  0

6 for k  1 to columns [A]

7 do C[i,j]  C[i,j]+A[i,k]B[k,j]

8 return C

Если А – это ( p х q ) матрица, а В – это (q х r) матрица, то их произведение С является (p х r) матрицей.

Задача об умножении последовательности матриц

Дана последовательность из n матриц A1, A2, ….., An заданных размеров (матрица Ai имеет размер pi-1 х pi); требуется найти такую (полную) расстановку скобок в произведении A1A2 An , чтобы вычисление произведения требовало наименьшего числа умножений.

Количество расстановок скобок

Простой перебор всех возможных расстановок скобок не даст эффективного алгоритма.

Разобъем матрицы на группы по три: произведение для каждой группы можно вычислить двумя способами, так что для 3 n матриц есть не менее 2n вариантов.

Шаг 1: строение оптимальной расстановки скобок

Мы должны описать строение оптимальных решений. Для задачи об умножении последовательности матриц это выглядит следующим образом. Обозначим через Ai..j матрицу, являющуюся произведением AiAi+1 Aj . Оптимальная расстановка скобок в произведении A1A2An разрывает последовательность между Ak и Ak+1 для некоторого k, удовлетворяющего неравенству 1k<п. При вычислении произведения, диктуемом этой расстановкой скобок, мы сначала вычисляем произведения A1..k и Ak+1..n ) а затем перемножаем их и получаем окончательный ответ A1+n

Стоимость этой оптимальной расстановки равна стоимости вычисления матрицы A1..k плюс стоимость вычисления матрицы Ak+1..n плюс стоимость перемножения этих двух матриц.

Чем меньше умножений нам потребуется для вычисления A1..k и Ak+1..n , тем меньше будет общее число умножений.

Стало быть, оптимальное решение задачи о перемножении последовательности матриц содержит оптимальные решения задач о перемножении её частей. Это позволяет применить динамическое программирование.

Шаг 2: рекуррентное соотношение

Надо выразить стоимость оптимального решения задачи через стоимости оптимальных решений её подзадач. Такими подзадачами будут задачи об оптимальной расстановке скобок в произведениях Ai..j = AiAi+1 Aj для 1  i  j  п. Обозначим через т[i,j] минимальное количество умножений, необходимое для вычисления матрицы Ai..j

т[i,j] = 0, при i = j

Шаг 3: вычисление оптимальной стоимости

Вычисление «снизу вверх»

Предполагается

матрица Ai имеет размер pi-1 × pi при i = 1,2,2,…,n

на входе последовательность

length[p] = n+1

Используются вспомогательные таблицы

m[1..n,1..n]

s[1..n,1..n]

Matrix-Chain-Order (p)

1 n length[p] - 1

2 for i  1 to n

3 do m[i,i]  0

4 for l  2 to n

5 do for i  1 to n – l +1

6 do ji + l - 1

7 m[i, j]  ∞

8 for ki to j –1

9 do qm[i,k]+m[k + 1,j] + pi-1 pk pj

10 if q < m[i,j]

11 then m[i,j]  q

12 s[i,j]  k

13 return m, s

Шаг 4: построение оптимального решения

Matrix-Chain-Multiply (A,s,i,j)

1 if j > i

2 then X  Matrix-Chain-Multiply (A,s,i, s[i,j])

3 Y  Matrix-Chain-Multiply (A,s, s[i,j]+1 ,j)

4 return Matrix-Multiply (X, Y)

5 else return A