
________________________________________________________________________________________________________
3.3. Задачи динамического программирования
3.3. Задачи динамического программирования
Понятие о методе динамического программирования
Динамическое программирование – это особый метод поиска оптимального варианта управления (последовательности действий) среди n–мерных вариантов путем декомпозиции задачи оптимизации на n этапов, каждый из которых представляет подзадачу относительно одной переменной [1].
Этот метод специально приспособлен к многошаговым (многоэтапным) операциям.
Операция – это управляемый процесс воздействия на объект управления, состоящий или искусственно представляемый из нескольких этапов [3]. Управление таким процессом состоит из выбора на каждом этапе одного из возможных вариантов действий. Совокупность (последовательность) вариантов действий для каждого этапа представляет собой стратегию проведения операции (управление операцией):
U = (u1,u2, …, um),
где U – управление операцией в целом; i – управление на i –м шаге операции.
В задаче динамического
программирования требуется найти такое
оптимальное
управление
U*,
при котором W(U*)
= max
{W(U)},
где
.
Как мы заметили, интегральный критерий
является аддитивным. В некоторых случаях
он может быть мультипликативным,
например, когда целевая функция имеет
смысл вероятности наступления какого-либо
события (обнаружения, потери, поражения
цели и т. п.).
Процесс динамического программирования состоит из двух частей [19]:
-
планирование управления на каждом шаге, в результате которого находятся условные оптимальные управления и условные оптимальные выигрыши на каждом шаге, а также оптимальный выигрыш всей операции;
-
выбор совокупности управлений на каждом шаге (управления операцией в целом) обеспечивающей найденный максимум (минимум) целевой функции – показателя эффективности проведения операции.
Управление на каждом шаге должно выбираться не отдельно от других шагов, а с учетом всех его последствий в будущем. Управление на данном шаге выбирается таким, чтобы была максимальной сумма выигрышей на всех оставшихся до конца шагах плюс на данном шаге. Исключением из этого правила является последний шаг, который может планироваться без оглядки на будущее. Этот шаг должен планироваться первым и именно таким образом, чтобы он сам (без других шагов) принес наибольшую выгоду.
Поэтому процесс динамического программирования при планировании управления на каждом шаге обычно разворачивается в направлении от последнего шага к первому. Планируя последний m–й шаг нужно сделать разные предположения, чем мог бы закончиться предпоследний m-1–й шаг. Для каждого такого предположения нужно найти условное оптимальное управление и соответствующий ему условный оптимальный выигрыш. Управление и выигрыш называются условными потому, что управление выбирается исходя из условия, что предыдущий шаг закончился именно так. Выигрыш на данном шаге получается при выбранном управлении на этом шаге.
При выборе условного оптимального управления рассматриваются (перебираются) все возможные исходы предыдущего шага и выбирается оптимальное на этом шаге управление. Спланировав m-й шаг при различных условиях окончания m–1-го шага, мы планируем m–1-й шаг при различных условиях окончания m–2-го шага, затем m-2-й шаг при различных условиях окончания m–3-го шага и так далее до первого шага. Планирование условного оптимального управления на первом шаге сразу же позволяет вычислить оптимальный выигрыш W(U*) всей операции в целом, поскольку условные оптимальные управления за последующие шаги уже найдены.
После того как будут найдены все условные оптимальные управления и условные оптимальные выигрыши за весь «хвост» процесса, можно начать формировать оптимальное управление всей операцией U* (т. е. выбирать совокупности управлений на каждом шаге в направлении от первого шага к последнему шагу). Под понятием «хвост» процесса подразумеваются все шаги, начиная от данного шага и до последнего шага.
Так как известно, в каком состоянии S0 была система в начале первого шага, то можно из множества возможных управлений на первом шаге выбрать оптимальное управление u1*.
В результате применения этого управления u1* система перейдет из состояния S0 в новое состояние S1*. В этом состоянии система находится в начале 2-го шага, поэтому можно из множества возможных управлений на втором шаге выбрать оптимальное управление u2*. Продолжая подобным образом, мы получаем всю совокупность шаговых управлений U* = (u1*, u2*, …, um*).
Следует заметить, что значение W(U*) стало известно сразу после определения условных оптимальных управлений, т. е. еще до выбора u1*. Поэтому при формировании оптимального управления всей операцией U* задача состоит в том, чтобы выбирать такие ui*, которые позволили бы сформировать управление всей операцией U* с уже известным значением W(U*).
Применимость метода динамического программирования для решения задач оптимизации
Метод динамического программирования можно применять для нахождения оптимального управления процессом (последовательности действий) если [19]:
процесс (операция) может быть интерпретирован, как многошаговый процесс выбора управляющих параметров;
процесс (операция) определен для любого числа шагов и имеет структуру, не зависящую от числа шагов;
число параметров, характеризующих состояние процесса (операции, системы) на каждом шаге, не зависит от числа шагов;
процесс (операция) является Марковским, т. е. очередное его состояние зависит только от настоящего состояния и не зависит от того, как процесс пришел в это состояние;
целевая функция (показатель эффективности) обладает свойством разъединения прошлого и настоящего: является аддитивным или мультипликативным.
В основе метода динамического программирования лежит следующий принцип оптимальности:
На каждом этапе оптимальная стратегия определяется независимо от стратегий, примененных на предыдущих этапах. Оптимальная стратегия обладает тем свойством, что каковы бы ни были первоначальное состояние системы и первоначальный выбор, последующие выборы должны составлять оптимальную программу относительно состояния, полученного в результате первоначального выбора.
Последовательность действий при формулировке и решении задач динамического программирования
При формулировке задачи динамического программирования целесообразно придерживаться следующей последовательности действий:
-
определить, что является шагом процесса, а если процесс непрерывный, то произвести искусственное разбиение его на шаги;
-
определить параметры, характеризующие вектор состояний процесса (состояний объекта управления), и пределы их изменений;
-
определить параметры управления (вектор управления), и пределы их изменений;
-
определить функциональную зависимость состояний процесса от параметров управления (уравнение процесса), указывающую на правило перевода процесса из состояния в состояние в зависимости от принятого (примененного) управления;
-
с учетом выбранной целевой функции (показателя эффективности) составить функциональное уравнение, математически выражающее принцип оптимальности.
В самом общем случае для аддитивного интегрального критерия такое функциональное уравнение имеет вид:
где Si – вектор состояния процесса к началу i–го шага операции;
Wi, N – оптимальное значение показателя эффективности при оптимальной стратегии на шагах с i-го по N-й;
wi(ui) – значение показателя эффективности на i-м шаге при управлении ui.
Для мультипликативного интегрального критерия такое функциональное уравнение имеет вид:
Специфика каждой конкретной задачи динамического программирования сказывается на виде функционального уравнения, виде целевой функции, числе и виде параметров состояния процесса и управляющих параметров.
В связи с этим не существует единого алгоритма, позволяющего решить любую задачу, сформулированную, как задачу динамического программирования. Хотя каждая задача решается специфическим образом, для всех задач динамического программирования имеется и общее, которое заключается в решении задач в два этапа:
На первом этапе с помощью функционального уравнения последовательно находятся значения целевой функции (показателя эффективности) для всех значений параметров состояния и управляющих параметров на каждом шаге начиная с последнего до первого шага;
На втором этапе, используя полученные значения целевой функции, последовательно начиная с первого до последнего шага, находятся соответствующие максимуму (минимуму) значения целевой функции значения управляющих параметров и значения параметров состояния на следующем шаге. Полученная совокупность значений управляющих переменных и есть стратегия, обращающая целевую функцию (показатель эффективности) в максимум (минимум).
Примеры решения задач динамического программирования
В задачах динамического программирования вычисления выполняются рекуррентно в том смысле, что оптимальное решение одной подзадачи используется в качестве исходных данных для следующей подзадачи. Решив последнюю подзадачу, мы получим оптимальное решение исходной задачи. Способ выполнения рекуррентных вычислений зависит от того, как выполняется декомпозиция исходной задачи. В частности, подзадачи обычно связаны между собой некоторыми общими ограничениями. Если осуществляется переход от одной подзадачи к другой, то должны учитываться эти ограничения.
В ряде задач динамического программирования нет разницы между началом и концом процесса, как в приведенном ниже примере [19]. В этом примере планирование управления на каждом шаге производится в направлении от первого шага к последнему шагу. А формирование оптимального управления всей операцией U* – в направлении от последнего шага к первому. Такое становится возможным, когда значение целевой функции не зависит от направления движения. В данном примере кратчайший маршрут между первым и седьмым городом не зависит от направления, в котором мы начнем путешествие: из первого города или из последнего.
Пример 1.
Предположим, необходимо выбрать кратчайший путь между двумя городами. Сеть дорог, показанная на рис. 3.3.1, представляет возможные маршруты между исходным городом, находящимся в узле (вершине графа) 1, и конечным пунктом, который находится в узле 7. Маршруты проходят через промежуточные города, обозначенные на сети узлами с номерами 2-6. Расстояния между городами в милях проставлены дугами между вершинами графа (узлами).
Рис.3.3.1. Исходные
данные задачи о выборе кратчайшего
пути
Мы можем решить эту задачу посредством полного перебора всех маршрутов между узлами 1 и 7 (имеется пять таких маршрутов). Однако в большой сети полный перебор является неэффективным с вычислительной точки зрения.
Чтобы решить эту задачу с помощью методов динамического программирования, сначала разделим ее на шаги. Вертикальные пунктирные линии на втором рисунке очерчивают три шага задачи. Далее выполняются вычисления для каждого этапа в отдельности.
Общая задача состоит в вычислении кратчайших (постепенно накапливаемых) расстояний ко всем вершинам шага с последующим использованием этих расстояний в качестве исходных данных для следующего шага. Рассматривая узлы, относящиеся к первому шагу, замечаем, что каждый из узлов 2, 3 и 4 связан с начальным узлом 1 единственной дугой (рис. 3.3.2). Следовательно, для первого шага имеем следующее.
Рис. 3.3.2. Решение
задачи о выборе кратчайшего пути
Шаг 1. Итоговые результаты.
Кратчайший путь из узла 1 к узлу 2 равен 7 миль (из узла 1),
Кратчайший путь из узла 1 к узлу 3 равен 8 миль (из узла 1),
Кратчайший путь из узла 1 к узлу 4 равен 5 миль (из узла 1).
Далее переходим ко второму шагу для вычисления кратчайших (накопленных) расстояний к узлам 5 и 6. Рассматривая узел 5 первым, из второго рисунка, замечаем, что есть три возможных маршрута, по которым можно достичь узла 5, а именно (2, 5), (3, 5) и (4,5). Эта информация вместе с кратчайшими расстояниями к узлам 2, 3, и 4 определяет кратчайшее (накопленное) расстояние к узлу 5 следующим образом.
Аналогично для узла 6 имеем следующее.
Шаг 2. Итоговые результаты.
Кратчайший путь из узла 1 к узлу 5 равен 12 миль (из узла 4),
Кратчайший путь из узла 1 к узлу 6 равен 17 миль (из узла 3).
Последним шагом является третий шаг. Конечный узел 7 можно достигнуть как из узла 5, так и 6. Используя итоговые результаты шага 2 и расстояния от узлов 5 и 6 к узлу 7, получаем следующее.
Шаг З. Итоговые результаты.
Кратчайший путь к узлу 7 равен 21 миле (из узла 5).
Приведенные вычисления показывают, что кратчайшее расстояние между узлами 1 и 7 равно 21 миле. Города, через которые проходит кратчайший маршрут, определяются следующим образом. Из итоговых результатов третьего шага следует, что узел 7 связывается с узлом 5. Далее из итоговых результатов второго шага следует, что узел 4 связывается с узлом 5. Наконец, из итоговых результатов первого шага следует, что узел 4 связывается с узлом 1. Следовательно, оптимальным маршрутом является последовательность 1-4-5-7,
Теперь покажем, как рекуррентные вычисления динамического программирования можно выразить математически.
Пусть fi(xi) — кратчайшее расстояние от вершины х0 до вершины хi на этапе i, d(хi-1, хi) — расстояние от узла хi-1 до узла хi. Тогда fi вычисляется из fi-1 с помощью следующего рекуррентного уравнения.
При i=1 полагаем f0(x0) = 0. Это уравнение показывает, что кратчайшие расстояния fi(xi) на этапе i должны быть выражены как функции следующего узла хi. В терминологии динамического программирования хi именуется состоянием системы на этапе i.
В действительности состояние системы на этапе i – это информация, связывающая этапы между собой, при этом оптимальные решения для оставшихся этапов могут приниматься без повторной проверки того, как были получены решения на предыдущих этапах.
Такое определение состояния системы позволяет рассматривать каждый этап отдельно и гарантирует, что решение является допустимым на каждом этапе.
Определение состояния системы приводит к следующему унифицированному положению.
Принцип оптимальности. На каждом этапе оптимальная стратегия определяется независимо от стратегий, примененных на предыдущих этапах.
Применение принципа оптимальности демонстрируется вычислениями из рассмотренного примера. Например, на этапе 3 мы используем кратчайшие пути к узлам 5 и 6 и не интересуемся, как эти узлы были достигнуты из узла 1.