1p1sumu
Версия от 22:14, 8 июня 2016; Веда (обсуждение | вклад)
Задача: |
Дан один станок и | работ, для которых заданы их дедлайны , а все времена выполнения на этом станке . Нужно успеть выполнить как можно больше работ.
Содержание
Алгоритм
Чтобы получить оптимальное расписание, будем строить максимальное множество
тех работ, которые успеют выполниться. Само расписание тогда будет состоять из всех работ из , упорядоченных по неубыванию дедлайнов. Во время сортировки стоит учитывать, что дедлайны могут значительно превосходить количество задач. В таком случае необходимо предварительно пересчитать дедлайны по формуле (в оптимальном расписании мы не выполняем работы позже времени ). Для упорядочивания дедлайнов будем использовать карманную сортировку(bucket sort).Псевдокод
schedule(d: int[n]): int[]
int[] S = []
int time = 0
for i = 1 to n do
d[i] = min(d[i], n)
Сортиуем d
for i = 1 to n do
if time < d[i]
S = S +=
1
return S
{i}
time Во избежание лишнего копирования массивов, мы можем делать проход по массиву блоков(bucket'ов) и для каждого блока проходить по спискам работ внутри него. Начальное значение
. После рассмотрения очередной работы мы будем добавлять ее в расписание и увеличивать на 1. Тогда, если значение становится равным номеру блока, то мы переходим к следующему блоку, а нерассмотренные задачи помечаем как просроченные и выполняем в конце.Время работы
Cортировку работ по неубыванию дедлайнов осуществляем с помощью карманной сортировки за
, а значит и весь алгоритм будет работать за .Корректность и оптимальность
В результате выполнения данного алгоритма будет получено корректное расписание, в котором каждая работа встречается не более одного раза. Вначале расписания будут стоять все работы, которые мы успеваем выполнить до дедлайна. Остальные работы дописываются в конец в произвольном порядке.
Оптимальность полученного расписания доказывается аналогично .
См. также
Источники информации
- Peter Brucker. «Scheduling Algorithms» — «Springer», 2006 г. — 86 стр. — ISBN 978-3-540-69515-8