1632
правки
Изменения
1ridipi1
,rollbackEdits.php mass rollback
<tex dpi ="200" >1 \mid r_i, d_i, p_i=Постановка задачи=1 \mid -</tex> {{Шаблон:Задача|definition =Дан один станок на котором нужно выполнить <tex>n</tex> работ. Для каждой работы известны моменты времени, когда можно начинать её выполнять — <tex>r_{i}r_i</tex> и когда необходимо закончить её выполнение — <tex>d_{i}d_i</tex>. Время выполнения <tex>p_{i}p_i</tex> у всех работ одинаково и равно 1. Необходимо узнать, можно ли построить расписание, при котором все работы будут выполнены.}}
==Алгоритм==
===1 | d_i, p_i=1 | -Упрощенная версия===
Для начала решим более простую версию исходной задачи, когда все <tex>r_i=1</tex>. ====Описание алгоритма==== Будем выполнять работы в порядке возрастания их дедлайна <tex>d_{i}d_i</tex>. Утверждается, что это оптимальное расписание.
Приведем реализацию, на основе которой мы вскоре построим решение основной задачи:
====Псевдокод====
Пусть <tex>S</tex> — множество еще не включенных в расписание задач. Изначально в нем находятся все задачи.
'''function''' solve(d: '''int'''[n]): '''boolean''' <tex>S = \{1, 2, \ldots, n\}</tex> '''int '''<tex>time = 1;</tex> '''for''' <tex> i = 1 </tex> '''to''' <tex> n </tex>: <tex>d_{d[k} ] = \min\{d_{d[i}</tex> | <tex>] \mid i \in S\}</tex> '''if''' <tex>d_{d[k} ] \le leqslant time</tex>: Расписание <font color=green>// расписание составить невозможно</font> '''return''' ''false'' '''else''': <font color=green>//выполняем работу номер <tex>k</texfont> <tex>S \leftarrow = S \setminus \{k\}</tex> <tex>time = time + 1;</tex> '''return''' ''true'' Сложность алгоритма <tex>\mathcal{O}(n\log n)</tex>, если в качестве <tex>S</tex> использовать структуру, которая позволяет поиск элемента с минимальным <tex>d_i</tex> и его удаление за <tex>\mathcal{O}(\log n)</tex>, например [[Двоичная_куча|двоичная куча]]. ====Доказательство корректности и оптимальности====
Теперь перейдем к решению основной задачи. ===1 | r_i, d_i, p_i=1 | -Описание алгоритма====
Теперь не все задачи доступны изначально. Однако утверждается, что очередную задачу теперь достаточно выбирать с минимальным <tex>d_{i}</tex> из всех, которые уже доступны. Если эта работа уже просрочена, значит хорошее расписание построить нельзя.
====Псевдокод====
Пусть <tex>S</tex> — множество ещё не включенных в расписание работ, к выполнению которых уже можно приступить. Изначально <tex>S</tex> пустое.
Отсортируем работы по порядку их появления.
Сложность алгоритма <tex>\mathcal{O}(n\log n)</tex>, если в качестве <tex>S</tex> использовать структуру, которая позволяет поиск элемента с минимальным <tex>d_{i}d_i</tex> и его удаление за <tex>\mathcal{O}(\log n)</tex>, например [[Двоичная_куча|двоичная куча]].
====Доказательство корректности алгоритмаи оптимальности==== {{Теорема|statement=Приведенный алгоритм строит оптимальное расписание для задачи <tex>1 \mid r_i, d_i, p_i=1 \mid -</tex>.|proof=
Пусть с помощью нашего алгоритма составить хорошее расписание не удалось. Докажем, что в этом случае хорошего расписания не существует.
Заметим, что расписание состоит из непрерывных блоков, между которыми есть пропуски — все поступившие работы выполнены, а новых работ ещё не появилось. Расписание может состоять из одного блока.
Рассмотрим первый блок, для которого не получилось составить расписание. Возьмем в нём первую работу, для которой не нашлось места. Пусть её индекс будет равен <tex>k</tex>. Попробуем вставить эту работу в расписание. До блока её вставить нельзя, так как <tex>r_{i}r_i</tex> больше или равно времени начала блока. А в блоке нет пропусков, поэтому нужно поменять её с какой-то <tex>i</tex>-й, которая уже стоит в этом блоке расписания. У всех таких работ <tex>d_{i} d_i \le d_{k}leqslant d_k</tex>, так как в алгоритме мы каждый раз брали работу с минимальным <tex>d_{i}d_i</tex>. Но <tex>i</tex>-ю работу нельзя выполнить после <tex>k</tex>-й. Значит <tex>k</tex>-ю работу выполнить нельзя.}} == См. также ==* [[1ripipsumwu|<tex>1 \mid r_i, p_i = p \mid \sum w_i U_i</tex>]]* [[1ripi1sumf|<tex>1 \mid r_i, p_i=1 \mid \sum f_i</tex>]]
==Источники информации==
* P. Brucker. Scheduling Algorithms «Scheduling Algorithms» (2006), 5th edition, стр. 200
[[Категория: Дискретная математика Алгоритмы и алгоритмыструктуры данных]]
[[Категория: Теория расписаний]]