Pintreepi1Lmax — различия между версиями
Zernov (обсуждение | вклад) |
Zernov (обсуждение | вклад) (→Второй шаг) |
||
Строка 75: | Строка 75: | ||
Если существует такое расписание, в котором ни одна из работ не будет выполнена с опозданием, то тогда это свойство сохранится в построенном данным алгоритмом расписании | Если существует такое расписание, в котором ни одна из работ не будет выполнена с опозданием, то тогда это свойство сохранится в построенном данным алгоритмом расписании | ||
|proof= | |proof= | ||
− | Предположим, что существует работа из <tex>x_{1} \dots x_{n}</tex> расписания, построенного алгоритмом. В таком случае существует работа, которая опоздала по отношению к измененным срокам. Возьмем наименьшее <tex>i</tex> такое, что <tex>x(i) + 1 > d'_{i}</tex>. Пусть <tex>t < d'_{i}</tex> {{---}} наибольшее из удовлетворяющих условию <tex>j < m | + | Предположим, что существует работа из <tex>x_{1} \dots x_{n}</tex> расписания, построенного алгоритмом. В таком случае существует работа, которая опоздала по отношению к измененным срокам. Возьмем наименьшее <tex>i</tex> такое, что <tex>x(i) + 1 > d'_{i}</tex>. Пусть <tex>t < d'_{i}</tex> {{---}} наибольшее из удовлетворяющих условию <tex>j < m </tex>, где <tex> x(j) = t, d'_{j} \leqslant d'_{i}</tex> |
Такое <tex>t</tex> существует, потому что иначе <tex>m \cdot d'_{i}</tex> работ <tex>j</tex> с <tex>d'_{j} \leqslant d'_{i}</tex> находятся в очереди до <tex>d'_{i}</tex>. Работа <tex>i</tex> к ним не принадлежит, поскольку <tex>x(i) + 1 > d'_{i}</tex>, а значит, что <tex>m \cdot d'_{i} + 1</tex> должны быть в очереди в момент времени <tex>0 \dots d'_{i}</tex> и ни одна работа не должна опаздывать. Противоречие. | Такое <tex>t</tex> существует, потому что иначе <tex>m \cdot d'_{i}</tex> работ <tex>j</tex> с <tex>d'_{j} \leqslant d'_{i}</tex> находятся в очереди до <tex>d'_{i}</tex>. Работа <tex>i</tex> к ним не принадлежит, поскольку <tex>x(i) + 1 > d'_{i}</tex>, а значит, что <tex>m \cdot d'_{i} + 1</tex> должны быть в очереди в момент времени <tex>0 \dots d'_{i}</tex> и ни одна работа не должна опаздывать. Противоречие. | ||
Любая работа <tex>j</tex> с <tex>d'_{j} \leqslant d'_{i} </tex> и <tex> x(j) > t </tex> должна иметь предка, начавшего работать в момент времени <tex>t</tex>. Теперь рассмотрим два случая: | Любая работа <tex>j</tex> с <tex>d'_{j} \leqslant d'_{i} </tex> и <tex> x(j) > t </tex> должна иметь предка, начавшего работать в момент времени <tex>t</tex>. Теперь рассмотрим два случая: | ||
Строка 87: | Строка 87: | ||
:В этом случае <tex>m</tex> работ <tex>j</tex> таких, что <tex>d'_{j} \leqslant d'_{i}</tex> начнут работать в момент времени <tex>t + 1</tex>, каждая из которых имеет как минимум работающего в <tex>t</tex> предка. По структуре дерева все эти предки различны, кроме того, если <tex>k</tex> {{---}} такой предок <tex>j</tex>, тогда <tex>d'_{k} \leqslant d'_{j} - 1 < d'_{j} \leqslant d'_{i}</tex>, что противоречит выбору <tex>t</tex> | :В этом случае <tex>m</tex> работ <tex>j</tex> таких, что <tex>d'_{j} \leqslant d'_{i}</tex> начнут работать в момент времени <tex>t + 1</tex>, каждая из которых имеет как минимум работающего в <tex>t</tex> предка. По структуре дерева все эти предки различны, кроме того, если <tex>k</tex> {{---}} такой предок <tex>j</tex>, тогда <tex>d'_{k} \leqslant d'_{j} - 1 < d'_{j} \leqslant d'_{i}</tex>, что противоречит выбору <tex>t</tex> | ||
}} | }} | ||
+ | |||
==== Корректность алгоритма ==== | ==== Корректность алгоритма ==== | ||
{{Теорема | {{Теорема |
Версия 16:03, 30 мая 2016
Задача: |
Рассмотрим задачу на нахождение расписания:
|
Содержание
Описание алгоритма
Идея
Все работы хранятся в качестве вершин intree-дерева, состоящем из вершин, нескольких корней и одного листа. В intree-дереве у одной вершины может быть два и более родителей. Решение задачи состоит из двух шагов: на первом шаге мы меняем сроки выполнения работ в соответствии с их очередностью.
- Для всех таких, что существует ребро из в будем менять на .
- Работы расставляются в неубывающем порядке сроков.
Псевдокод
Первый шаг
Алгоритм изменения сроков:
i = 0 deque =for k = 1 .. n if k.parent == i = k // такая вершина только одна (intree-дерево) deque.push(i) // пустой дек while not deque.isEmpty() i = deque.removeFirst() for j in i.parents j.deadline = min(j.deadline, i.deadline - 1) stack.add_last(j)
Второй шаг
На втором этапе алгоритма работы сортируются в неубывающем порядке их дедлайнов. Предполагается, что работы занумерованы в соответствии с предыдущим пунктом, т.е.
, если .- В переменной хранится время, когда станок освободится.
- В массиве хранится информация о максимальном времени завершении обработки родителя.
- Массив хранит информацию о количестве работ, готовых к исполнению (находящихся в очереди) в момент времени .
- Массив хранит информацию о начале выполнения работы .
F = 0 for i = 1 .. n r[i] = 0 for t = 0 .. n q[t] = 0 for i = 1 .. n t = max(r[i], F) x[i] = t q[t] = q[t] + 1 if q[t] == m F = t + 1 j = i.child() r[j] = max(r[j], t + 1)
Доказательство корректности
Первый шаг
Лемма: |
Работа с новым сроком в расписании не имеет опозданий тогда и только тогда, когда она не имела опозданий с оригинальным сроком . |
Доказательство: |
|
Второй шаг
Расписание, сгенерированное этим алгоритмом имеет важное свойство: число заданий в очереди в любой момент времени
меньше, чем в момент . Действительно, пусть во время мы выполняем работ, и хотя бы работ готовы к выполению в момент времени . Но т.к. , значит каждой из работ предшествовала как минимум одна, поскольку у всех вершин, кроме корней, есть как минимум один предок. Значит, в момент времени исполнялось не менее работ, противоречие.Лемма: |
Если существует такое расписание, в котором ни одна из работ не будет выполнена с опозданием, то тогда это свойство сохранится в построенном данным алгоритмом расписании |
Доказательство: |
Предположим, что существует работа из расписания, построенного алгоритмом. В таком случае существует работа, которая опоздала по отношению к измененным срокам. Возьмем наименьшее такое, что . Пусть — наибольшее из удовлетворяющих условию , где Такое существует, потому что иначе работ с находятся в очереди до . Работа к ним не принадлежит, поскольку , а значит, что должны быть в очереди в момент времени и ни одна работа не должна опаздывать. Противоречие. Любая работа с и должна иметь предка, начавшего работать в момент времени . Теперь рассмотрим два случая:Первый случай: .
Второй случай: .
|
Корректность алгоритма
Теорема: |
Данный алгоритм корректно решает задачу |
Доказательство: |
Пусть | — оптимальное значение. В таком случае, существует расписание, удовлетворяющее , что эквивалетно выражению для . По первой лемме расписание , построенное для сдвинутых дат удовлетворяет данным выражениям. Таким образом, оно оптимально. Нетрудно заметить, что идентично расписанию, построенному алгоритмом, т.к. для
Асимптотика
- На перов шаге мы посещаем каждую вершину ровно два раза (первый — когда ищем вершину без родителя, второй — когда релаксируем дедлайны) за времени.
- Делаем сортировку вершин за , а затем для каждой вершины считаем время за линейное время.
Итоговая сложность —
См. также
Источники информации
- Peter Brucker «Scheduling Algorithms», fifth edition, Springer — с. 151-156 ISBN 978-3-540-69515-8