Pintreepi1Lmax — различия между версиями
Zernov (обсуждение | вклад) (→Второй шаг) |
Zernov (обсуждение | вклад) (→Первый шаг) |
||
| Строка 21: | Строка 21: | ||
==== Первый шаг ==== | ==== Первый шаг ==== | ||
Алгоритм изменения сроков: | Алгоритм изменения сроков: | ||
| − | + | i = 0 | |
| − | while deque not empty | + | '''for''' k = 1 .. n |
| − | i = | + | '''if''' k.leave == <tex>\varnothing</tex> |
| − | for j | + | i = k <font color=green> // такая вершина только одна (intree-дерево) </font> |
| − | + | deque.push(i) <font color=green> // пустой дек </font> | |
| + | '''while''' deque '''not''' empty | ||
| + | i = deque.remove_first | ||
| + | '''for''' j : i.parents | ||
| + | j.deadline = '''min''' (j.deadline, (i - 1).deadline) | ||
stack.add_last(j) | stack.add_last(j) | ||
Версия 17:02, 22 мая 2016
| Задача: |
Рассмотрим задачу на нахождение расписания:
|
Содержание
Описание алгоритма
Идея
Все работы хранятся в качестве вершин intree-дерева, состоящем из вершин, нескольких корней и одного листа. В intree-дереве у одной вершины может быть два и более родителей. Решение задачи состоит из двух шагов: на первом шаге мы меняем сроки выполнения работ в соответствии с их очередностью.
- Для всех таких, что существует ребро из в будем менять на .
- Работы расставляются в неубывающем порядке сроков.
Псевдокод
Первый шаг
Алгоритм изменения сроков:
i = 0
for k = 1 .. n
if k.leave ==
i = k // такая вершина только одна (intree-дерево)
deque.push(i) // пустой дек
while deque not empty
i = deque.remove_first
for j : i.parents
j.deadline = min (j.deadline, (i - 1).deadline)
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
