Динамическое программирование
Динамическое программирование (ДП; англ. dynamic programming, DP) — это метод решения сложных задач оптимизации, основанный на разбиении исходной задачи на последовательность более простых подзадач[1][2]. Метод применяется к многошаговым процессам принятия решений, где оптимальное решение всей задачи может быть построено из оптимальных решений её подзадач.
Термин был введён американским математиком Ричардом Беллманом в 1950-х годах[3]. В этом контексте слово «программирование» используется в значении «планирование» или «составление оптимального плана действий», а не написание компьютерного кода[4].
Ключевые свойства и теоремы
Применимость динамического программирования к задаче определяется наличием у неё двух фундаментальных свойств.
Принцип оптимальности Беллмана
Центральным концептом метода является принцип оптимальности Беллмана (англ. Bellman's principle of optimality). Он гласит: какими бы ни были первоначальное состояние и первоначальное решение, последующие решения должны составлять оптимальную стратегию относительно состояния, полученного в результате первого решения[3].
Иными словами, любая часть оптимальной траектории сама по себе является оптимальной. Это свойство позволяет разбить общую задачу на последовательность более простых подзадач и решать их рекурсивно.
Перекрывающиеся подзадачи
Задача обладает свойством перекрывающихся подзадач (англ. overlapping subproblems), если при её рекурсивном решении одни и те же подзадачи возникают многократно. ДП позволяет избежать повторных вычислений, сохраняя решения уже встреченных подзадач (этот приём называется мемоизацией или табуляцией), что значительно повышает эффективность по сравнению с наивным рекурсивным перебором.
Уравнение Беллмана
Из принципа оптимальности вытекает основное рекуррентное соотношение метода — уравнение Беллмана[1]. Оно связывает «ценность» (оптимальный выигрыш или стоимость) текущего состояния с ценностями последующих состояний. В общем виде для детерминированного многошагового процесса с аддитивной целевой функцией оно имеет вид:
где:
- — номер шага (от до 1);
- — состояние системы на шаге ;
- — управляемое решение, принимаемое на шаге ;
- — выигрыш (или стоимость) на k-м шаге;
- — функция, задающая новое состояние системы;
- — оптимальное значение целевой функции для подзадачи, начинающейся на шаге в состоянии .
Уравнение решается последовательно, как правило, «с конца», двигаясь от последнего шага к первому.
Примеры применения
- Задача о кратчайшем пути в графе: Эта задача обладает свойством оптимальной подструктуры, так как любой участок кратчайшего пути сам является кратчайшим. Алгоритмы Беллмана-Форда и Флойда-Уоршелла являются классическими примерами применения ДП для решения этой задачи[5].
- Задача о рюкзаке: Задача об оптимальном заполнении рюкзака ограниченной ёмкости предметами с разной ценностью и весом. ДП позволяет решить эту задачу, рассматривая предметы последовательно и вычисляя на каждом шаге максимальную ценность для всех возможных значений оставшейся ёмкости.
- Задача о распределении ресурсов: Распределение ограниченного ресурса (например, инвестиций) между несколькими проектами для максимизации общего эффекта.
Ограничения
Главным ограничением метода является проклятие размерности (англ. curse of dimensionality) — термин, введённый Беллманом для обозначения экспоненциального роста числа состояний и, как следствие, вычислительной сложности, при увеличении числа переменных, описывающих состояние системы[6][7]. Это ограничивает практическое применение точного ДП для задач очень большой размерности.
Связанные понятия
- Исследование операций
- Теория оптимального управления
- Марковский процесс принятия решений (стохастическое обобщение)
- Уравнение Гамильтона — Якоби — Беллмана (аналог для непрерывного времени)
Примечания
- ↑ 1,0 1,1 "Динамическое программирование". Большая российская энциклопедия. [1]
- ↑ "Динамическое программирование". Википедия. [2]
- ↑ 3,0 3,1 Решетников А. Н., Коченков А. В., Пиров Д. М., Рябоконь Д. А. (2011). Динамическое программирование. Примеры применения. Учебное пособие, ННГУ им. Лобачевского (ВМиК). [3]
- ↑ "Dynamic programming". Wikipedia. [4]
- ↑ Bradley S. P., Hax A. C., Magnanti T. L. (1977). Applied Mathematical Programming. Addison-Wesley. [5]
- ↑ "Проклятие размерности". Википедия. [6]
- ↑ Jensen P. A. (2004). Dynamic Programming – Models. Operations Research Models and Methods, Univ. of Texas. [7]