Динамическое программирование. 11
Содержание
Введение |
3 |
1 Теоретическая часть |
4 |
1.1 Задача динамического программирования |
4 |
1.2 Примеры задач динамического программирования |
8 |
1.3 Общая структура динамического программирования |
12 |
1.4 Примеры решения задач |
14 |
2 Практическая часть |
20 |
Заключение |
31 |
Литература |
33 |
Введение
В настоящее время выделяется
большое вниманием вопросам организации
и управления, это приводит к необходимости
анализа сложных
Целью курсовой работы является выявление наилучшего способа действия при решении задачи динамического программирования. Главная роль при этом отводится математическому моделированию. Для построения математической модели необходимо иметь строгое представление о цели функционирования исследуемой системы и располагать информацией об ограничениях, которые определяют область допустимых значений. Цель и ограничения должны быть представлены в виде функций.
В моделях исследования операций переменные, от которых зависят ограничения и целевая функция, могут быть дискретными (чаще всего целочисленными) и континуальными (непрерывными). В свою очередь, ограничения и целевая функция делятся на линейные и нелинейные. Существуют различные методы решения данных моделей, наиболее известными и эффективными из них являются методы линейного программирования, когда целевая функция и все ограничения линейные. Для решения математических моделей других типов предназначены методы динамического программирования, целочисленного программирования, нелинейного программирования, многокритериальной оптимизации и методы сетевых моделей.
Для написания курсовой работы будут взяты данные из разных источников: учебные пособия по исследованию операций, учебники по математическим методам и моделям в управлении, по информатике, математическим методам оптимизации и экономической теории, динамическому программированию, а также будет использоваться программа расчетов MathCAD.
Итерационная природа алгоритмов обычно приводит к объемным однотипным вычислениям. В этом и заключается причина того, что эти алгоритмы разрабатываются, в основном, для реализации с помощью вычислительной техники.
1 Теоретическая часть
1.1 Задача динамического
Большинство методов исследования операций связано в первую очередь с задачами вполне определенного содержания. Классический аппарат математики оказался малопригодным для решения многих задач оптимизации, включающих большое число переменных и/или ограничений в виде неравенств. Несомненна привлекательность идеи разбиения задачи большой размерности на подзадачи меньшей размерности, включающие всего по нескольких переменных, и последующего решения общей задачи по частям. Именно на этой идее основан метод динамического программирования.
Динамическое программирование (ДП) представляет собой математический метод, заслуга создания и развития которого принадлежит прежде всего Беллману. Метод можно использовать для решения весьма широкого круга задач, включая задачи распределения ресурсов, замены и управления запасами, задачи о загрузке. Характерным для динамического программирования является подход к решению задачи по этапам, с каждым из которых ассоциирована одна управляемая переменная. Набор рекуррентных вычислительных процедур, связывающих различные этапы, обеспечивает получение допустимого оптимального решения задачи в целом при достижении последнего этапа.
Происхождение названия динамическое программирование, вероятно, связано с использованием методов ДП в задачах принятия решений через фиксированные промежутки времени (например, в задачах управления запасами). Однако методы ДП успешно применяются также для решения задач, в которых фактор времени не учитывается. По этой причине более удачным представляется термин многоэтапное программирование, отражающий пошаговый характер процесса решения задачи.
Фундаментальным принципом, положенным в основу теории ДП, является принцип оптимальности. По существу, он определяет порядок поэтапного решения допускающей декомпозицию задачи (это более приемлемый путь, чем непосредственное решение задачи в исходной постановке) с помощью рекуррентных вычислительных процедур.
Динамическое программирование позволяет осуществлять оптимальное планирование управляемых процессов. Под «управляемыми» понимаются процессы, на ход которых мы можем в той или другой степени влиять.
Пусть предполагается
к осуществлению некоторое
Сформулируем общий принцип, лежащий в основе решения всех задач динамического программирования («принцип оптимальности»):
«Каково бы ни было состояние системы S перед очередным шагом, надо выбрать управление на этом шаге так, чтобы выигрыш на данном шаге плюс оптимальный выигрыш на всех последующих шагах был максимальным».
Динамическое программирование – это поэтапное планирование многошагового процесса, при котором на каждом этапе оптимизируется только один шаг. Управление на каждом шаге должно выбираться с учетом всех его последствий в будущем.
При постановке
задач динамического
Выбрать параметры (фазовые координаты), характеризующие состояние S управляемой системы перед каждым шагом.
Расчленить операцию на этапы (шаги).
Выяснить набор шаговых управлений xi для каждого шага и налагаемые на них ограничения.
Определить какой выигрыш приносит на i-ом шаге управление xi, если перед этим система была в состоянии S, т.е. записать «функцию выигрыша»:
Определить, как изменяется состояние S системы S под влиянием управление xi на i-ом шаге: оно переходит в новое состояние
Записать основное рекуррентное уравнение динамического программирования, выражающее условный оптимальный выигрыш Wi(S) (начиная с i-го шага и до конца) через уже известную функцию Wi+1(S):
Этому выигрышу соответствует условное оптимальное управление на i-м шаге xi(S) (причем в уже известную функцию Wi+1(S) надо вместо S подставить измененное состояние
Произвести условную оптимизацию последнего (m-го) шага, задаваясь гаммой состояний S, из которых можно за один шаг дойти до конечного состояния, вычисляя для каждого из них условный оптимальный выигрыш по формуле
Произвести условную оптимизацию (m-1)-го, (m-2)-го и т.д. шагов по формуле, полагая в ней i=(m-1),(m-2),…, и для каждого из шагов указать условное оптимальное управление xi(S), при котором максимум достигается.
Заметим, что если состояние системы в начальный момент известно (а это обычно бывает так), то на первом шаге варьировать состояние системы не нужно - прямо находим оптимальный выигрыш для данного начального состояния S0. Это и есть оптимальный выигрыш за всю операцию
Произвести
безусловную оптимизацию
Данные
этапы рассматривались для
(если только выигрыши wi положительны). Эти задачи решаются точно так же, как задачи с аддитивным критерием, с той единственной разницей, что в основном уравнении (1.2) вместо знака «плюс» ставится знак «умножения»:
1.1 Примеры задач динамического программирования
Задача планирования рабочей силы:
При выполнении некоторых проектов число рабочих, необходимых для выполнения какого-либо проекта, регулируется путем их найма и увольнения. Поскольку как наем, так и увольнение рабочих связано с дополнительными затратами, необходимо определить, каким образом должна регулироваться численность рабочих в период реализации проекта.
Предположим, что проект будет выполнятся в течение n недель и минимальная потребность в рабочей силе на протяжении i-й недели составит bi рабочих. При идеальных условиях хотелось бы на протяжении i-й недели иметь в точности bi рабочих. Однако в зависимости от стоимостных показателей может быть более выгодным отклонение численности рабочей силы как в одну, так и в другую сторону от минимальных потребностей.
Если xi – количество работающих на протяжении i-й недели, то возможны затраты двух видов: 1) С1(xi- bi)-затраты, связанные с необходимостью содержать избыток xi - bi рабочей силы и 2) С2(xi- xi-1)-затраты, связанные с необходимостью дополнительного найма (xi- xi-1) рабочих.
Элементы модели динамического программирования определяются следующим образом:
Этап і представляется порядковым номером недели і, і=1,2,…n.
Вариантами решения на і-ом этапе являются значения xi – количество работающих на протяжении і-й недели.
Состоянием на і-м этапе является xi-1 – количество работающих на протяжении (і-1) –й недели (этапа).
Рекуррентное
уравнение динамического
где
Вычисления начинаются с этапа n при xn=bn и заканчиваются на этапе 1.
Задача замены оборудования:
Чем дольше механизм эксплуатируется, тем выше затраты на его обслуживание и ниже его производительность. Когда срок эксплуатации механизма достигает определенного уровня, может оказаться более выгодной его замена. Задача замены оборудования, таким образом, сводится к определению оптимального срока эксплуатации механизма.
Предположим, что мы занимаемся заменой механизмов на протяжении n лет. В начале каждого года принимается решение либо об эксплуатации механизма еще один год, либо о замене его новым.
Обозначим через r(t) и c(t) прибыль от эксплуатации t-летнего механизма на протяжении года и затраты на его обслуживание за этот же период. Далее пусть s(t) – стоимость продажи механизма, который эксплуатировался t лет. Стоимость приобретения нового механизма остается неизменной на протяжении всех лет и равна l.
Элементы модели динамического программирования таковы:
Этап і представляется порядковым номером года і, і=1,2,...n.
Вариантами решения на і-м этапе (т.е. для і-ого года) являются альтернативы: продолжить эксплуатацию или заменить механизм в начале і-ого года.
Состоянием на і-м этапе является срок эксплуатации t (возраст) механизма к началу і-ого года.
Пусть fi(t)-максимальная прибыль, получаемая за годы от і до n при условии, что в начале і-ого года имеется механизм t-летнего возраста.
Рекуррентное уравнение имеет следующий вид:
(1)-если эксплуатировать механизм,
(2)-если заменить механизм.
Задача инвестирования:
Предположим, что в начале каждого из следующих n лет необходимо сделать инвестиции P1, P2,…, Pn соответственно. Вы имеете возможность вложить капитал в два банка: первый банк выплачивает годовой сложный процент r1, а второй - r2. Для поощрения депозитов оба банка выплачивают новым инвесторам премии в виде процента от вложенной суммы.
Премиальные меняются от года к году, и для і-ого года равны qi1 и qi2 в первом и втором банках соответственно. Они выплачиваются к концу года, на протяжении которого сделан вклад, и могут быть инвестированы в один из двух банков на следующий год. Это значит, что лишь указанные проценты и новые деньги могут быть инвестированы в один из двух банков. Размещенный в банке вклад должен находится там до конца рассматриваемого периода. Необходимо разработать стратегию инвестиции на следующие n лет.
Элементы модели динамического программирования следующие:
Этап і представляется порядковым номером года і, і=1,2,...n
Вариантами решения на і-м этапе (для і-ого года) являются суммы li и инвестиций в первый и второй банк соответственно.
Состоянием xi на і-м этапе является сумма денег на начало і-ого года, которые могут быть инветсированы.
Заметим, что по определению =xi-li. Следовательно,
где і=2,3,…n, x1=P1. Сумма денег xi, которые могут быть инвестированы, включает лишь новые деньги и премиальные проценты за инвестиции, сделанные на протяжении (і-1)-го года.
Пусть fi(xi)- оптимальная сумма инвестиций для интервала от і-го до n-го года при условии, что в начале і-го года имеется денежная сумма xi. Далее обозначим через si накопленную сумму к концу n-го года при условии, что li и (xi-li)-объемы инвестиций на протяжении і-го года в первый и второй банк соответственно. Обозначая , і=1,2, мы можем сформулировать задачу в следующем виде.
Максимизировать z=s1+s2+…+sn, где
Так как премиальные за n-й год являются частью накопленной денежной суммы от инвестиций, в выражения для sn добавлены qn1 и qn2.
Итак, в данном случае рекуррентное уравнение для обратной прогонки в алгоритме динамического программирования имеет вид
где xi+1 выражается через xi в соответствии с приведенной выше формулой, а fn+1(xn+1)=0.
1.2 Общая структура динамического программирования
Отыскание оптимальной стратегии принятия набора последовательных решений, в большинстве случаях, производится следующим образом: сначала осуществляется выбор последнего во времени решения, затем при движении в направлении, обратном течению времени, выбираются все остальные решения вплоть до исходного.
Для реализации такого метода необходимо выяснить все ситуации, в которых может происходить выбор последнего решения. Обычно условия, в которых принимается решение, называют «состоянием» системы. Состояние системы – это описание системы, позволяющее, учитывая будущие решения, предсказать ее поведение. Нет необходимости выяснять, как возникло то ил иное состояние или каковы были предшествующие решения. Это позволяет последовательно выбирать всего по одному решению в каждый момент времени. Независимо от того, отыскивают оптимальные решения с помощью табличного метода и последующего поиска или аналитическим путем, обычно быстрее и выгоднее производить выбор по одному решению в один момент времени, переходя затем к следующему моменту и т.д. К сожалению, таким методом можно исследовать не все процессы принятия решений. Необходимым условием применения метода динамического программирования является аддитивность цен всех решений, а также независимость будущих результатов от предыстории того или иного состояния.
Если
число решений очень велико, то
можно построить относительные
оценки состояний так, чтобы оценки,
отвечающие каждой паре последовательных
решений, отличались друг от друга на
постоянную величину, представляющую
собой средний «доход» на решение.
Также можно выполнять
1.4 Примеры решения задач динамического программирования
Последовательность
Фибоначчи Fn задается
формулами: F1 = 1, F2 = 1,
Fn = Fn – 1 + Fn –
2 при n > 1. Необходимо найти Fn по
номеру n.
Один из способов решения, который может
показаться логичным и эффективным, —
решение с помощью рекурсии:
int F(int n) {
if (n < 2) return 1;
else return F(n - 1) + F(n - 2);
Используя такую функцию,
мы будем решать задачу «с конца» —
будем шаг за шагом уменьшать n, пока не дойдем до известных
значений.
Но как можно заметить, такая, казалось
бы, простая программа уже при n = 40 работает заметно долго.
Это связано с тем, что одни и те же промежуточные
данные вычисляются по несколько раз —
число операций нарастает с той же скоростью,
с какой растут числа Фибоначчи — экспоненциально.
Один из выходов из данной ситуации —
сохранение уже найденных промежуточных
результатов с целью их повторного использования:
int F(int n) {
if (A[n] != -1) return A[n];
if (n < 2) return 1;
else {
A[n] = F(n - 1) + F(n - 2);
return A[n];
Приведенное решение является корректным
и эффективным. Но для данной задачи
применимо и более простое решение:
F[0] = 1;
F[1] = 1;
for (i = 2; i < n; i++) F[i] = F[i - 1] + F[i - 2];
Такое решение можно назвать решением
«с начала» — мы первым делом
заполняем известные значения, затем находим
первое неизвестное значение (F3),
потом следующее и т.д., пока не дойдем
до нужного.
Именно такое решение и является классическим
для динамического программирования:
мы сначала решили все подзадачи (нашли
все Fi для i < n), затем, зная
решения подзадач, нашли ответ (Fn = Fn –
1 +Fn – 2, Fn – 1 и Fn – 2 уже найдены).
Одномерное динамическое программирование
Чтобы лучше понять суть динамического
программирования, сначала более
формально определим понятия задачи и
подзадачи.
Пусть исходная задача заключается в нахождении
некоторого числа T при
исходных данных n1, n2, ..., nk. То есть мы можем говорить о функции T(n1, n2, ..., nk), значение
которой и есть необходимый нам ответ.
Тогда подзадачами будем считать задачи
T(i1, i2, ..., ik) при i1 < n1, i2 < n2, ..., ik < nk.
Далее мы будем о говорить об одномерном,
двумерном и многомерном
Следующая задача одномерного динамического
программирования встречается в различных
вариациях.
Задача 1. Посчитать число последовательностей
нулей и единиц длины n, в которых не встречаются две идущие
подряд единицы.
При n < 32 полный
перебор потребует нескольких секунд,
а при n = 64 полный перебор
не осуществим в принципе. Для решения
задачи методом динамического программирования
сведем исходную задачу к подзадачам.
При n = 1, n = 2 ответ
очевиден. Допустим, что мы уже нашли Kn – 1, Kn –
2 —
число таких последовательностей длины n – 1 и n – 2.
Посмотрим, какой может быть последовательность
длины n. Если последний ее символ равен 0, то
первыеn – 1 — любая правильная последовательность
длины
n – 1 (не
важно, заканчивается она нулем или единицей
— следом идет 0). Таких последовательностей
всего Kn –
1. Если последний символ равен 1, то
предпоследний символ обязательно должен
быть равен 0 (иначе будет две единицы подряд),
а первые
n – 2 символа
— любая правильная последовательность
длины n – 2,
число таких последовательностей равно Kn – 2.
Таким образом, K1 = 2, K2 = 3, Kn = Kn – 1 + Kn – 2 при n >
2. То есть данная задача фактически сводится
к нахождению чисел Фибоначчи.
Двумерное динамическое программирование
Классической задачей
В разных формулировках необходимо посчитать
число маршрутов или найти маршрут, который
является лучшим в некотором смысле.
Приведем пару формулировок таких
задач:
Задача 2. Дано прямоугольное поле размером n*m клеток. Можно совершать шаги длиной
в одну клетку вправо или вниз. Посчитать,
сколькими способами можно попасть из
левой верхней клетки в правую нижнюю.
Задача 3. Дано прямоугольное поле размером n*m клеток. Можно совершать шаги длиной
в одну клетку вправо, вниз или по диагонали
вправо-вниз. В каждой клетке записано
некоторое натуральное число. Необходимо
попасть из верхней левой клетки в правую
нижнюю. Вес маршрута вычисляется как
сумма чисел со всех посещенных клеток.
Необходимо найти маршрут с минимальным
весом.
Для всех таких задач характерным является
то, что каждый отдельный маршрут не может
пройти два или более раз по одной и той
же клетке.
Рассмотрим более подробно задачу 2. В
некоторую клетку с координатами (i,j) можно
прийти только сверху или слева, то есть
из клеток с координатами (i – 1, j)
и (i, j – 1):
Таким образом, для клетки (i, j) число маршрутов A[i][j] будет равно
A[i – 1][j] + A[i][j – 1], то есть задача сводится
к двум подзадачам. В данной реализации
используется два параметра — i и j — поэтому применительно к данной задаче
мы говорим о двумерном динамическом программировании.
Теперь мы можем пройти последовательно
по строкам (или по столбцам) массива A,
находя число маршрутов для текущей клетки
по приведенной выше формуле. Предварительно
в A[0][0] необходимо поместить число 1.
В задаче 3 в клетку с координатами (i, j) мы можем попасть
из клеток с координатами
(i – 1,
j), (i, j – 1) и (i – 1, j – 1).
Допустим, что для каждой из этих трех
клеток мы уже нашли маршрут минимального
веса, а сами веса поместили в W[i – 1][j],
W[i][j – 1],
W[i – 1][j – 1]. Чтобы найти минимальный вес
для (i, j), необходимо выбрать минимальный из
весов W[i – 1][j], W[i][j – 1], W[i – 1][j – 1] и прибавить
к нему число, записанное в текущей клетке:
W[i][j] = min(W[i–1][j], W[i][j – 1], W[i – 1][j – 1]) + A[i][j];
Данная задача осложнена тем, что необходимо
найти не только минимальный вес, но и
сам маршрут. Поэтому в другой массив мы
дополнительно для каждой клетки будем
записывать, с какой стороны в нее надо
попасть.
На следующем рисунке приведен пример
исходных данных и одного из шагов алгоритма.
В каждую из уже пройденных клеток ведет
ровно одна стрелка. Эта стрелка показывает,
с какой стороны необходимо прийти в эту
клетку, чтобы получить минимальный вес,
записанный в клетке.
После прохождения всего массива необходимо
будет проследить сам маршрут из последней
клетки, следуя по стрелкам в обратную
сторону.
2 Решение задачи
Решите задачу параметрического программирования:
Стоимость товаров четырёх видов меняется с течением времени по следующим законам:
- для товара первого вида (в количестве x1) à (1 + t),
- для товара второго вида (в количестве x2) à (7 - 0.4*t),
- для товара третьего вида (в количестве x3) à (4- 0.2*t),
- для товара четвёртого первого вида (в количестве x4) à (5 - 0.3*t),
Требуется найти максимум стоимости всей партии товаров
при изменении времени t=1,5,8,12
и дополнительных ограничениях, задаваемых условиями хранения товаров:
x1 + x2 + 2*x3 - x4 £ 5,
x1 + x2 + x4 £ 17,
x1 + + x3 +2*x4 £ 30 ,
Решение задачи в Mathcad:
Простая линейная регрессия позволяет найти линейную зависимость между одной входной и одной выходной переменными. Для этого определяется уравнение регрессии – это модель, отражающая зависимость значений Y, зависимой величины Y от значений х, независимой переменной х и генеральной совокупности, описывается уровнением:
где А0 – свободный член уравнения регрессии;
А1 – коэффициент уравнения регрессии
Затем строится соответствующая прямая, называемая линией регрессии. Коэффициенты А0 и А1, называемые также параметрами модели, выбираются таким образом, чтобы сумма квадратов отклонений точек, соответствующих реальным наблюдениям данных, от линии регрессии, была бы минимальной. Подбор коэффициентов производится по методу наименьших квадратов. Иными словами, простая линейная регрессия описывает линейную модель, которая наилучшим образом аппроксимирует зависимость между одной входной и одной выходной переменными.
Цели регрессионного анализа
- Определение наличия и характера (математического уравнения, описывающего зависимость) связи между переменными
- Определение степени детерминированности вариации критеральной переменной предикторами
- Предсказать значение зависимой переменной с помощью независимой
- Определить вклад независимых переменных в вариацию зависимой
Найдем значения коэффициента регрессии (А) и сводного члена уравнения регрессии (А1)
- Представление исходной информации в виде векторов
- Определение суммы элементов векторов и произведений векторов:
- Определение параметров уравнения регрессии
- Свободный член уравнения регрессии А
- Коэффициент уравнения регрессии А1
- Графическое изображение линии уравнения ре
грессии и точек кор-реляции
Определим параметры уравнения регрессии А и А1 с помощью встроенных функций системы MathCad
- intercept (X,Y) - коэффициент А линейной регрессии;
- slope (X,Y) - коэффициент А1 линейной регрессии;
- corr(X,Y) - коэффициент корреляции
- Определение свободного члена уравнения регрессии А с помощью встроенной функции intercept(X.Y)
- Определение коэффициента уравнения регрессии А1 с помощью встроенной функции slope(X.Y)
- Определим коэффициент корреляции R с помощью встроенной функции corr(X,Y)
Определим стандартную ошибку предсказания являющейся мерой качества реальной зависимости величинами Y и х с помощью уравнения линейной регрессии.
Мерой качества приближенного описания реальной зависимости между величинами Y и х с помощью уравнения линейной регрессии является стандартное отклонение значений у от регрессионной прямой, вычисляемое по формуле:
SYX является мерой точности предсказания значений случайной величины Y по заданным значениям величины х, поэтому SYX называют также стандартной ошибкой предсказания.

- Динамическое программирование
- Динамическое программирование
- Динамическое программирование (
- Динамическое программирование в экономике
- Динамическое программирование (задача о загрузке)
- Динамическое программирование. Задача о замене оборудования
- Динамическое программирование. Задачи об инвестировании
- Динамическое программирование
- Динамическое программирование
- Динамическое программирование
- Динамическое программирование
- Динамическое программирование
- Динамическое программирование
- Динамическое программирование