Динамическое программирование (

Автор работы: Пользователь скрыл имя, 09 Декабря 2013 в 21:49, курсовая работа

Краткое описание

Динамическое программирование (ДП) определяет оптимальное решение n-мерной задачи путем ее декомпозиции на n этапов, каждый из которых представляет собой подзадачу относительно одной переменной. Вычислительное преимущество такого подхода состоит в том, что мы занимаемся решением одномерных оптимизационных задач подзадач вместо большой n-мерной задачи.
Фундаментальным принципом ДП, составляющим основу декомпозиции задачи на этапы, является оптимальность. Так как природа каждого этапа решения зависит от конкретной оптимизационной задачи, ДП не предлагает вычислительных алгоритмов непосредственно для каждого этапа. Вычислительные аспекты решения оптимизационных подзадач на каждом этапе проектируются и реализуются по отдельности (но это не исключает того, что может быть применен единый алгоритм для всех этапов).

Прикрепленные файлы: 1 файл

report.docx

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

Если учесть, что решение  подзадачи размером не более трех не требует вообще никаких действий, то рассматривая описанные варианты 1–3, следует предпочесть вариант 3, где нужно выбрать некоторое k из диапазона от 1 до s−2 и решить подзадачи Si,k+1 Si+k,sk. Если для решения задачи размером более четыре и более воспользоваться очевидным рекурсивным алгоритмом, непосредственно вытекающим из перечисленных выше вариантов, то можно показать что общее число рекурсивных вызовов составляет 3s−4, если подсчитать лишь обращения к подзадачам размером четыре и более. Таким образом количество подзадач, которые необходимо решить, возрастает по экспоненциальному закону в зависимости от s. А следовательно общее количество шагов экспоненциально зависит и от n.

Но известно, что, помимо исходной задачи существует лишь n(n−4) различных подзадач, которые в любом случае необходимо решить. Значит в приведенном анализе что-то явно не совсем верно. Очевидно, что совсем не все подзадачи отличаются между собой, если действовать рекурсивно, как приведено выше, то у нас возникают ситуации, когда одни и те же ситуации приходится решать несколько раз. Именно это подсказывает нам эффективный способ вычисления триангуляции. Прежде всего, вычисления удобно организовать в виде таблицы. Назначим стоимость Cis триангуляции Sis для всех i и s. Поскольку решение любой данной задачи зависит от решения задач меньшего размера, то логичным порядком заполнения такой таблицы является порядок, основанный на размерах подзадач, т. е. для размеров s = 4, 5, …, n−1 мы указываем минимальную стоимость задач Sis для всех вершин i. Удобно включить и задачи размеров 0 ≤ s < 4, но при этом нужно помнить, что Sis имеет стоимость 0, если s < 4.

В соответствии с перечисленными выше вариантами действий 1–3 при определении  подзадач формула вычисления Cis при s ≥ 4 должна иметь следующий вид:

Cis = min1≤ks−2 {Ci,k+1 + Ci+k,s+ D(vi, vi+k) + D(vi+k, vi+s−1)},

где D(vp, vq) — это длина хорды между вершинами vи vq, если vи vне являются смежными вершинами многоугольника; D(vp, vq) равняется 0, если являются смежными вершинами.

Отметим, что таким образом, мы вычислим всю таблицу, и определим  стоимость минимальной триангуляции, но не саму триангуляцию. Поэтому, как  и в задаче про наибольшую общую подпоследовательность для того, чтобы найти саму триангуляцию, мы должны еще также хранить информацию, о том, при каком значении k достигается минимум. И потом уже, по всем сохраненным значениям k мы можем легко восстановить минимальную триангуляцию.

Задача о загрузке

Задача о загрузке — это задача о рациональной загрузке судна (самолета, автомашины, и т. п.), которое имеет ограничения по объему или грузоподъемности. Каждый помещенный на судно груз приносит определенную прибыль. Задача состоит в том, чтобы определении загрузки, такими грузами которые приносят наибольшую прибыль.

Отметим также, что данная задача известна как задача о рюкзаке, в который турист должен определить наиболее ценные предметы, подлежащие загрузке в рюкзак. Формализуем нашу задачу. Пусть W — грузоподъемность нашего судна и есть в наличии n наименований предметов, которые подлежат загрузке. Пусть m— количество предметов i-го наименования, r— прибыль, которую приносит один загруженный предмет i-го наименования, w— вес одного предмета i-го наименования. Тогда общая задача имеет вид следующей целочисленной задачи линейного программирования.

Максимизировать Z = r1m+ r2m+ … + rnmпри условии, что

w1m+ w2m+ … + wnm≤ W, 
m1, m2, …, m≥ 0.

Рассмотрим подход, несколько  иной, чем был приведен выше. При  рассмотрении каждой конкретной задачи обратим внимание три основных элемента модели динамического программирования..

  1. Определение этапов.
  2. Определения на каждом этапе вариантов решения (альтернатив).
  3. Определения состояний на каждом этапе.

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

  1. Какие соотношения связывают этапы вместе?
  2. Какая информация необходима для того, чтобы получить допустимые решения на текущем этапе без повторной проверки решений, принятых на предыдущих этапах.

В приведенной задаче о  загрузке три элемента модели динамического программирования определяются следующим образом.

  1. Этап i ставится в соответствие предмету i-го наименования, i = 1, 2, …, n.
  2. Варианты решения на этапе i описываются количеством предметов mпредметов i-го наименования, подлежащих загрузке. Соответствующая прибыль равна rimi. Значение заключено mв пределах от 0 до [W⁄wi], где [W⁄wi] — целая часть числа W⁄wi.
  3. Состояние xна i выражает суммарный вес предметов, решения о погрузке которых приняты на этапах i, i+1, …, n. Это определение отражает тот факт, что ограничение по весу является единственным, которое связывает вместе все n этапов.

Пусть fi(xi) — максимальная суммарная прибыль от этапов i, i+1, …, n при заданном состоянии xi. Определим рекуррентное уравнение с помощью следующей двухшаговой процедуры.

  1. Выразим fi(xi) как функцию fi+1(xi+1) в виде

fi(xi) = max {rim+ fi+1(xi+1)}, i = 1, 2, …, n,

где max берется по всем

m= 0, 1, …, [W⁄wi] и x= 0, 1, …, W,

где fn+1(xn+1) ≡ 0.

  1. Выразим xi+1 как функцию xдля гарантии того, что левая часть последнего уравнения является функцией лишь xi. По определению xi+1 − xпредставляет собой вес, загруженный на этапе i, т. е. xi+1 − x= wimили xi+= x− wimi. Тогда рекуррентное уравнение приобретает следующий вид.

fi(xi) = max {rim+ fi+1(xi−wimi)}, i = 1, 2, …, n,

где max берется по всем

m= 0, 1, …, [W⁄wi] и x= 0, 1, …, W.

Задача о загрузке является типичным представителем задачи распределения  ресурсов, в которой ограниченный ресурс распределяется между конечным числом видов (экономической) деятельности. В таких моделях определения  состояния на каждом этапе будет  аналогично приведенному для задачи о загрузке : состоянием на этапе i является суммарное количество ресурса, распределяемого на этапах i, i+1, …, n.

Заключение

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

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

Литература

  1. Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — М.: МЦНМО, 1999.
  2. Ахо А., Хопкрофт Д., Ульман Д. Структуры данных и алгоритмы. — М.: Издательский дом «Вильямс», 2001.
  3. Таха Х. Введение в исследование операций. — М.: Издательский дом «Вильямс», 2001.
  4. Беров В.И., Лапунов А.В., Матюхин В.А., Пономарев А.Е. Особенности национальных задач по информатике. — Киров: Триада-С, 2000.

Камышан Андрей

 

Маша / 2009-05-27 21:27:59

Хочу сказать спасибо  автору за такую статью. Кучу сайтов, посвященных информатике, пересмотрела, но нигде такой доступной раскладки  алгоритма LCS не встретила. Да и к  тому же везде статьи повторяются. Еще  раз огромное спасибо!!!!

Виталий / 2010-07-08 12:21:22

Похоже, что в задаче о  загрузке есть ошибка:

"... По определению x(i+1) &#8722; x(i) представляет собой вес,  загруженный на этапе i, т. е. x(i+1) &#8722; x(i) = w(i)m(i) или x(i+1) = x(i) &#8722; w(i)m(i). Тогда рекуррентное уравнение  приобретает следующий вид.

fi(x(i)) = max {r(i)m(i) + f(i+1)(x(i)&#8722;w(i)m(i))}, i = 1, 2, ?, n,..."

Если x(i+1) &#8722; x(i) = w(i)m(i), то логично, чтобы x(i+1) = x(i) + w(i)m(i), а не x(i+1) = x(i) &#8722; w(i)m(i).

Миша / 2011-11-14 00:35:37

Автору спасибо за статью. Маша, ты не читала Окулова? Это очень  толковая книга и там про lcs хорошо написано


Информация о работе Динамическое программирование (