1p1sumu
Задача: |
Дан один станок и | работ, для которых заданы их дедлайны , а все времена выполнения на этом станке . Нужно успеть выполнить как можно больше работ.
Содержание
Алгоритм
Чтобы получить оптимальное расписание, будем строить максимальное множество
тех работ, которые успеют выполниться. Само расписание тогда будет состоять из всех работ из , упорядоченных по неубыванию дедлайнов. Будем добавлять в работы в порядке неубывания значений , если успеваем их выполнить.Псевдокод
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 Время работы
Cортировку работ по неубыванию дедлайнов осуществляем с помощью сортировки подсчетом за
, а значит и весь алгоритм будет работать за . Во время сортировки стоит учитывать, что дедлайны могут значительно превосходить количество задач. В таком случае необходимо предварительно пересчитать дедлайны по формуле (в оптимальном расписании мы не выполняем работы позже времени ).Корректность и оптимальность
В результате выполнения данного алгоритма будет получено корректное расписание, в котором каждая работа встречается не более одного раза. Оптимальность полученного расписания доказывается аналогично .
См. также
Источники информации
- Peter Brucker. «Scheduling Algorithms» — «Springer», 2006 г. — 86 стр. — ISBN 978-3-540-69515-8