WikiDer > Проблема выбора деятельности

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     возвращаться выбрать[п]

Рекомендации

внешняя ссылка