J2pij1Lmax — различия между версиями
(→Условие задачи) |
|||
Строка 7: | Строка 7: | ||
<tex>A (B)</tex>, то операция <tex>O_{i,j-1}</tex> должна быть совершена на машине <tex>B (A)</tex>. | <tex>A (B)</tex>, то операция <tex>O_{i,j-1}</tex> должна быть совершена на машине <tex>B (A)</tex>. | ||
− | Задача заключается в том, что для данного каждой <tex>i</tex>-той работе дедлайна <tex>d_i \ | + | Задача заключается в том, что для данного каждой <tex>i</tex>-той работе дедлайна <tex>d_i \geqslant 0</tex> необходимо найти достижимое расписание с наименьшими максимальным временем опоздания: |
<tex>\max\{C_i - d_i | i = 1, \ldots, n\}</tex> | <tex>\max\{C_i - d_i | i = 1, \ldots, n\}</tex> | ||
Строка 17: | Строка 17: | ||
<tex>C_i</tex> {{---}} время окончания работы <tex>i</tex> в достижимом расписании <tex>y = (A(t), B(t))</tex> можно рассчитать как: | <tex>C_i</tex> {{---}} время окончания работы <tex>i</tex> в достижимом расписании <tex>y = (A(t), B(t))</tex> можно рассчитать как: | ||
− | <tex>C_i = \max\{t + 1 | A(t)\}</tex> или <tex>B(t)</tex> {{---}} операция <tex>i</tex>-той работы | + | <tex>C_i = \max\{t + 1 | A(t)\}</tex> или <tex>B(t)</tex> {{---}} операция <tex>i</tex>-той работы. |
− | Задача заключается в том, что для данного каждой работе <tex>i</tex> дедлайна <tex>d_i \geqslant 0</tex> мы хотим найти достижимое расписание с | + | Задача заключается в том, что для данного каждой работе <tex>i</tex> дедлайна <tex>d_i \geqslant 0</tex> мы хотим найти достижимое расписание с наименьшим максимальным временем опоздания: |
<tex>\max\{C_i - d_i | i = 1, \ldots, n\}</tex> | <tex>\max\{C_i - d_i | i = 1, \ldots, n\}</tex> | ||
Строка 25: | Строка 25: | ||
Следующий алгоритм решает эту задачу: | Следующий алгоритм решает эту задачу: | ||
− | * | + | * введём для каждой операции <tex>O_{ij}</tex> величину <tex>l(O_{ij}) = d_i - n_i + j</tex>, |
− | * | + | * создадим список всех операций <tex>L</tex>, упорядоченный в порядке неубывания значений <tex>l(O_{ij})</tex>, |
− | * | + | * найдем соответствующее списку <tex>L</tex> расписание. |
− | Этот алгоритм может быть | + | Этот алгоритм может быть реализован с асимптотикой <tex>O(r \log r)</tex>. |
Мы предполагаем, что <tex>d_i \geqslant 0</tex> для <tex>i = 1,\ldots,n</tex> и хотя бы для одной работы <tex>i</tex> <tex>d_i = 0</tex>. Иначе, вычтем из всех <tex>d_i</tex> минимальное значение по <tex>d_i</tex>. | Мы предполагаем, что <tex>d_i \geqslant 0</tex> для <tex>i = 1,\ldots,n</tex> и хотя бы для одной работы <tex>i</tex> <tex>d_i = 0</tex>. Иначе, вычтем из всех <tex>d_i</tex> минимальное значение по <tex>d_i</tex>. | ||
Строка 37: | Строка 37: | ||
<tex>-r + 1 \leqslant l(O_{ij}) = d_i - n_i + j \leqslant r - 1</tex> | <tex>-r + 1 \leqslant l(O_{ij}) = d_i - n_i + j \leqslant r - 1</tex> | ||
− | Каждую операцию мы кладём в соответствующий список (на самом деле это должен быть heap для хорошей асимптотики) <tex>L(k)</tex>, где <tex>k = l(O_{ij}) = d_i - n_i + j</tex> <tex>(-r + 1 \leqslant k \leqslant r - 1)</tex>. На втором шаге мы планируем операции соответственно возрастающему по номеру списка <tex>k</tex> порядку, где операции из одного списка могут выполнятся в произвольном порядке. | + | Каждую операцию мы кладём в соответствующий список (на самом деле это должен быть куча (англ. ''heap'') для хорошей асимптотики) <tex>L(k)</tex>, где <tex>k = l(O_{ij}) = d_i - n_i + j</tex> <tex>(-r + 1 \leqslant k \leqslant r - 1)</tex>. На втором шаге мы планируем операции соответственно возрастающему по номеру списка <tex>k</tex> порядку, где операции из одного списка могут выполнятся в произвольном порядке. |
==Алгоритм== | ==Алгоритм== |
Версия 16:36, 13 мая 2016
Содержание
Условие задачи
В нотации Грэхема задача носит название
Дано
работ и две машины, обозначенные как и .
, то операция должна быть совершена на машине .
Задача заключается в том, что для данного каждой
-той работе дедлайна необходимо найти достижимое расписание с наименьшими максимальным временем опоздания:
Описание решения
Судя по условию,
-тая работа может характеризоваться двумя значениями: количество операций и машиной, на которой была совершена первая операция. Пусть — общее количество операций.Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхнюю границу момента начала выполнения последней операции обозначим за
. К примеру, мы можем выбрать . Тогда расписание можно представить как два списка и , где , если операция должна выполниться на машине в момент времени и , если машина простаивает в этот момент. И для каждой операции , выполняющейся на машине существует , для которого . Аналогично для . Расписание достижимо тогда и только тогда, когда из следует для некоторого , и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данного списка осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим , причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим расписанием. — время окончания работы в достижимом расписании можно рассчитать как:или — операция -той работы.
Задача заключается в том, что для данного каждой работе
дедлайна мы хотим найти достижимое расписание с наименьшим максимальным временем опоздания:
Следующий алгоритм решает эту задачу:
- введём для каждой операции величину ,
- создадим список всех операций , упорядоченный в порядке неубывания значений ,
- найдем соответствующее списку расписание.
Этот алгоритм может быть реализован с асимптотикой
.Мы предполагаем, что
для и хотя бы для одной работы . Иначе, вычтем из всех минимальное значение по .Так как
для всех и справедливо как минимум для одной работы . К тому же, можно предположить, что . Таким образом, работы с , то есть c , можно смело игнорировать. Они не влияют на значение улучшаемой функции , так как для некого можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций мы имеем:
Каждую операцию мы кладём в соответствующий список (на самом деле это должен быть куча (англ. heap) для хорошей асимптотики)
, где . На втором шаге мы планируем операции соответственно возрастающему по номеру списка порядку, где операции из одного списка могут выполнятся в произвольном порядке.Алгоритм
Давайте детально рассмотрим алгоритм.
и обозначают первый период времени , когда соответствующие машины и бездействуют. обозначает время окончания последней запланированной операции -той работы. — множество работ, гдеfunction main(): for k = -r + 1 to r - 1= Z = for i = 1 to n if < r for j = 1 to добавить в else добавить работу i в Z for i = 1 to n LAST(i) = 0 T1 = 0 T2 = 0 for k = -r + 1 to r - 1 while Выбрать задание из = schedule( ) while Выбрать работу i из Z Z = ; for j = 1 to schedule( )
function schedule(): if == A if T1 < LAST(i) t = LAST(i) A(t) = (*) else t = T1 A(t) = while T1 = T1 + 1 else if T2 < LAST(i) t = LAST(i) B(t) = (**) else t = T2 A(t) = while T2 = T2 + 1 LAST(i) = t + 1
Очевидно, что количество шагов алгоритма ограничено
Доказательство
Для доказательства того, что алгоритм решения задачи корректен, необходимо показать то, что он строит достижимое расписание. Это справедливо тогда и только тогда, когда до исполнения строчек (*) и (**) пусты A(t) и B(t) соответственно. Иначе две разные операции будут выполняться в один момент времени на одной машине. Для того, чтобы показать достижимость докажем лемму.
Лемма: |
Пусть — расписание, где . Тогда для каждого , где выполняется |
Доказательство: |
Докажем по индукции по Предположим теперь что лемма верна для всех , что если и , то . Это, очевидно, верно при так как если и не соответствует работе , то означает что операция должна быть запланирована в расписании ранее. при и . Выберем максимальное , такое что и . По предположению индукции, и соответствуют одной и той же работе для . Пусть ) не соответствует работе . Тогда для каждого операция не соответствует работе . Таким образом, может быть обработан в момент , что противоречит тому, что является расписанием. |
Теорема: |
Пусть — операция, которую планируют строчкой (*) или (**) и . Тогда |
Доказательство: |
Предположим что | . Поскольку , из предыдущей леммы следует, что и и являются операциями одной и той же задачи . Так как , у нас должно быть значение . Это невозможно, т.к. при и , .
Лемма: |
Если существует расписание без опозданий, то данный алгоритм построит расписание без опозданий. |
Доказательство: |
Покажем, что если в расписании, построенном данным алгоритмом есть опоздание, то опоздание есть в каждом расписании. Если есть опоздание в , то существует операция или с или . Например, это неравенство верно для последней операции в конце работы. Выберем минимальное с этим свойством и предположим, что . Тогда мы докажем, что и . (***) Таким образом, в каждом расписании должно существовать, по крайней мере, одно опоздание, т.к. если то при и мы должны запланировать операций во временном интервале , что невозможно. Если же , то все задачи начинаются на машине и операций должны обрабатываться в интервале времени , что тоже не возможно. Для доказательства (***) заметим, что (***) верно, если является первой операцией для работы, так как если при некоторых , то алгоритм должен запланировать перед . Теперь положим для какого-нибудь и . Получим при , так как из следует , а это противоречит минимальности . Из этого следует, что при так как в противном случае должно быть запланировано ранее. Также поскольку в противном случае должно быть запланировано на время , так как и являются операциями различных задач. Для -- мы доказали (***). Иначе пусть . Если -- первая операция задачи, мы закончили. В противном случае, если при , мы снова имеемЕсли . , тогда возьмем минимальное такое, что и являются последовательными операциями одной и той же задачи при . не соответствует задаче , и мы снова имеем .Если , мы закончили. Если , продолжаем таким же образом. |
Теорема: |
Расписание, построенное данным алгоритмом, оптимально. |
Доказательство: |
Пусть По первой лемме, данный алгоритм применительно к задаче с дедлайнами максимальное опоздание оптимального расписания. Тогда эквивалентно . дает оптимальное расписание для исходной задаче. Кроме того, это расписание совпадает с расписанием, которое мы получим, применив данный алгоритм к исходной задаче. |
См. также.
Источники информации
- Peter Brucker. «Scheduling Algorithms» — «Springer», 2006 г. — 180 стр. — ISBN 978-3-540-69515-8