Семинар 3- задание
Задание
1. Выбрать один из 1 вариантов (см. ниже) задания, за исключением разобранного примера
2. Выполнить реализацию примера, используя методические указания
Методические указания
Цель задания: Освоить применение динамического программирования (ДП) для решения базовых задач исследования операций. Научиться формализовать задачу, выявлять оптимальную подструктуру, строить и заполнять таблицы решений в Excel.
Ключевые принципы ИО, применяемые в ДП:
Оптимальность Беллмана: Оптимальное решение задачи обладает тем свойством, что каково бы ни было первоначальное состояние и первоначальное решение, последующие решения должны составлять оптимальную политику относительно состояния, полученного в результате первого решения.
Многоэтапность принятия решений: Задача разбивается на этапы (шаги). На каждом этапе принимается решение, которое влияет на состояние системы.
Целевая функция: Функция, которую необходимо оптимизировать (максимизировать прибыль, минимизировать затраты или время).
Общий алгоритм выполнения в Excel:
Определите этапы (Stages): Что представляет собой один шаг? (например, распределение ресурса на один проект, планирование одного временного периода).
Определите состояния (States): Что характеризует систему на каждом этапе? (например, количество доступных ресурсов, оставшееся время).
Определите решение (Decision): Какое решение принимается на каждом этапе? (например, сколько ресурсов выделить на проект).
Выведите рекуррентное соотношение: Как целевая функция на текущем этапе зависит от решений и состояния?
Постройте таблицу в Excel:
Строки: Возможные состояния на текущем этапе.
Столбцы: Возможные решения на текущем этапе.
Ячейки: Значение целевой функции для данного состояния и решения + оптимальное значение с предыдущих этапов.
Найдите глобальный оптимум: Ответом является значение в ячейке, соответствующей начальному состоянию на последнем этапе.
Базовая реализация (Пример для варианта №1)
Задача: "Задача о распределении инвестиций" (Упрощенная версия)
Условие: Инвестор имеет 5 млн. долл. (W = 5), которые можно распределить между тремя проектами. Прибыль от каждого проекта в зависимости от вложенной суммы известна. Найти план распределения, максимизирующий суммарную прибыль.
| x (вложения) | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| f₁(x) | 0 | 3 | 5 | 7 | 8 | 10 |
| f₂(x) | 0 | 4 | 6 | 7 | 8 | 9 |
| f₃(x) | 0 | 2 | 4 | 6 | 8 | 9 |
Реализация в Excel (модуль "Поиск решения" не требуется, используется чистое ДП):
Этапы: Проекты (3, 2, 1).
Состояние (
w): Количество миллионов, доступных для распределения на текущем и всех предыдущих проектах.Решение (
x_i): Сколько миллионов выделить на i-й проект.Рекуррентное соотношение:
dp_i(w) = max_{0 ≤ x ≤ w} [ f_i(x) + dp_{i+1}(w - x) ]dp_4(w) = 0(базовый случай: после всех проектов прибыль равна 0)
Структура листа Excel:
Лист "Этап 3" (последний проект): Рассчитывается
dp_3(w) = f₃(w)для всехwот 0 до 5.Лист "Этап 2": Таблица с состояниями
w(0..5) и решениямиx(0..w). Формула в ячейке:=f₂(x) + VLOOKUP(w-x, 'Этап 3'!A:B, 2, FALSE). Затем для каждогоwнаходитсяMAXпо всемx.Лист "Этап 1": Аналогично этапу 2. Ответ находится для
w=5.
10 вариантов заданий равной сложности (Исследование операций)
Задача о загрузке (Рюкзак 0-1). Судно имеет грузоподъемность
W. Естьnгрузов, каждый имеет весw_iи стоимостьc_i. Максимизировать общую стоимость груза без перегрузки. (dp[i][j] = max( dp[i-1][j], c_i + dp[i-1][j - w_i] )).Задача о планировании производства. Необходимо составить план производства на
nмесяцев. Известны: затраты на производство, стоимость хранения единицы продукции, спрос. Минимизировать общие затраты (производство + хранение). (dp[month][inventory] = min_{produce} [ prod_cost(produce) + hold_cost(inventory) + dp[month+1][inventory + produce - demand] ]).Задача замены оборудования. Требуется составить план замены оборудования возраста
aнаTлет. Известны: стоимость нового оборудования, доход от оборудования в зависимости от возраста, стоимость обслуживания, продажная стоимость. Максимизировать чистый доход за период. (dp[year][age] = max( keep: income(age) - maint_cost(age) + dp[year+1][age+1], replace: income(0) - new_cost + sell_price(age) + dp[year+1][1] )).Задача управления запасами. Определить объем заказа на каждом из
nпериодов, чтобы удовлетворить спросd_tс минимальными затратами (заказ + хранение). Есть ограничение на складскую емкость. (dp[period][start_inv] = min_{order} [ order_cost(order) + hold_cost(end_inv) + dp[period+1][end_inv] ], где end_inv = start_inv + order - d_t).Задача о назначениях. Имеется
nработ иnисполнителей. Каждый исполнитель выполняет каждую работу с разной эффективностьюc[i][j]. Назначить исполнителей на работы так, чтобы минимизировать суммарные затраты. (dp[mask]- минимальная стоимость назначения первыхkисполнителей на работы, заданные битовой маскойmask).Задача о рекламных кампаниях. Имеется бюджет
B. Естьnрекламных площадок. Для каждой известна функцияclicks_i(x)— количество кликов в зависимости от вложенной суммыx. Максимизировать общее количество кликов. (Аналогично задаче о распределении инвестиций).Задача о маршрутизации (кратчайший путь). Найти путь от узла
Aдо узлаBв сети с минимальной общей длиной/стоимостью. (dp[node] = min_{prev_node} [ dp[prev_node] + cost(prev_node, node) ]). Решается алгоритмом Беллмана.Задача календарного планирования (Deadline). Есть
nзаказов. По каждому известна длительностьd_i, дедлайнdeadline_iи штрафp_iза просрочку. Найти порядок выполнения, минимизирующий суммарный штраф. (Использовать ДП по битовым маскам:dp[mask][time]- мин. штраф для набора заказовmask, законченных к времениtime).Задача о разбиении множества. Можно ли разбить множество натуральных чисел на два подмножества с равными суммами? (
dp[i][s] = true, если суммуsможно получить из первыхiэлементов.dp[0][0]=true).Задача о надежности системы. Система состоит из
nпоследовательно соединенных элементов. Для повышения надежности можно добавить параллельно дубликаты для каждого элемента. Задана стоимость добавленияkдубликатов кi-му элементу и вероятность его безотказной работы. Максимизировать надежность системы при ограничении на общую стоимость. (dp[i][budget] = max_{spent} [ rel_i(k) * dp[i+1][budget - spent] ]).
Детализация варианта 1 (Задача о рюкзаке) в Excel
Цель: Наглядно продемонстрировать заполнение таблицы ДП.
Шаги реализации:
Входные данные: Создайте таблицу с
nстроками (предметы) и колонками:Вес (w_i),Стоимость (c_i).Таблица ДП: Создайте двумерную таблицу. Строки
i = 0..n(предметы), столбцыj = 0..W(доступный вес).Базовый случай: Заполните первую строку (
i=0):dp[0][j] = 0для всехj.Рекуррентное соотношение: В ячейке
B3(соответствующейi=1,j=0) формула:=ЕСЛИ(B$1 >= $A3; МАКС(B2; $D3 + СМЕЩЕНИЕ($A$2; $A3-1; B$1 - $A3)); B2)B$1- ссылка на доступный вес (заголовок столбца).$A3- ссылка на вес текущего предмета (предполагается, что в столбцеAуказаны веса).B2- значение ячейки прямо сверху (dp[i-1][j]).$D3- стоимость текущего предмета.СМЕЩЕНИЕ(...)- находит значениеdp[i-1][j - w_i].
Автозаполнение: Скопируйте эту формулу на всю таблицу.
Ответ: Находится в ячейке на пересечении
i=nиj=W.