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

Автор: Пользователь скрыл имя, 13 Декабря 2011 в 17:15, курсовая работа

Описание работы

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

Работа содержит 1 файл

Полина.docx

— 757.82 Кб (Скачать)

ВВЕДЕНИЕ

    Работа  над данным курсовым проектом позволяет  закрепить знания по предмету «Математические  методы исследования операций».

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

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

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

    

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

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

    

    

    1 раздел. Теоретические основы динамического программирования.

    1 История.

    Словосочетание  «динамическое программирование»  впервые было использовано в 1940-х  годах Р. Беллманом для описания процесса нахождения решения задачи, где ответ на одну задачу может  быть получен только после решения  задачи, «предшествующей» ей. В 1953 г. он уточнил это определение до современного. Первоначально эта область была основана, как системный анализ и  инжиниринг, которая была признана IEEE. Вклад Беллмана в динамическое программирование был увековечен в  названии уравнения Беллмана, центрального результата теории динамического программирования, который переформулирует оптимизационную  задачу в рекурсивной форме.

    Слово «программирование» в словосочетании «динамическое программирование»  в действительности к "традиционному" программированию (написанию кода) почти никакого отношения не имеет  и имеет смысл как в словосочетании «математическое программирование», которое является синонимом слова  «оптимизация». Поэтому слово «программа»  в данном контексте скорее означает оптимальную последовательность действий для получения решения задачи. К примеру, определенное расписание событий на выставке иногда называют программой. Программа в данном случае понимается как допустимая последовательность событий.

    2 Идея динамического программирования.

    

               Нахождение кратчайшего пути  в графе из одной вершины  в другую, используя оптимальную  подструктуру; прямая линия обозначает  простое ребро; волнистая линия  обозначает кратчайший путь между  вершинами, которые она соединяет  (промежуточные вершины пути не  показаны); жирной линией обозначен  итоговый кратчайший путь.

               Граф подзадач (ребро означает, что одна задача зависит от решения другой) для чисел Фибоначчи (граф ациклический). 
               
               
               
               
               

    Оптимальная подструктура в динамическом программировании означает, что оптимальное решение  подзадач меньшего размера может  быть использовано для решения исходной задачи. К примеру, кратчайший путь в графе из одной вершины (обозначим s) в другую (обозначим t) может быть найден так: сначала считаем кратчайший путь из всех вершин, смежных с s, до t, а затем, учитывая веса ребер, которыми s соединена со смежными вершинами, выбираем лучший путь до t (через какую  вершину лучше всего пойти). В  общем случае мы можем решить задачу, в которой присутствует оптимальная  подструктура, проделывая следующие три шага:

    

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

    Подзадачи решаются делением их на подзадачи  ещё меньшего размера и т. д., пока не приходят к тривиальному случаю задачи, решаемой за константное время (ответ можно сказать сразу). К  примеру, если нам нужно найти n!, то тривиальной задачей будет 1! = 1 (или 0! = 1).

    Перекрывающиеся подзадачи в динамическом программировании означают подзадачи, которые используются для решения некоторого количества задач (не одной) большего размера (то есть мы несколько раз проделываем  одно и то же). Ярким примером является вычисление последовательности Фибоначчи, F3 = F2 + F1 и F4 = F3 + F2 даже в таком тривиальном случае вычисления всего двух чисел Фибоначчи мы уже посчитали F2 дважды. Если продолжать дальше и посчитать F5, то F2 посчитается ещё два раза, так как для вычисления F5 будут нужны опять F3 и F4. Получается следующее: простой рекурсивный подход будет расходовать время на вычисление решение для задач, которые он уже решал.

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

    

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

    • перекрывающиеся подзадачи;
    • оптимальная подструктура;
    • возможность запоминания решения часто встречающихся подзадач.
    • Динамическое программирование обычно придерживается двух подходов к решению задач:
    • нисходящее динамическое программирование: задача разбивается на подзадачи меньшего размера, они решаются и затем комбинируются для решения исходной задачи. Используется запоминание для решений часто встречающихся подзадач.
    • восходящее динамическое программирование: все подзадачи, которые впоследствии понадобятся для решения исходной задачи просчитываются заранее и затем используются для построения решения исходной задачи. Этот способ лучше нисходящего программирования в смысле размера необходимого стека и количества вызова функций, но иногда бывает нелегко заранее выяснить, решение каких подзадач нам потребуется в дальнейшем.

    Языки программирования могут запоминать результат вызова функции с определенным набором аргументов (мемоизация), чтобы  ускорить «вычисление по имени». В  некоторых языках такая возможность  встроена (например, Scheme, Common Lisp, Perl), а  в некоторых требует дополнительных расширений (C++).

    Известны  сериальное динамическое программирование, включённое во все учебники по исследованию операций, и несериальное динамическое программирование (НСДП), которое в  настоящее время слабо известно, хотя было открыто в 1960-х годах.

    Обычное динамическое программирование является частным случаем несериального  динамического программирования, когда  граф взаимосвязей переменных просто путь. НСДП, являясь естественным и общим методом для учета структуры задачи оптимизации, рассматривает множество ограничений и/или целевую функцию как рекурсивно вычислимую функцию. Это позволяет находить решение поэтапно, на каждом из этапов используя информацию, полученную на предыдущих этапах, причём эффективность этого алгоритма прямо зависит от структуры графа взаимосвязей переменных. Если этот граф достаточно разрежен, то объём вычислений на каждом этапе может сохраняться в разумных пределах.

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

    

    3    Задача динамического программирования.

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

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

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

    

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

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

    Пусть предполагается к осуществлению  некоторое мероприятие или серия  мероприятий («операция»), преследующая определенную цель. Спрашивается: как  нужно организовать (спланировать) операцию для того, чтобы она была наиболее эффективной? Для того, чтобы  поставленная задача приобрела количественный, математический характер, необходимо ввести в рассмотрение некоторый  численный критерий W, которым мы будем характеризовать качество, успешность, эффективность операции. Критерий эффективности в каждом конкретном случаи выбирается исходя из целевой направленности операции и задачи исследования (какой элемент  управления оптимизируется и для  чего).

    

    Сформулируем  общий принцип, лежащий в основе решения всех задач динамического  программирования («принцип оптимальности»):

    «Каково бы ни было состояние системы S перед  очередным шагом, надо выбрать управление на этом шаге так, чтобы выигрыш на данном шаге плюс оптимальный выигрыш  на всех последующих шагах был  максимальным».

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

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