6.3 Задачи и дедлайны¶
Рассмотрим следующую задачу. Нам дано n задач; для каждой известны длительность выполнения и дедлайн. Нужно выбрать порядок выполнения задач. За каждую задачу начисляется d - x очков, где d — её дедлайн, а x — момент времени, когда мы закончили эту задачу. Требуется получить как можно больший суммарный результат.
Например, пусть заданы такие задачи:
| Задача | Длительность | Дедлайн |
|---|---|---|
| A | 5 | 3 |
| B | 2 | 6 |
| C | 1 | 8 |
| D | 4 | 7 |
Один из оптимальных порядков выполнения:
C → B → D → A
Временная шкала завершений:
- после
C: время1 - после
B: время3 - после
D: время7 - после
A: время12
Тогда очки будут такими:
C:8 - 1 = 7B:6 - 3 = 3D:7 - 7 = 0A:3 - 12 = -9
Итоговая сумма равна 7 + 3 + 0 - 9 = 1.
Жадная идея¶
На первый взгляд может показаться, что дедлайны играют решающую роль. Но неожиданно оказывается, что оптимальный порядок вообще не зависит от дедлайнов.
Правильная жадная стратегия такая:
выполнять задачи в порядке возрастания их длительности.
Почему это верно¶
Предположим, что в некотором расписании подряд стоят две задачи:
- сначала задача
Xдлительностиa, - потом задача
Yдлительностиb,
где a > b.
То есть более длинная задача стоит раньше более короткой.
Пусть обе задачи начинаются после некоторого уже прошедшего времени t.
Тогда:
Xзавершится в моментt + a,Yзавершится в моментt + a + b.
Если поменять их местами, то:
Yзавершится в моментt + b,Xзавершится в моментt + b + a.
Посмотрим, как изменится сумма очков.
До перестановки вклад этих двух задач равен:
(d_X - (t + a)) + (d_Y - (t + a + b))
После перестановки:
(d_Y - (t + b)) + (d_X - (t + b + a))
Разница между новой и старой суммой оказывается равной:
a - b
А так как a > b, эта величина положительна. Значит, после перестановки суммарный результат увеличится.
Итак, если где-то более длинная задача стоит перед более короткой, такое расписание не может быть оптимальным.
Следовательно, в оптимальном расписании для любых двух соседних задач более короткая должна идти раньше более длинной. А это означает, что весь список задач должен быть отсортирован по возрастанию длительности.
Итого¶
Чтобы получить максимальную сумму очков:
- отсортируем все задачи по длительности;
- выполним их в этом порядке.
Именно такой жадный алгоритм всегда даёт оптимальный ответ.
Что важно запомнить¶
В этой задаче дедлайны влияют на значение итогового результата, но не влияют на оптимальный порядок задач. Порядок определяется только длительностями.
Это хороший пример жадного алгоритма, где правильная стратегия выглядит немного неожиданно.