1ridipi1
Постановка задачи
Дан один станок на котором нужно выполнить работ. Для каждой работы известны моменты времени, когда можно начинать её выполнять — и когда необходимо закончить её выполнение — . Время выполнения у всех работ одинаково и равно 1. Необходимо узнать, можно ли построить расписание, при котором все работы будут выполнены.
Алгоритм
1 | d_i, p_i=1 | -
Для начала решим задачу, если все , то есть .
Будем выполнять работы в порядке возрастания их дедлайна . Утверждается, что это оптимальное расписание. Приведем реализацию, на основе которой мы вскоре построим решение основной задачи:
Пусть — множество еще не включенных в расписание задач. Изначально в нем находятся все задачи.
for to : | if : Расписание составить невозможно else: //выполняем работу номер
Сложность алгоритма , если в качестве использовать структуру, которая позволяет поиск элемента с минимальным за .
Доказательство корректности алгоритма
Докажем от противного. Пусть в оптимальном расписании, где все работы укладываются в дедлайны, сначала идет работа , а потом , причем . Посмотрим, что произойдет, если в расписании поменять их местами. Так как они обе выполняются за единицу времени, для всех задач, кроме -й и -й время их завершения не поменялось. Для -й же работы стало меньше, что только лучше. увеличилось и стало равно старому однако, раз -я работа раньше укладывалась в дедлайн, то , а значит и -я работа все еще укладывается в свой дедлайн, и наша замена ничего не испортила.
1 | r_i, d_i, p_i=1 | -
Теперь перейдем к основной задаче — . Теперь не все задачи доступны изначально. Однако утверждается, что очередную задачу теперь достаточно выбирать с минимальным из всех, которые уже доступны. Если эта работа уже просрочена, значит хорошее расписание построить нельзя.
Пусть — множество ещё не включенных в расписание работ, к выполнению которых уже можно приступить. Изначально пустое. Отсортируем работы по порядку их появления.
Алгоритм :
for to : if : while : | if : Расписание составить невозможно else: //выполняем работу номер
Сложность алгоритма , если в качестве использовать структуру, которая позволяет поиск элемента с минимальным за .
Доказательство корректности алгоритма
Пусть с помощью нашего алгоритма составить хорошее расписание не удалось. Докажем, что в этом случае хорошего расписания не существует. Заметим, что расписание состоит из непрерывных блоков, между которыми есть пропуски — все поступившие работы выполнены, а новых работ ещё не появилось. Расписание может состоять из одного блока.
Рассмотрим первый блок, для которого не получилось составить расписание. Возьмем в нём первую работу, для которой не нашлось места. Пусть её индекс будет равен . Попробуем вставить эту работу в расписание. До блока её вставить нельзя, так как больше или равно времени начала блока. А в блоке нет пропусков, поэтому нужно поменять её с какой-то -й, которая уже стоит в этом блоке расписания. У всех таких работ , так как в алгоритме мы каждый раз брали работу с минимальным . Но -ю работу нельзя выполнить после -й. Значит -ю работу выполнить нельзя.
Источники информации
- P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 200