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

Автор работы: Пользователь скрыл имя, 01 Декабря 2011 в 00:54, курсовая работа

Описание

Подобно методу «разделяй и властвуй», динамическое программирование решает задачу, разбивая её на подзадачи и объединяя их решения. Алгоритмы типа «разделяй и властвуй» делят задачу на независимые подзадачи, эти подзадачи—на более мелкие подзадачи и так далее, а затем собирают решение основной задачи «снизу вверх». Динамическое программирование применимо тогда, когда подзадачи не являются независимыми, иными словами, когда у подзадач есть общие «подподзадачи». В этом случае алгоритм типа «разделяй и властвуй» будет делать лишнюю работу, решая одни и те же подподзадачи по нескольку раз. Алгоритм, основанный на динамическом программировании, решает каждую из подзадач единожды и запоминает ответы в специальной таблице. Это позволяет не вычислять заново ответ к уже встречавшейся подзадаче.
В типичном случае динамическое программирование применяется к задачам оптимизации. Примерами задач динамического программирования являются задача о перемножении матриц и задача о нахождении найбольшей общей подпоследовательности. Эти задачи и методы их решения будут рассмотрены в данной работе.

Содержание

ВСТУПЛЕНИЕ 5
1 МАТЕМАТИЧНА ПОСТАНОВКА ЗАДАЧІ 6
2 ПРИКЛАДИ ЗМІСТОВИХ ПОСТАНОВОК ЗАДАЧІ 8
3 АЛГОРИТМ РЕШЕНИЯ ЗАДАЧИ О ПЕРЕМНОЖЕНИИ МАТРИЦ 10
3.1 Метод північно-західного кута 12
3.2 Метод найменшого часу 13
3.3 Оцінка складності алгоритмів 14
4 ПРИКЛАДИ РОЗВ’ЯЗАННЯ ЗАДАЧ «ВРУЧНУ» 15
5 РОЗВ’ЯЗАННЯ ЗАДАЧІ З ДОПОМОГОЮ EXCEL 26
6 ПРОГРАМНА РЕАЛІЗАЦІЯ АЛГОРИТМУ 31
ВИСНОВОК 33
ПЕРЕЛІК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ 34
Додаток А 34
Лістинг програми 34

Работа состоит из  1 файл

ПЗ.doc

— 329.00 Кб (Скачать документ)

СОДЕРЖАНИЕ

     ВСТУПЛЕНИЕ 5

     1 МАТЕМАТИЧНА ПОСТАНОВКА ЗАДАЧІ 6

     2 ПРИКЛАДИ ЗМІСТОВИХ ПОСТАНОВОК ЗАДАЧІ 8

     3 АЛГОРИТМ РЕШЕНИЯ ЗАДАЧИ О ПЕРЕМНОЖЕНИИ МАТРИЦ 10

       3.1 Метод північно-західного кута 12

       3.2 Метод найменшого часу 13

       3.3 Оцінка складності алгоритмів 14

     4 ПРИКЛАДИ РОЗВ’ЯЗАННЯ ЗАДАЧ «ВРУЧНУ» 15

     5 РОЗВ’ЯЗАННЯ ЗАДАЧІ З ДОПОМОГОЮ EXCEL 26

     6 ПРОГРАМНА РЕАЛІЗАЦІЯ АЛГОРИТМУ 31

     ВИСНОВОК 33

     ПЕРЕЛІК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ 34

     Додаток А 34

       Лістинг програми 34

 

ВСТУПЛЕНИЕ

      Подобно методу «разделяй и властвуй», динамическое программирование решает задачу, разбивая её на подзадачи и объединяя их решения. Алгоритмы типа «разделяй и властвуй» делят задачу на независимые подзадачи, эти подзадачи—на более мелкие подзадачи и так далее, а затем собирают решение основной задачи «снизу вверх». Динамическое программирование применимо тогда, когда подзадачи не являются независимыми, иными словами, когда у подзадач есть общие «подподзадачи». В этом случае алгоритм типа «разделяй и властвуй» будет делать лишнюю работу, решая одни и те же подподзадачи по нескольку раз. Алгоритм, основанный на динамическом программировании, решает каждую из подзадач единожды и запоминает ответы в специальной таблице. Это позволяет не вычислять заново ответ к уже встречавшейся подзадаче.

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

 

1 ОБЩАЯ СХЕМА АЛГОРИТМА ДП

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

      Общая схема алгоритма динамического  программирования:

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

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

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

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

     Основную часть работы составляют шаги а-в. Если нас интересует только оптимальное значение параметра, шаг г не нужен. Если же шаг г необходим, для построения оптимального решения иногда приходится получать и хранить дополнительную информацию в процессе выполнения шага в.

 

