Д.1 Общие сведения
Задачи динамического программирования являются многоэтапными или многошаговыми. Иными словами, нахождение решения конкретных задач методами динамического программирования включает несколько этапов или шагов, на каждом из которых определяется решение некоторой частной задачи, обусловленной исходной. Поэтому термин «динамическое программирование» не столько определяет особый тип задач, сколько характеризует методы нахождения решения отдельных классов задач математического программирования, которые могут относиться к задачам как линейного, так и нелинейного программирования.
Для разработки метода решения задачи динамического программирования существенно:
1)
чтобы целевая функция была аддитивна,
то есть f(x)
=
fi(x).
Это означает, что оптимизируемый критерий
накоплен как сумма частных значений
критерия на отдельных шагах. Если
критерий является мультипликативным,
то есть f(x)
= f1(x)
* f2(x)
* … * fn(x),
то тогда рассматривается вспомогательная
функция V
=
ln
fi(x)
= ln
f(x);
2) каждое новое состояние ∑i зависит только от предыдущего состояния ∑i-1 и управления xi, выбранного на этом шаге, и не зависит от того, каким образом система перешла в состояние ∑i-1, то есть рассматривается процесс без последействия.
Оптимальной стратегией управления называется множество уравнений X* = {x*1, x*2, …, x*n}, при котором (после реализации) система за n шагов переходит из состояния ∑0 в состояние ∑n и максимум f(X) = f(X*).
Теорема (принцип оптимальности): каково бы ни было состояние системы перед очередным шагом, необходимо выбрать управление на этом шаге так, чтобы сумма значений оптимизируемого критерия на этом шаге и оптимального значения критерия на всех последующих шагах была максимальной, то есть должно выполняться основное функциональное уравнение Беллмана:
∑k
/
Fn(∑0)
=
{f1(∑0,
x1)
+ … + fn(∑n-1,
xn)}
Fn-k(∑k)= {fk+1(∑k,xk+1)+fn-k-1(∑k+1)}, (21)
где Fn(∑0) – максимальное значение критерия оптимизации, полученное за n шагов при переходе из ∑0 в ∑n при реализации оптимальной стратегии управления.
Fn-k(∑k) – максимальное значение, получаемое при переходе из любого состояния ∑k в конечное состояние ∑n при оптимальной стратегии управления на оставшихся (n – k) шагах.
Метод
решения задачи динамического
программирования опирается на уравнение
(1). Полагается в этом уравнении k
= n
– 1 и считается известным Fn(∑0),
то получается F1(∑n-1)
=
[fn(∑n-1,
xn)
+ F0(∑n)].
Рассматривая всевозможные допустимые состояния на (n – 1)–ом шаге ∑n-1, ∑2n-1, …, ∑mn-1, находятся условные оптимальные решения:
X0n(∑1n-1), x0n(∑2n-1), …, x0n(∑mn-1) и, соответствующие им, значения функции f01(∑n-1), f01(∑2n-1), …, f01(∑mn-1).
Таким
образом, на n
шаге находится условно-оптимальное
управление при любом допустимом состоянии
системы после (n-1)-го
шага. Далее предполагается, что k=n–2,
тогда F2(∑n-2)
=
[fn-1(∑n-2,
xn-1)+
F1(∑n-1)]
и при некотором наборе допустимых
значений ∑in-2
и соответствующих управлений xn-1
находится
условно-оптимальное управление для
каждого из этих состояний. И т.д.
последовательно осуществляется описанный
итерационный процесс, то есть проходятся
все этапы от конца к началу (до k=1)
и определяется максимальное значение
выигрыша за все n
шагов. Для этого выигрыша находится
условно-оптимальное управление, а затем
проходится вся последовательность
шагов от начала к концу: на первом шаге
предполагается, что x*1
=
x01;
на втором шаге находится состояние ∑*1,
которое переводит систему в управление
x*1.
Это состояние определяет найденное
условно оптимальное управление x02,
тогда предполагается, что x*2
=
x02
и
т. д. В результате будет найдено оптимальное
значение управления. [2, C.
67]
Общий алгоритм динамического программирования:
1) На выбранном шаге задается набор значений переменной управления, определяемый условиями ограничений и характеризующий последний шаг, возможное состояние системы на предпоследнем шаге. Для каждого возможного состояния и каждого значения выбранной переменной вычисляется значение целевой функции. Из них для каждого исхода предпоследнего шага выбираются оптимальные значения целевой функции и соответствующие им значения рассматриваемой переменной, запоминается оптимальное значение переменной и соответствующее значение целевой функции, записывается в таблицу.
2) Происходит переход к оптимизации на следующем шаге при любом значении новой переменной и при оптимальных значениях следующих переменных. Оптимальное значение целевой функции на последующих шагах считывается из предыдущей таблицы. Если новая переменная характеризует первый шаг, то происходит переход к этапу 3, в противном случае, повторяется этап 2 для следующей переменной.
3) При заданном исходном условии для каждого возможного значения первой переменной вычисляется значение целевой функции. Выбираются оптимальные значения целевой функции и соответствующие оптимальные значения первой переменной.
4) Если известно оптимальное значение первой переменной, то определяются исходные данные для следующего шага и по последней таблице ищутся оптимальные значения следующей переменной.
5) Если следующая переменная не характеризует последний шаг, то осуществляется переход к этапу 4, иначе происходит переход к этапу 6.
6) Выписываются оптимальные решения.
Процесс решения задачи динамического программирования является довольно громоздким. Наиболее распространенными являются задачи о распределении капиталовложений между предприятиями и об оптимальной загрузке транспортного средства неделимыми грузами. При решении надо учитывать то, что алгоритм динамического программирования для различных видов задач видоизменяется.
