На бирже курсовых и дипломных проектов можно найти образцы готовых работ или получить помощь в написании уникальных курсовых работ, дипломов, лабораторных работ, контрольных работ, диссертаций, рефератов. Так же вы мажете самостоятельно повысить уникальность своей работы для прохождения проверки на плагиат всего за несколько минут.

ЛИЧНЫЙ КАБИНЕТ 

 

Здравствуйте гость!

 

Логин:

Пароль:

 

Запомнить

 

 

Забыли пароль? Регистрация

Повышение уникальности

Предлагаем нашим посетителям воспользоваться бесплатным программным обеспечением «StudentHelp», которое позволит вам всего за несколько минут, выполнить повышение уникальности любого файла в формате MS Word. После такого повышения уникальности, ваша работа легко пройдете проверку в системах антиплагиат вуз, antiplagiat.ru, etxt.ru или advego.ru. Программа «StudentHelp» работает по уникальной технологии и при повышении уникальности не вставляет в текст скрытых символов, и даже если препод скопирует текст в блокнот – не увидит ни каких отличий от текста в Word файле.

Результат поиска


Наименование:


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

Информация:

Тип работы: курсовая работа. Добавлен: 10.07.2012. Сдан: 2011. Страниц: 9. Уникальность по antiplagiat.ru: < 30%

Описание (план):


СОДЕРЖАНИЕ
     ВСТУПЛЕНИЕ 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 находит минимальное число умножении, необходимое для перемножения последовательности матриц. Осталось найти расстановку скобок, приводящую к такому числу умножений.
    Для этого мы. используем таблицу 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  
      Рисунок 4.1 - Початкові дані до задачі і допустимий розв’язок
      Діючи за алгоритмом, обираємо найбільший час, по якому здійснюються перевезення. Проаналізувавши таблицю, видно, що це комірка, в якій час перевезення  рівний 19. Тому потрібно її «розвантажити».
      Для розвантаження комірки, згідно алгоритму, потрібно використати комірку з  часом 2. Отже, в комірку в 3 рядку  і 3 стовпці, яка має час 4 додаємо 100 одиниць, так само в комірку  в 4 рядку і 2 стовпці, з часом 9 додаємо 100 одиниць, а в комірці, що в 4 рядку і 3 стовпці віднімаємо 100 одиниць. В результаті маємо повну розгрузку комірки з максимальним часом. Варто зазначити, що, якщо не чітко слідувати алгоритму, то можна побудувати і інший «розвантажувальний» цикл. Тобто, можна використати комірку не з часом 2, а останню комірку в лівому нижньому куті. Якби не повністю була «розвантажена» комірка з максимальним часом, то потрібно було використати саме останню комірку. Результат приведених дій наведений на рисунку 4.2
          Необхідність  продукції в пункті споживання
  3 200
8 0
4 0
15 0
200
  12 200
1 50
3 0
6 0
250
  20 0
19 0
4 300
8 0
300
  11 0
9 100
2 25
3 375
500
Кількість виготовленої продукції 400 150 325 375  
      Рисунок 4.2 - Результат першого «розвантаження»
      Далі  аналізуємо таблицю і помічаємо, що максимальний час 12 в комірці в другому рядку, першому стовпцю. Діючи за алгоритмом «розгрузки», знаходимо клітинку в останньому рядку і другому стовпцю. Мінімум рівний 100. Тому ми розвантажуємо тільки 100 одиниць. В комірках не може бути від’ємне значення. В комірку в другому рядку другого стовпця додаємо 100 одиниць і в комірку з часом 11 додаємо 100 одиниць. Оскільки комірка з поточним максимальним часом ще не повністю «розвантажена», шукаємо клітини, по яких можна побудувати цикл. Проаналізувавши таблицю це клітинка, яка іде відразу за попередньо обраною(в останньому рядку третього стовпця) і остання, оскільки клітина з часом 2 може розвантажити лише 25 одиниць продукції.
      Після виконання аналогічних до попередніх дій, отримаємо наступний результат, наведений в рисунок 4.3.
          Необхідність  продукції в пункті споживання
  3 200
8 0
4 0
15 0
200
  12 0
1 150
3 25
6 75
250
  20 0
19 0
4 300
8 0
300
  11 200
