Проблема выбора деятельности - Activity selection problem
В проблема выбора деятельности это комбинаторная оптимизация проблема выбора неконфликтных виды деятельности выполнять в рамках заданного временное ограничение, учитывая набор действий, каждое из которых отмечено временем начала (ся) и время окончания (fя). Проблема состоит в том, чтобы выбрать максимальное количество действий, которые может выполнять один человек или машина, предполагая, что человек может работать только над одним действием за раз. В проблема выбора деятельности также известен как Задача максимизации интервального планирования (ISMP), который является особым типом более общего Интервальное планирование проблема.
Классическое применение этой проблемы - планирование комнаты для нескольких конкурирующий события, каждое из которых имеет свои временные требования (время начала и окончания), и многие другие возникают в рамках исследование операций.
Формальное определение
Предположим, что существуют п действия, каждое из которых представлено временем начала sя и закончить время жя. Два занятия я и j считаются неконфликтными, если sя ≥ жj или же sj ≥ жя. Проблема выбора деятельности состоит в нахождении максимального набора решений (S) неконфликтных действий, или, точнее, не должно существовать набор решений S 'такая, что | S' | > | S | в случае, если несколько максимальных решений имеют одинаковые размеры.
Оптимальное решение
Проблема выбора деятельности примечательна тем, что использование жадный алгоритм найти решение всегда приведет к Оптимальное решение. А псевдокод набросок итерационной версии алгоритма и доказательство оптимальности его результата приведены ниже.
Алгоритм
1 Жадный-Итеративный-Мероприятия-Селектор(А, s, ж): 2 3 Сортировать А к Конец раз хранится в 4 S = {А[1]} 5 k = 1 6 7 п = А.длина 8 9 за я = 2 к п:10 если s[я] ≥ ж[k]: 11 S = S U {А[я]}12 k = я13 14 возвращаться S
Объяснение
Строка 1: Этот алгоритм называется Жадный-итеративный-селектор активности, потому что это в первую очередь жадный алгоритм, а затем итеративный. Есть также рекурсивная версия этого жадного алгоритма.
- это массив, содержащий виды деятельности.
- это массив, содержащий время начала деятельности в .
- это массив, содержащий время окончания деятельности в .
Обратите внимание, что эти массивы индексируются от 1 до длины соответствующего массива.
Строка 3: Сортирует в возрастающий порядок времени окончания спектр мероприятий используя время окончания, хранящееся в массиве . Эту операцию можно выполнить в time, используя, например, алгоритмы сортировки слиянием, сортировки кучи или быстрой сортировки.
Строка 4: Создает набор хранить избранные мероприятия, и инициализирует его действием у которого самое раннее время окончания.
Строка 5: Создает переменную отслеживает индекс последнего выбранного действия.
Строка 9: Начинает итерацию со второго элемента этого массива до последнего элемента.
Строки 10,11: Если начальное время из Мероприятия () больше или равно время окончания из последнее выбранное действие (), тогда совместим с выбранными видами деятельности в наборе , и поэтому его можно добавить к .
Строка 12: Индекс последнего выбранного действия обновляется до только что добавленного действия. .
Доказательство оптимальности
Позволять - набор мероприятий, упорядоченный по времени окончания. Предположить, что оптимальное решение, в том числе по срокам отделки; и что индекс первой активности в А является , т.е. это оптимальное решение не начнем с жадного выбора. Мы покажем, что , который начинается с жадного выбора (действие 1), является еще одним оптимальным решением. С , а действия в A - непересекающийся по определению, активности в B также не пересекаются. С B имеет такое же количество действий, что и А, то есть, , B тоже оптимально.
Когда жадный выбор сделан, проблема сводится к поиску оптимального решения подзадачи. Если А оптимальное решение исходной задачи S содержащий жадный выбор, тогда оптимальное решение задачи выбора деятельности .
Почему? Если это не так, выберите решение B' к S′ С большим количеством занятий, чем А'Содержащий жадный выбор для S′. Затем, добавив 1 к B'Даст допустимое решение B к S с большим количеством мероприятий, чем А, что противоречит оптимальности.
Проблема выбора взвешенной деятельности
Обобщенная версия задачи выбора действий включает в себя выбор оптимального набора неперекрывающихся действий, так чтобы общий вес был максимальным. В отличие от невзвешенной версии, здесь нет жадного решения проблемы выбора взвешенных действий. Однако динамическое программирование Решение легко получить, используя следующий подход:[1]
Рассмотрим оптимальное решение, содержащее активность k. Теперь у нас есть неперекрывающиеся действия слева и справа от k. Мы можем рекурсивно найти решения для этих двух наборов благодаря оптимальной подструктуре. Как мы не знаем k, мы можем попробовать каждое из занятий. Такой подход приводит к решение. Это можно оптимизировать в дальнейшем, учитывая, что для каждого набора действий в , мы можем найти оптимальное решение, если бы знали решение для , куда т это последний неперекрывающийся интервал с j в . Это дает решение. Это можно дополнительно оптимизировать, учитывая тот факт, что нам не нужно учитывать все диапазоны но вместо этого просто . Таким образом, следующий алгоритм дает решение:
1 Взвешенный-Мероприятия-Выбор(S): // S = список действий 2 3 Сортировать S к Конец время 4 выбрать[0] = 0 // opt [j] представляет оптимальное решение (сумму весов выбранных действий) для S [1,2 .., j] 5 6 за я = 1 к п: 7 т = двоичный поиск к найти Мероприятия с Конец время <= Начните время за я 8 // если таких действий несколько, выберите то, время окончания которого было последним 9 выбрать[я] = МАКСИМУМ(выбрать[я-1], выбрать[т] + ш(я))10 11 возвращаться выбрать[п]