Семинар 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
.