9 0
2 0
3 300
500
Кількість виготовленої продукції 400 150 325 375  
      Рисунок 4.3 - Розв’язання після другого «розвантаження»
      Для порівняння сформуємо початковий базис методом найменшого часу. Як видно з таблиці, максимальний час в початковій таблиці рівний 20. Якщо виконує людина процедуру «розвантаження»,  то вона відразу обере в останньому рядку комірку з часом 2(останній рядок, третій стовпець). Це дозволить відразу прийти до оптимального розв’язку. Комп’ютер діє за заданим алгоритмом. Тому він спочатку додасть в комірку праворуч від себе  з часом 19 150 одиниць, додасть в комірку вище себе з часом 12 також 150 одиниць і відніме в комірці з часом перевезення 1 150 одиниць. Потім решту 50 одиниць буде «розвантажувати», використовуючи комірку з часом 6. В результаті цієї операції, в базисі з’являються комірки з часом 12 і 19, які треба буде розвантажувати. Це є прикладом того, як, здавалося, кращий алгоритм отримання початкового базису дає більше ітерацій. Проілюструємо вище сказане з допомогою таблиці.
      На  рисунку 4.4 показаний початковий базис методом найменшого часу.
          Необхідність  продукції в пункті споживання
  3 200
8 0
4 0
15 0
200
  12 0
1 150
3 0
6 100
250
  20 200
19 0
4 0
8 100
300
  11 0
9 0
2 325
3 175
500
Кількість виготовленої продукції 400 150 325 375  
      Рисунок 4.4 - Початковий базис, отриманий методом найменшого часу.
      На  рисунку 4.5 показаний результат після «розгрузки».
          Необхідність продукції в пункті споживання
  3 200
8 0
4 0
15 0
200
  12 200
1 0
3 0
6 50
250
  20 0
19 150
4 0
8 150
300
  11 0
9 0
2 325
3 175
500
Кількість виготовленої продукції 400 150 325 375  
      Рисунок 4.5 - Результат після першої розгрузки.
      Розвантажуємо комірку з часом 19. Результат наведений на рисунку 4.6
          Необхідність  продукції в пункті споживання
  3 200
8 0
4 0
15 0
200
  12 200
1 50
3 0
6 0
250
  20 0
19 0
4 100
8 200
300
  11 0
9 100
2 225
3 175
500
Кількість виготовленої продукції 400 150 325 375  
      Рисунок 4.6. «Розвантаження» комірки з часом 19
      Далі  розвантажуємо комірку з часом 12 і отримуємо остаточний розв’язок, наведений на рисунку 4.7.
          Необхідність  продукції в пункті споживання
  3 200
8 0
4 0
15 0
200
  12 0
1 150
3 100
6 0
250
  20 0
19 0
4 100
8 200
300
  11 200
9 0
2 125
3 175
500
Кількість виготовленої продукції 400 150 325 375  
      Рисунок 4.7 - Остаточний розв’язок
      Приклад 2. Чотири постачальники з вантажем відповідно з 550, 250, 300, 100 одиниць можуть забезпечити споживачів, які потребують відповідно 400, 200, 150, 450 одиниць цих вантажів. Знайти мінімальний час для здійснення цих перевезень, якщо матриця часу має вигляд,  показаний на рисунку 4.8.
1 7 3 2
6 9 8 1
2 3 2 7
1 2 4 1
      Рисунку 4.8. - Матриця часу для другого прикладу.
      Складаємо робочу таблицю, на основі вхідних даних, яка показана на рисунку 4.9.
  400 200 150 450
550 1 7 3 2
250 6 9 8 1
300 2 3 2 7
100 1 2 4 1
      Рисунок 4.9 - Робоча таблиця.
      Будуємо початковий план методом «найменшого  часу», заповнюючи послідовно клітини (1,1), (4,4), (2,4), (1,4), (3,3), (3,2) (1,2).
      На  рисунку 4.10 показаний не тільки початковий розв’язок, але і потенціали зайнятих клітин. 

  400 200 150 450 ui
550 1 400
7 50
3 2 100
1
и т.д.................


Перейти к полному тексту работы


Скачать работу с онлайн повышением уникальности до 90% по antiplagiat.ru, etxt.ru или advego.ru


Смотреть полный текст работы бесплатно


Смотреть похожие работы


* Примечание. Уникальность работы указана на дату публикации, текущее значение может отличаться от указанного.