Динамическое программирование
Динами́ческое программи́рование, раздел оптимального управления, посвящённый теории и методам решения многошаговых задач. В задачах оптимального управления среди возможных управлений ищется то, при котором достигается экстремальное (наименьшее или наибольшее) значение т. н. целевой функции – некоторой числовой характеристики процесса. В динамическом программировании под многошаговостью понимают либо многоступенчатую структуру процесса, либо то, что управление разбивается на ряд последовательных этапов (шагов), соответствующих, как правило, различным моментам времени. Иногда многошаговость проистекает из существа процесса, но она может вводиться и искусственно для того, чтобы обеспечить возможность применения методов динамического программирования. Под программированием в динамическом программировании понимают принятие решений (планирование), а слово «динамическое» указывает на существенную роль времени и порядка выполнения операций. Методы динамического программирования являются составной частью методов, используемых в исследовании операций, и применяются в задачах оптимального планирования (например, в задачах об оптимальном распределении ресурсов, в теории управления запасами, в задачах замены оборудования) и при решении многих технических проблем (например, в задачах управления последовательными химическими процессами, в задачах оптимальной прокладки дорог).
Пусть процесс управления некоторой системой состоит из шагов (этапов); на -м шаге управление переводит систему из состояния , в котором она находилась после -го шага, в новое состояние . При этом задана функция , и новое состояние определяется по этой функции значениями , так, что . Таким образом, управления переводят систему из начального состояния в конечное состояние , где и – совокупности допустимых начальных и конечных состояний системы .
Одна из возможных постановок задач динамического программирования состоит в следующем. При заданном начальном состоянии требуется выбрать управления таким образом, чтобы система перешла в допустимое конечное состояние и при этом заданная целевая функция достигла максимального значения , т. е. где максимум берётся по всем управлениям , для которых .
В динамическом программировании обычно предполагается, что целевая функция является аддитивной. В рассмотренном примере это означает, что
Кроме того, в динамическом программировании предполагается, что в задаче отсутствует последействие: решения (управления), принимаемые на шаге , оказывают влияние только на состояние системы в момент . Оба упомянутых ограничительных условия можно ослабить, но только за счёт существенного усложнения метода.
В основе динамического программирования лежит принцип оптимальности, сформулированный Р. Беллманом. Пусть выбраны некоторые управления и тем самым траектория состояний и требуется завершить процесс, т. е. выбрать (а значит, и ). Если завершающая часть процесса не будет оптимальной в смысле достижения максимума функции процесс не будет оптимальным. Пользуясь принципом оптимальности Беллмана, можно получить основное функциональное соотношение динамического программирования , которое состоит в следующем. Пусть , где максимум берётся по всем управлениям , допустимым на шаге . Соотношение, определяющее зависимость от , называется уравнением Беллмана. Смысл этих функций достаточно ясен: если система на шаге оказалась в состоянии , то есть максимально возможное значение функции . Одновременно с построением функций находятся условные оптимальные управления на каждом шаге, т. е. значения оптимального управления при всевозможных предположениях о состоянии системы на шаге . Окончательно оптимальные управления находятся последовательным вычислением величин .
С помощью динамического программирования решается не одна конкретная задача при определённом , а сразу все подобные однотипные задачи при любом начальном состоянии. Численная реализация динамического программирования довольно сложна, т. к. требует запоминания большого количества информации, поэтому динамическое программирование целесообразно применять в тех случаях, когда необходимо многократно решать типовые задачи (например, определение оптимального режима полёта самолёта при меняющихся погодных условиях). Обычно задача динамического программирования формулируется для дискретных процессов, но в ряде случаев динамическое программирование применяется и для решения динамических задач с непрерывными параметрами.
Динамическое программирование дало новый подход ко многим задачам вариационного исчисления. Важный раздел динамического программирования составляют стохастические задачи динамического программирования, т. е. задачи, в которых на состояние системы и на целевую функцию влияют случайные факторы.
Строгое обоснование динамического программирования следует из результатов Л. С. Понтрягина и его учеников по математической теории управляемых процессов.