
Динамическое программирование
(Беллман, 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
, для
которого
не так велик, но позиция
не так плоха и общий результат будет
лучше.
В качестве примера применения метода динамического программирования рассмотрим так называемую задачу о рюкзаке.