1ridipi1

Материал из Викиконспекты
Перейти к: навигация, поиск

Постановка задачи

Дан один станок на котором нужно выполнить n работ. Для каждой работы известны моменты времени, когда можно начинать её выполнять — ri и когда необходимо закончить её выполнение — di. Время выполнения pi у всех работ одинаково и равно 1. Необходимо узнать, можно ли построить расписание, при котором все работы будут выполнены.

Алгоритм

Идея алгоритма в том, чтобы из тех работ, которые уже можно выполнить, ставить в расписание ту, у которой наименьшее di. Если эта работа уже просрочена, значит хорошее расписание построить нельзя.

Пусть S — множество ещё не включенных в расписание работ, к выполнению которых уже можно приступить. Изначально S пустое. Отсортируем работы по порядку их появления.

Алгоритм 1|ri,di,pi=1|:

 S=;
 j=1;
 time=1;
 for i=1 to n:
     if S==:
         time=rj
     while time==rj:
         SS{j}
         j=j+1;
     dk=min{di | iS}
     if dktime:
         Расписание составить невозможно
     else:
         SS{k}
         time=time+1;

Сложность алгоритма O(nlogn), если в качестве S использовать структуру, которая позволяет поиск элемента с минимальным di за O(logn).

Доказательство корректности алгоритма

Пусть с помощью нашего алгоритма составить хорошее расписание не удалось. Докажем, что в этом случае хорошего расписания не существует. Заметим, что расписание состоит из непрерывных блоков, между которыми есть пропуски - все поступившие работы выполнены, а новых работ ещё не появилось. Расписание может состоять из одного блока.

Рассмотрим первый блок, для которого не получилось составить расписание. Возьмем в нём первую работу, для которой не нашлось места. Пусть её индекс будет k. Попробуем вставить эту работу в расписание. До блока её вставить нельзя, так как ri больше или равно времени начала блока. А в блоке нет пропусков, поэтому нужно поменять её с какой-то i-ой, которая уже стоит в этом блоке расписания. У всех таких работ di меньше или равно dk, так как в алгоритме мы каждый раз брали работу с минимальным di. Но i-ую работу нельзя выполнить после k-ой. Значит k-ую работу выполнить нельзя.

Источники информации

  • P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 200