Как решать задачи по динамическому программированию
Методы динамического программирования применяются при решении оптимизационных задач, в которых целевая функция или ограничения, или же и первое, и второе одновременно характеризуются нелинейными зависимостями.Данный раздел представлен следующими калькуляторами:
- Задача распределения инвестиций. Распределении инвестиций между предприятиями П1, П2,…, Пn. Инвестируемая сумма E усл. ден. ед.
- Задача распределения ресурсов. Планируется работа двух предприятий на n лет. Начальные ресурсы равны s0.
- Метод прогонки.
- Задача замены оборудования.
- Складская задача: составить оптимальную программу выпуска продукции X, которая минимизирует суммарные издержки предприятия.
- Задача Джонсона.
- Задача о рюкзаке (решение задачи о загрузке транспортного средства).
- Динамическая оптимизация в планировании работ
В условиях задачи производственного планирования найти оптимальные сроки начала строительства каждого из объектов так, чтобы суммарный срок строительства всех объектов был бы минимальным.Объекты / Стадии №1 №2 №3 №4 A1 2 5 4 3 A2 1 4 2 6 A3 3 4 3 4
Задача распределения инвестиций
В задачах данного типа заданы сумма инвестиций (или сумма для распределения) и таблица планируемой прибыли. Если сумма для распределения явно не задана, то ее можно найти из таблицы — она равна максимальному значению xi (последняя строчка таблицы).Таблицы могут иметь разный вид.
Таблица 1 — Первый вариант таблицы исходных данных
x | f1(x) | f2(x) | f3(x) |
1 | 6.3 | 4 | 5 |
2 | 5.2 | 6 | 7 |
3 | 4.3 | 4.6 | 7.8 |
4 | 5 | 6 | 3 |
5* | 7 | 6.3 | 8.2 |
Таблица 2 — Второй вариант таблицы исходных данных
x | 0 | 10 | 20 | 30 | 40 |
f1(x) | 0 | 4 | 5 | 7 | 8 |
f2(x) | 0 | 3 | 3 | 4 | 6 |
f3(x) | 0 | 4 | 4 | 5 | 6 |
Пример задачи.
Для двух предприятий выделено A единиц средств. Как распределить все средства в течение 4 лет, чтобы доход был наибольшим, если известно, что доход от x единиц средств, вложенных в первое предприятие, равен f1(х), а доход от y единиц средств, вложенных во второе предприятие, равен f2(y). Остаток средств к концу года составляет g1(x) для первого предприятия и g2(y) для второго предприятия. Задачу решить методом динамического программирования.
При вводе данных первую нулевую строку можно не заполнять.
В сервисе Задача распределения инвестиций используется метод обратной прогонки.
Метод прогонки
Данная задача соответствует задаче распределения инвестиций. Разница состоит в оформлении результатов полученного решения и применения метода прямой прогонки.В сервисе Метод прогонки необходимо также выбрать метод решения: процедура прямой или обратной прогонки.
Задача замены оборудования
Цель решения — определить на каких шагах алгоритма (в какие годы) необходимо заменить оборудование. Для этого вводятся Период эксплуатации (в годах) и Стоимость нового оборудования. После этого необходимо заполнить таблицу дохода r(t) и остаточной стоимости S(t).Задача замены оборудования
Планирование производственной линии
Задача последовательной обработки на двух машинах N различных деталей, если известно время AЗадача Джонсона
Mетод динамического программирования. Примеры решения задач
Mетод динамического программирования
Задача1. Для двух предприятий выделено 1400 единиц денежных средств. Как распределить все средства в течение 4 лет, чтобы доход был наибольшим, если известно, что доход от х единиц, вложенных в первое предприятие равен , а доход от у единиц, вложенных в первое предприятие равен . Остаток средств к концу года составляет - для первого предприятия, - для второго предприятия. Решить задачу методом динамического программирования.
Решение
Процесс распределения средств разобъем на 4 этапа – по соответствующим годам.
Обозначим — средства, которые распределяются на к–ом шаге как сумма средств по предприятиям.
Суммарный доход от обоих предприятий на к–ом шаге:
Остаток средств от обоих предприятий на к–ом шаге:
Обозначим — максимальный доход, полученный от распределения средств между двумя предприятиями с к-го шага до конца рассматриваемого периода.
Рекуррентные соотношения Беллмана для этих функций
Проведем оптимизацию, начиная с четвертого шага:
4-й шаг.
Оптимальный доход равен: , т.к. линейная убывающая функция достигает максимума в начале рассматриваемого промежутка, т.
3-й шаг.
т.к. линейная убывающая функция достигает максимума в начале рассматриваемого промежутка, т.е. при .
2-й шаг.
т.к. линейная возрастающая функция достигает максимума в конце рассматриваемого промежутка, т.е. при .
1-й шаг.
т.к. линейная возрастающая функция достигает максимума в конце рассматриваемого промежутка, т.е. при .
Результаты оптимизации:
Определим количественное распределение средств по годам:
Т.к. , получаем
Представим распределение средств в виде таблицы:
предприятие | год | |||
1 | 2 | 3 | 4 | |
1 | 1400 | 700 | 0 | 0 |
2 | 0 | 0 | 350 | 105 |
При таком распределении средств за 4 года будет получен доход, равный
Задача 2. D1 D2 D3 D4 i0 k L h M B 3 3 5 4 - 2 4 1 1 6 7
Все необходимые числовые данные приведены в таблице. T
Решение
Для решения задачи методом динамического программирования и записи рекуррентного соотношения будем использовать следующие обозначения: n — номер планового отрезка времени периода; j — уровень запаса на конец отрезка;
cn(x,j)= c(x)+j h — затраты, связанные с выпуском х единиц продукции на n-м отрезке и содержанием запасов, объем которых на конец n-го отрезка равен единицу j; fn(i)— значение функции, равное затратам на производство и хранение продукции за последние n месяцев при условии, что уровень запасов на начало n-гo месяца составляет i единиц; xn(i)— производство продукции на n-м отрезке, если уровень запасов на начало отрезка равен i единиц. Изобразим плановый период на рисунке и для наглядности нанесем на него числовые данные
D1 = 3 D2 = 5 D3 = 4
i 0 = 2 n =3 n = 2 n = 1 j 4 = 0
d3 = 3 d2 = 5 d1 = 4
x3 x2 x1
Т.к. c(x)=k+Lxто c(0)=0; c(l)=5; c(2)=6; c(3)=7; c (4)=8; c(5)=9; c(6)=10; c(7)=11; Уровень запасов на конец планового периода должен быть равен нулю, то для n=0 имеем f0(0)=0. Перейдем к рассмотрению первого отрезка, т.е. n=1.
Тогда функциональные уравнения Беллмана для рассматриваемой задачи имеют следующий вид: для n =1
f1(i)=c1(d1-i, 0) = c1(d1-i, 0) , где i может принимать значения 0, 1, 2, 3, 4.
Расчет всех значений выполним в виде таблицы.
x i | X1* (i) | f1 (i) |
0 | 4 | 8 |
1 | 3 | 7 |
2 | 2 | 6 |
3 | 1 | 5 |
4 | 0 | 0 |
Переходим к анализу периода, состоящего из двух последних месяцев, т. е. n= 2. Тогда уравнение Беллмана примет вид:
(с2(x) + h(i +x- d2 ) + f1(i +x — d2)) , где i — уровень запаса сырья на начало предпоследнего месяца может принимать значения 0, 1, 2, 3, 4, 5, 6,
x будет равняться 7, 6, 5, 4 ,3, 2, 1, 0.
Расчет всех значений выполним в виде таблицы.
x i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | X2(i) | f2(i) |
0 | — | — | — | — | — | 9+0+8=17 | 10+1+7=18 | 11+2+6=19 | 5 | 17 |
1 | — | — | — | — | 8+0+8=16 | 9+1+7=17 | 10+2+6=18 | 11+3+5=19 | 4 | 16 |
2 | — | — | — | 7+0+8=15 | 8+1+7=16 | 9+2+6=17 | 10+3+5=18 | 11+4+0=15 | 3 | 15 |
3 | — | — | 6+0+8=14 | 7+1+7=15 | 8+2+6=16 | 9+3+5=17 | 10+4+0=14 | — | 2 | 14 |
4 | — | 5+0+8=13 | 6+1+7=14 | 7+2+6=15 | 8+3+5=16 | 9+4+0=13 | — | — | 1 | 13 |
5 | 0+0+8=8 | 5+1+7=13 | 6+2+6=14 | 7+3+5=15 | 8+4+0=12 | — | — | — | 0 | 8 |
6 | 0+1+7=8 | 5+2+6=13 | 6+3+5=14 | 7+4+0=14 | — | — | — | — | 0 | 8 |
Последнему шагу (n=3) будет соответствовать функциональное уравнение,
(с3(x) + h(2 +x- d3 ) + f2(2 +x – d3)), где i — уровень запаса сырья на начало предпоследнего месяца может принимать значение 2, а x будет равняться 7, 6, 5, 4 , 3, 2, 1.
Расчет всех значений выполним в виде таблицы. Таб. 4.4
x i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | x4(i) | f4(х) |
i 0 = 2 | 5+0+17 | 6+1+16 | 7+2+15 | 8+3+14 | 9+4+13 | 10+5+8 | 11+6+8 | 1 | 22 |
Из таблицы видно, что в первом месяце оптимальной будет поставка x3(2)=1 единицам. С учетом запаса 2 единиц, общее количество составит 3. За этот месяц будет израсходовано 3 единицы, так что к началу второго месяца запас составит i=0 единиц. По таб. 4.3 находим x2(0)=5, за этот месяц будет израсходовано 5 единиц. Останется 0 единица. В третьем месяце с учетом остатка 0 единиц будет поставка x1(0)=4 единицы, что достаточно для удовлетворения потребностей в третьем месяце. При этом к концу третьего месяца уровень запаса будет равен 0 ед.
Минимальные затраты, связанные с производством и хранением продукции за три месяца, составят 22 единицы.
Топ 50 практических задач динамического программирования | Кодирование Freak | Techie Delight
50 лучших практических задач динамического программирования | Кодирование Freak | Технарь Восторг | СреднийДинамическое программирование — это метод решения сложной проблемы путем разбиения ее на набор более простых подзадач, решения каждой из этих подзадач только один раз и сохранения их решений с использованием структуры данных в памяти (массив, карта и т. д.). Каждое из решений подзадачи каким-то образом индексируется, обычно на основе значений его входных параметров, чтобы облегчить его поиск. Таким образом, в следующий раз, когда возникает та же самая подзадача, вместо повторного вычисления ее решения просто просматривается ранее вычисленное решение, тем самым экономя время вычислений. Этот метод хранения решений подзадач вместо их пересчета называется мемоизацией.
Вот блестящее объяснение концепции динамического программирования на Quora. Ответ Джонатана Полсона на вопрос «Как объяснить динамическое программирование четырехлетнему ребенку?»
Ниже приведены 50 самых распространенных проблем со структурами данных, которые можно решить с помощью динамического программирования —
- Самая длинная общая подпоследовательность | Введение и длина LCS
- Самая длинная общая подпоследовательность | Поиск всех LCS
- Проблема с самой длинной общей подстрокой
- Самая длинная палиндромная подпоследовательность с использованием динамического программирования
- Проблема с самой длинной повторяющейся подпоследовательностью
- Утилита Diff для реализации
- Самая короткая общая суперпоследовательность | Введение и длина SCS
- Кратчайшая общая суперпоследовательность | Поиск всех SCS
- Самая длинная возрастающая подпоследовательность с использованием динамического программирования
- Самая длинная битоническая подпоследовательность
- Возрастающая подпоследовательность с максимальной суммой
- Задача о расстоянии Левенштейна (расстояние редактирования)
- Найти размер наибольшей квадратной подматрицы из 1-х присутствующих в заданной двоичной матрице
- Умножение цепочки матриц с помощью динамического программирования
- Найти минимальную стоимость достижения последней ячейки матрицы из ее первой ячейки
- Найти самую длинную последовательность, образованную соседними числами в матрице
- Подсчитать количество путей в матрице с заданной стоимостью до достичь ячейки назначения
- 0–1 Задача о рюкзаке
- Максимизация значения выражения
- Задача о разбиении | Решение динамического программирования
- Проблема суммы подмножеств
- Задача о разделе минимальной суммы
- Найти все двоичные строки из N цифр без последовательных единиц
- Задача обрезания стержня
- Обрезка стержня максимального продукта
- Задача о размене монет (неограниченное количество монет)
- Задача о размене монет (общее количество) способов получить номинал монет)
- Задача о самой длинной чередующейся подпоследовательности
- Подсчитайте, сколько раз образец появляется в заданной строке в виде подпоследовательности
- Соберите максимальное количество точек в матрице, удовлетворяя заданным ограничениям
- Подсчитайте общее количество возможных комбинаций N-значных чисел на клавиатуре мобильного телефона
- Найдите оптимальную стоимость построения двоичного дерева поиска
- Задача с разрывом слов | Динамическое программирование
- Проблема разрыва слов | Использование структуры данных Trie
- Всего возможных решений линейного уравнения k переменных
- Сопоставление шаблонов с подстановочными знаками
- Найти вероятность того, что человек выживет после N шагов на острове
- Вычислить сумму всех элементов в подматрице в константе время
- Найти подматрицу максимальной суммы в заданной матрице
- Найти подматрицу максимальной суммы, присутствующую в данной матрице
- Найти максимальную сумму подпоследовательности без соседних элементов
- Задача о максимальном подмассиве (алгоритм Кадане) Алгоритм Форда
- Кратчайшие пути для всех пар — Алгоритм Флойда Уоршалла
- Игра Pots of Gold с использованием динамического программирования
- Найдите минимальные разрезы, необходимые для палиндромного разбиения строки
- Змеиная последовательность максимальной длины
- Задача с тремя разделами
- Вычислить размер наибольшего плюса 1 в двоичной матрице
- Проверить, является ли данная строка чередованием двух других заданных строк
Программирование
0 АлгоритмыСтруктуры данных
Динамическое программирование
Вопросы для интервью
Ведущая платформа для подготовки технических интервью.