Динамическое программирование
(Беллман, 1960г)
Метод динамического программирования применим к оптимизации многошаговых процессов, в которых решение принимается в последовательные моменты времени.
Время может быть непрерывным и дискретным. В первом случае получаем непрерывное динамическое программирование и его рассматривают в теории автоматического управления.
Рассматриваем дискретное динамическое программирование. Время будет меняться по тактам (шагам) и решения принимается на каждом таком такте. Такты будем нумеровать целыми числами от 1 до n.
Другая особенность задач динамического программирования: целевая функция аддитивна, то есть результирующий эффект от процесса складывается из частных эффектов, полученных на каждом шаге.
.
В задачах динамического программирования фигурируют следующие объекты
1. Множества шагов на каждом из которых, кромеn.-го, принимается решение.
2. Множества состояний системы .
3. Множество вариантов принятия решений (управлений) .
4. Две функции:
функция локального эффекта на i-ом шаге ;
функция перехода в новое состояние ,
где - состояние системы,- управление наi-ом шаге.
Прежде чем сформулировать задачу оптимизации промоделируем процесс функционирования этой системы.
Пусть на начальном такте (i=1) система находилась в состоянии S1. Выберем последовательность управлений и проследим, как при этом по тактам изменяется состояние системы и как формируется результирующий эффект.
Поскольку в начале процесса эффект равен нулю, то после первого такта текущий эффект окажется таким
.
Состояние системы на втором такте окажется равным .
После второго такта текущий эффект окажется равным
.
Состояние системы на третьем такте .
Вообще, после k тактов будет достигнут эффект
,
а состояние на (k+1)-ом такте окажется равным
.
В конце процесса общий эффект достигнет следующей величины
.
Из сказанного ясно, что результат целиком и полностью определяется начальным состоянием системы S1 и последовательностью управлений , то есть
. (*)
Однако в приложениях начальное состояние не доступно для выбора ЛПР и в лучшем случае лишь известно ему. Поэтому задача ЛПР заключается в том, чтобы для каждого начального состояния S1 найти такую последовательность управлений , чтобы функция цели (*) была максимальной.
То значение эффекта, которое будет при этом достигнуто, будем обозначать через .
Итак, - это оптимальное значение эффекта, которое может быть достигнуто из начального состоянияS1.
В силу конечности множества всех последовательностей принципиально эту задачу возможно решить методом перебора. Однако с увеличением числа тактовn и числа возможных управлений m трудоемкость этой процедуры нарастает весьма быстро. Действительно, мощность указанного множества равна. Например, если число возможных управлений равно 3 (как у витязя на распутье), а число тактов равно 10, то это число равно 39 = 19 683, но уже при четырех вариантах управления это число будет больше 16 миллионов.
Таким образом, необходимо так упорядочить перебор, чтобы снизить трудоемкость расчетов, что и происходит при применении метода динамического программирования.
В методе динамического программирования ключевым объектом является функция - функция имеющая тот же смысл, что и введенная выше функция, то есть это оптимальное значение эффекта, которое может быть достигнуто кn-такту (к концу процесса), но при движении не из первого такта, а из i-го такта. Эта функция в отличие от функции зависит от двух аргументов – начального состояния и номера такта.
Функция удовлетворяет следующему знаменитому уравнению Беллмана, которое называется Принципом оптимальности.
.,(**)
где
.
Тот, кто играет в шахматы, легко согласится с этой формулой. На некотором ходу в позиции противник может предложить вам жертву и , если вы ее примете (выберете управлениеui), то получите значительный локальный эффект в виде взятой фигуры. Однако при этом вы попадаете в такую позицию , что достичь хорошего результата дальнейшей игры (большого значения) вы не сможете и, следовательно, будет плох и результат. Если же вы не такой жадный, то выберете другое управлениеuj , для которого не так велик, но позиция не так плоха и общий результат будет лучше.
В качестве примера применения метода динамического программирования рассмотрим так называемую задачу о рюкзаке.