1p1sumu — различия между версиями
Веда (обсуждение | вклад) (→Алгоритм) |
Веда (обсуждение | вклад) (→Алгоритм) |
||
Строка 10: | Строка 10: | ||
Будем добавлять в <tex>S</tex> работы в порядке неубывания значений <tex>d_j</tex>, если успеваем их выполнить. | Будем добавлять в <tex>S</tex> работы в порядке неубывания значений <tex>d_j</tex>, если успеваем их выполнить. | ||
− | '''function''' | + | ==Псевдокод== |
+ | '''function''' schedule(d: '''int[n]'''): '''int[]''' | ||
S = <tex>\varnothing</tex> | S = <tex>\varnothing</tex> | ||
time = 0 | time = 0 | ||
'''for''' i = 1 '''to''' n '''do''' | '''for''' i = 1 '''to''' n '''do''' | ||
− | d[i] = min | + | d[i] = min(d[i], n) |
Сортиуем d подсчетом | Сортиуем d подсчетом | ||
'''for''' i = 1 '''to''' n '''do''' | '''for''' i = 1 '''to''' n '''do''' | ||
Строка 21: | Строка 22: | ||
time <code>+=</code> 1 | time <code>+=</code> 1 | ||
'''return''' S | '''return''' S | ||
− | + | ||
+ | ==Время работы== | ||
Cортировку работ по неубыванию дедлайнов осуществляем с помощью сортировки подсчетом за <tex>O(n)</tex>, а значит и весь алгоритм будет работать за <tex>O(n)</tex>. | Cортировку работ по неубыванию дедлайнов осуществляем с помощью сортировки подсчетом за <tex>O(n)</tex>, а значит и весь алгоритм будет работать за <tex>O(n)</tex>. | ||
− | Во время сортировки стоит учитывать, что дедлайны могут значительно превосходить количество задач. В таком случае необходимо предварительно пересчитать дедлайны по формуле <tex>d_i = \min\{d_i, n\}</tex> (в оптимальном расписании мы не выполняем работы позже времени <tex> | + | Во время сортировки стоит учитывать, что дедлайны могут значительно превосходить количество задач. В таком случае необходимо предварительно пересчитать дедлайны по формуле <tex>d_i = \min\{d_i, n\}</tex> (в оптимальном расписании мы не выполняем работы позже времени <tex>time=n</tex>). |
+ | ==Корректность и оптимальность== | ||
В результате выполнения данного алгоритма будет получено корректное расписание, в котором каждая работа встречается не более одного раза. Оптимальность полученного расписания доказывается аналогично [[1sumwu|<tex>1 \mid \mid \sum w_{i}U_{i}</tex>]]. | В результате выполнения данного алгоритма будет получено корректное расписание, в котором каждая работа встречается не более одного раза. Оптимальность полученного расписания доказывается аналогично [[1sumwu|<tex>1 \mid \mid \sum w_{i}U_{i}</tex>]]. | ||
Версия 21:04, 8 июня 2016
Задача: |
Дан один станок и | работ, для которых заданы их дедлайны , а все времена выполнения на этом станке . Нужно успеть выполнить как можно больше работ.
Содержание
Алгоритм
Чтобы получить оптимальное расписание, будем строить максимальное множество
тех работ, которые успеют выполниться. Само расписание тогда будет состоять из всех работ из , упорядоченных по неубыванию дедлайнов. Будем добавлять в работы в порядке неубывания значений , если успеваем их выполнить.Псевдокод
function schedule(d: int[n]): int[]
S = +=
1
return S
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 {i}
time Время работы
Cортировку работ по неубыванию дедлайнов осуществляем с помощью сортировки подсчетом за
, а значит и весь алгоритм будет работать за . Во время сортировки стоит учитывать, что дедлайны могут значительно превосходить количество задач. В таком случае необходимо предварительно пересчитать дедлайны по формуле (в оптимальном расписании мы не выполняем работы позже времени ).Корректность и оптимальность
В результате выполнения данного алгоритма будет получено корректное расписание, в котором каждая работа встречается не более одного раза. Оптимальность полученного расписания доказывается аналогично .
См. также
Источники информации
- Peter Brucker. «Scheduling Algorithms» — «Springer», 2006 г. — 86 стр. — ISBN 978-3-540-69515-8