1ridipi1 — различия между версиями
Sofya (обсуждение | вклад) м (Подкорректировано доказательство) |
Sofya (обсуждение | вклад) (Добавлено 1 | d_i,p_i=1 | -, небольшие изменения в тексте) |
||
Строка 3: | Строка 3: | ||
==Алгоритм== | ==Алгоритм== | ||
− | + | ||
+ | ===1 | d_i, p_i=1 | -=== | ||
+ | |||
+ | Для начала решим задачу, если все <tex>r_{i}=1</tex>, то есть <tex>1 | d_{i}, p_{i}=1 | -</tex>. | ||
+ | |||
+ | Будем выполнять работы в порядке возрастания их дедлайна <tex>d_{i}</tex>. Утверждается, что это оптимальное расписание. | ||
+ | Приведем реализацию, на основе которой мы вскоре построим решение основной задачи: | ||
+ | |||
+ | Пусть <tex>S</tex> — множество еще не включенных в расписание задач. Изначально в нем находятся все задачи. | ||
+ | <tex>S = \{1, 2, \ldots, n\}</tex> | ||
+ | <tex>time = 1;</tex> | ||
+ | '''for''' <tex> i = 1 </tex> '''to''' <tex> n </tex>: | ||
+ | <tex>d_{k} = min\{d_{i}</tex> | <tex>i \in S\}</tex> | ||
+ | '''if''' <tex>d_{k} \le time</tex>: | ||
+ | Расписание составить невозможно | ||
+ | '''else''': | ||
+ | //выполняем работу номер <tex>k</tex> | ||
+ | <tex>S \leftarrow S \setminus \{k\}</tex> | ||
+ | <tex>time = time + 1;</tex> | ||
+ | |||
+ | Сложность алгоритма <tex>O(n\log n)</tex>, если в качестве <tex>S</tex> использовать структуру, которая позволяет поиск элемента с минимальным <tex>d_{i}</tex> за <tex>O(\log n)</tex>. | ||
+ | |||
+ | '''Доказательство корректности алгоритма''' | ||
+ | |||
+ | Докажем от противного. Пусть в оптимальном расписании, где все работы укладываются в дедлайны, сначала идет работа <tex>i</tex>, а потом <tex>j</tex>, причем <tex>d_{i} > d_{j}</tex>. Посмотрим, что произойдет, если в расписании поменять их местами. Так как они обе выполняются за единицу времени, для всех задач, кроме <tex>i</tex>-й и <tex>j</tex>-й время их завершения <tex>C_{i}</tex> не поменялось. Для <tex>j</tex>-й же работы <tex>C_{j}</tex> стало меньше, что только лучше. <tex>C_{i}</tex> увеличилось и стало равно старому <tex>C_{j}</tex> однако, раз <tex>j</tex>-я работа раньше укладывалась в дедлайн, то <tex>C_{i} = C_{j}^{old} \le d_{j} < d_{i}</tex>, а значит и <tex>i</tex>-я работа все еще укладывается в свой дедлайн, и наша замена ничего не испортила. | ||
+ | |||
+ | ===1 | r_i, d_i, p_i=1 | -=== | ||
+ | |||
+ | Теперь перейдем к основной задаче — <tex>1 | r_{i}, d_{i}, p_{i}=1 | -</tex>. | ||
+ | Теперь не все задачи доступны изначально. Однако утверждается, что очередную задачу теперь достаточно выбирать с минимальным <tex>d_{i}</tex> из всех, которые уже доступны. Если эта работа уже просрочена, значит хорошее расписание построить нельзя. | ||
Пусть <tex>S</tex> — множество ещё не включенных в расписание работ, к выполнению которых уже можно приступить. Изначально <tex>S</tex> пустое. | Пусть <tex>S</tex> — множество ещё не включенных в расписание работ, к выполнению которых уже можно приступить. Изначально <tex>S</tex> пустое. | ||
Строка 22: | Строка 51: | ||
Расписание составить невозможно | Расписание составить невозможно | ||
'''else''': | '''else''': | ||
+ | //выполняем работу номер <tex>k</tex> | ||
<tex>S \leftarrow S \setminus \{k\}</tex> | <tex>S \leftarrow S \setminus \{k\}</tex> | ||
<tex>time = time + 1;</tex> | <tex>time = time + 1;</tex> |
Версия 21:43, 4 июня 2016
Содержание
Постановка задачи
Дан один станок на котором нужно выполнить
работ. Для каждой работы известны моменты времени, когда можно начинать её выполнять — и когда необходимо закончить её выполнение — . Время выполнения у всех работ одинаково и равно 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