2 ПРИМЕРЫ СОДЕРЖАТЕЛЬНЫХ ПОСТАНОВОК ЗАДАЧ

  Задача 1. Задача об умножении последовательности матриц. Дана последовательность из n матриц <A1,A2,…,An> заданных размеров (матрица Ai, имеет размер pi-1 рi,); требуется найти такую (полную) расстановку скобок в произведении А1А2•…•An , чтобы вычисление произведения требовало наименьшее числа умножений.

  Задача 2. Подпоследовательность получается из данной последовательности, если удалить некоторые её элементы (сама последовательность также считается своей подпоследовательностью). Формально: последовательность Z= <z1,z2,…,zn> называется подпоследовательностью последовательности Х=<x1,x2,…,xn> если существует строго возрастающая последовательность индексов <i1,i2,…,ik>, для которой zj=xij. при всех j=1,2,...,k.

      Будем говорить, что последовательность Z является общей подпоследовательностью последовательностей Х и Y, если Z является подпоследовательностью как X, так и Y.

        Задача о наибольшей общей  подпоследовательности (сокращенно НОП) состоит в том, чтобы найти общую подпоследовательность наибольшей длины для двух данных последовательностей Х и Y. 

 

3 АЛГОРИТМ  РЕШЕНИЯ ЗАДАЧИ О УМНОЖЕНИИ МАТРИЦ

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

     Для начала нужно описать строение оптимальных решений. Обозначим для удобства через Ai..j матрицу, являющуюся произведением AiAi+1•…•Aj. Оптимальная расстановка скобок в произведении А1А2•…•An разрывает последовательность между Аk и Ak+1 для некоторого k, удовлетворяющего неравенству 1 k n. Иными словами, при вычислении произведения, диктуемом этой расстановкой скобок, мы сначала вычисляем произведения A1..k и Ak+1..n, а затем перемножаем их и получаем окончательный ответ Ai..n. Стало быть, стоимость этой оптимальной расстановки равна стоимости вычисления матрицы A1..k плюс стоимость вычисления матрицы Ak+1..n плюс стоимость перемножения этих двух матриц.

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

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

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

      Числа m[i,j] можно вычислить так. Если i = j, то последовательность состоит из одной матрицы Аi..ii и умножения вообще не нужны. Стало быть, m[i,i]=0 для i=1,2,…,m. Чтобы подсчитать m[i,j] для i< j, мы воспользуемся информацией о строении оптимального решения, полученной на шаге 1. Пусть при оптимальной расстановке скобок в произведении АiАi+1•…•Aj последним идет умножение Аi•…• Ak на Аk+1 •…• Aj, где i£ k£ j. Тогда m[i,j] равно сумме минимальных стоимостей вычисления произведений Ai..k и Ak+1..j плюс стоимость перемножения этих двух матриц. Поскольку для вычисления произведения Ai..kAk+1..j требуется pi-1pkpj умножений,

