J2pij1Lmax — различия между версиями
System29a (обсуждение | вклад) (→Описание решения) |
System29a (обсуждение | вклад) (→Описание решения) |
||
Строка 33: | Строка 33: | ||
Мы предполагаем, что <tex>d_i \ge 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 \ge 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>C_i \ge 1</tex> для всех <tex>i = 1,\ldots,n</tex> и <tex>d_i = 0</tex> справедливо <tex>L_i = C_i - d_i \ge 1</tex> как минимум для одной работы <tex>i</tex>. К тому же, можно предположить, что <tex>C_i \le r</tex>. Таким образом, работы с <tex>d_i > r - 1</tex>, то есть c <tex>L_i = C_i - d_i < 1</tex> можно смело игнорировать. Они не влияют на значение улучшаемой функции <tex>max(L_i)</tex>, так как для некого <tex>i L_i \ge 1</tex> Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций <tex>O_{ij}</tex> мы имеем: | + | Так как <tex>C_i \ge 1</tex> для всех <tex>i = 1,\ldots,n</tex> и <tex>d_i = 0</tex> справедливо <tex>L_i = C_i - d_i \ge 1</tex> как минимум для одной работы <tex>i</tex>. К тому же, можно предположить, что <tex>C_i \le r</tex>. Таким образом, работы с <tex>d_i > r - 1</tex>, то есть c <tex>L_i = C_i - d_i < 1</tex> можно смело игнорировать. Они не влияют на значение улучшаемой функции <tex>max(L_i)</tex>, так как для некого <tex>i</tex> <tex>L_i \ge 1</tex> Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций <tex>O_{ij}</tex> мы имеем: |
<tex>-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1</tex> | <tex>-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1</tex> | ||
− | Каждую операцию мы кладём в соответствующий список (на самом деле это должен быть heap для хорошей асимптотики) <tex>L(k)</tex>, где <tex>k = l(O_{ij}) = d_i - n_i + j(-r + 1 \le k \le 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 \le k \le r - 1)</tex>. На втором шаге мы планируем операции соответственно возрастающему по номеру списка <tex>k</tex> порядку, где операции из одного списка могут выполнятся в произвольном порядке. |
==Алгоритм== | ==Алгоритм== |
Версия 22:10, 21 июня 2012
Эта статья находится в разработке!
Содержание
Условие задачи
В нотации Грэхема задача носит название
Дано
работ и две машины, обозначенные как и .-тая работа состоит из операций , которые должны быть выполнены последовательно и, при этом, если операция была совершена на машине , то операция должна быть совершена на машине .
Задача заключается в том, что для данного каждой
-той работе дедлайна необходимо найти достижимое расписание с наименьшими максимальным временем опоздания:
Описание решения
Судя по условию,
-тая работа может характеризоваться двумя значениями: количество операций и машиной, на которой была совершена первая операция. Пусть — общее количество операций.Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхнюю границу момента начала выполнения последней операции обозначим за
. К примеру, мы можем выбрать . Тогда расписание можно представить как два списка и , где , если операция должна выполниться на машине в момент времени и , если машина простаивает в этот момент. И для каждой операции , выполняющейся на машине существует , для которого . Аналогично для . Расписание достижимо тогда и только тогда, когда из следует для некоторого , и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим , причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим расписанием. — время окончания работы в достижимом расписании можно рассчитать как:или — операция -той работы}
Задача заключается в том, что для данного каждой работе
дедлайна мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:
Следующий алгоритм решает эту задачу:
- Введём для каждой операции величину
- Создадим список всех операций , упорядоченный в порядке неубывания значений
- Найдем соответствующее списку расписание.
Этот алгоритм может быть реализованным с асимптотикой
.Мы предполагаем, что
для и хотя бы для одной работы . Иначе, вычтем из всех минимальное значение поТак как
для всех и справедливо как минимум для одной работы . К тому же, можно предположить, что . Таким образом, работы с , то есть c можно смело игнорировать. Они не влияют на значение улучшаемой функции , так как для некого Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций мы имеем:
Каждую операцию мы кладём в соответствующий список (на самом деле это должен быть heap для хорошей асимптотики)
, где . На втором шаге мы планируем операции соответственно возрастающему по номеру списка порядку, где операции из одного списка могут выполнятся в произвольном порядке.Алгоритм
Давайте детально рассмотрим алгоритм.
и обозначают первый период времени , когда соответствующие машины и бездействуют. обозначает время окончания последней запланированной операции -той работы. — множество работ, гдеmain() for k: -r + 1 to r - 1= ; Z = ; for i: 1 to n if < r for j: 1 to n_i добавить в 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( )
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
Очевидно, что количество шагов алгоритма ограничено
Источники
- Peter Brucker. «Scheduling Algorithms» — «Springer», 2006 г. — 180 стр. — ISBN 978-3-540-69515-8