m[i,j]=m[i,k]+m[k+1,j]+pipkpj.

      В этом соотношении подразумевается, что оптимальное значение k нам  известно; на деле это не так. Однако число k может принимать всего лишь j-i различных значений: i, i+1,…,j-1. Поскольку одно из них оптимально, достаточно перебрать эти значения k и выбрать наилучшее. Получаем рекуррентную формулу:

  (16.2)

      Числа m[i,j]—стоимости оптимальных решений подзадач. Чтобы проследить за тем, как получается оптимальное решение, обозначим через s[i,j] оптимальное место последнего умножения, то есть такое k, что при оптимальном вычислении произведения АiАi+1•…•Aj последним идет умножение Ai•…•Ak на Ak+1•…•Aj. Иными словами, s[i,j] равно числу k, для которого m[i,j]=m[i,k]+m[k+1,j] +pi-1pkpj,.

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

      Пользуясь соотношениями (16.2), теперь легко написать рекурсивный алгоритм, определяющий минимальную стоимость вычисления произведения A1A2•…•An (т.е. число m[1,n]). Однако время работы такого алгоритма экспоненциально зависит от та, так что этот алгоритм не лучше полного перебора. Настоящий выигрыш во времени мы получим, если воспользуемся тем, что подзадач относительно немного: по одной задаче для каждой пары (i,j), для которой 1£i£ j£n, а всего С2n + n = Q(n2). Экспоненциальное время работы возникает потому, что рекурсивный алгоритм решает каждую из подзадач по многу раз, на разных ветвях дерева рекурсии. Такое «перекрытие подзадач»— характерный признак задач, решаемых методом динамического программирования.

      Вместо  рекурсии мы вычислим оптимальную стоимость  «снизу вверх». В нижеследующей программе предполагается, что матрица Ai имеет размер рi-1´pi при i=1,2,..., п. На вход подаётся последовательность р=<p0,p1,…,pn>, где length[p]=n+1. Программа использует вспомогательные таблицы m[l..n,1..n] (для хранения стоимостей m[i,j]) и s[l..n,1..n] (в ней отмечается, при каком k достигается оптимальная стоимость при вычислении m[i,j]). 

   Заполняя  таблицу m, этот алгоритм последовательно решает задачи об оптимальной расстановке скобок для одного, двух, ..., n сомножителей. В самом деле, соотношение (16.2) показывает, что число m[i,j]—стоимость перемножения j-i+1 матриц — зависит только от стоимостей перемножения меньшего (чем j-i+1) числа матриц. Именно, для k=i,i+1,…,j-1 получается, что Ai..k - произведение k-i+1<j-i+1 матриц, a Ak+1..j — произведение j-k<j-i+1 матриц.

   Сначала (в строках 2-3) алгоритм выполняет присваивания m[i,i] ¬0 для i =1,2,…, m: стоимость перемножения последовательности из одной матрицы равна нулю. При первом исполнении цикла (строки 4-12) вычисляются (с помощью соотношений (16.2)) значения m[i,i+1] для i=1,2,…,n-1—это минимальные стоимости для последовательностей длины 2. При втором проходе вычисляются m[i,i+2] для i=1,2,…,п-2—минимальные стоимости перемножения последовательностей длины 3, и так далее. На каждом шаге значение m[i,j], вычисляемое в строках 9-12, зависит только от вычисленных ранее значений m[i,k] и m[k+l,j].

   На  рис. 16.1 показано, как это происходит при n=6. Поскольку мы определяем m[i,j] только для i£j, используется часть таблицы, лежащая над главной диагональю. На рисунке таблицы повёрнуты (главная диагональ горизонтальна).

   Внизу выписана последовательность матриц. Число m[i,j]—минимальная стоимость перемножения АiАi+1•…•Aj—находится на пересечении диагоналей, идущих вправо-вверх от матрицы Ai и влево-вверх от матрицы Aj. В каждом горизонтальном ряду собраны стоимости перемножения подпоследовательностей фиксированной длины. Для заполнения клетки m[i,j] нужно знать произведения pi+1pkpj для k=i,i+1,…,j-1 и содержимое клеток, лежащих слева-внизу и справа-внизу от m[i,j].

   Простая оценка показывает, что время работы алгоритма matrix-chain-order есть O(п3). В самом деле, число вложенных циклов равно трём, и каждый из индексов l,i и k принимает не более та значений. В упражнении 16.1-3 мы

     

 

предложим вам показать, что время работы этого алгоритма есть Q(n3). Объём памяти, необходимый для хранения таблиц т и s, есть Q(n2). Тем самым этот алгоритм значительно эффективнее, чем требующий экспоненциального времени перебор всех расстановок.

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

      Алгоритм Matrix-Chain-Order находит минимальное число умножении, необходимое для перемножения последовательности матриц. Осталось найти расстановку скобок, приводящую к такому числу умножений.

  1. Для этого мы. используем таблицу s[1..п, 1..n]. В клетке s[l,n] записано место последнего умножения при оптимальной расстановке скобок; другими словами, при оптимальном способе вычисления A1..n последним идёт умножение A1..s[1,n] на As[1,n]+1..n. Предшествующие умножения можно найти рекурсивно: значение s[1,s[l,n]] определяет последнее умножение при нахождении A1..s[1.n], a s[s[1,n]+1,n] определяет последнее умножение при вычислении As[1,n]+1..n .Приведённая ниже рекурсивная процедура вычисляет произведение Ai..j имея следующие данные: последовательность матриц А=<A12,…,An>, таблицу s, найденную процедурой matrix-chain-order, а также индексы i и j. Произведение A1A2 ×… ×An равно Matrix-Chain-
 

((A1(A2A3))((A4A5)A6).                     (16.3) 

 

4 ПРИКЛАДИ  РОЗВ’ЯЗАННЯ ЗАДАЧ «ВРУЧНУ»

      Приклад 1. Маємо 4 пункти виготовлення продукції  і 4 пункти споживання. На рисунку 4.1 вхідні дані до задачі. Верхні числа означають час перевезень. Нижня цифра – початковий базис, визначений методом північно-західного кута. Якщо по маршруту не перевозиться продукція, то в відповідних комірках стоять нулі.

          Необхідність  продукції в пункті споживання
  3

200

8

0

4

0

15

0

200
  12

200

1

50

3

0

6

0

250
  20

0

19

100

4

200

8

0

300
  11

0

9

0

2

125

3

375

500
Кількість виготовленої продукції 400 150 325 375  

Информация о работе Задача о наибольшей общей подпоследовательности