J2pij1Lmax — различия между версиями
System29a (обсуждение | вклад) |
System29a (обсуждение | вклад) |
||
Строка 31: | Строка 31: | ||
main() | main() | ||
− | for k: -r + 1 to r - 1 | + | '''for''' k: -r + 1 '''to''' r - 1 |
− | L(k) = \emptyset; | + | <tex>L(k)</tex> = <tex>\emptyset</tex>; |
− | + | Z = <tex>\emptyset</tex>; | |
− | + | '''for''' i: 1 '''to''' n | |
− | + | '''if''' <tex>d_i</tex> < r | |
− | + | '''for''' j: 1 '''to''' n_i | |
− | + | добавить <tex>O_{ij}</tex> в <tex>L(d_i - n_i + j)</tex> | |
− | + | '''else''' | |
− | + | добавить работу i в Z | |
− | + | '''for''' i: 1 '''to''' n | |
− | + | LAST(i) = 0; | |
− | + | T1 = 0; | |
− | + | T2 = 0; | |
− | + | '''for''' k: -r + 1 '''to''' r - 1 | |
− | + | '''while''' <tex>L(k) \ne \emptyset</tex> | |
− | + | Выбрать задание <tex>O_{ij}</tex> из <tex>L(k)</tex> | |
− | + | <tex>L(k)</tex> = <tex>L(k)\{O_{ij}}</tex>; | |
− | + | schedule(<tex>O_{ij}</tex>) | |
− | + | '''while''' <tex>z \ne \emptyset</tex> | |
− | + | Выбрать работу i из Z | |
− | + | Z = <tex>Z\{i}</tex>; | |
− | + | '''for''' j: 1 '''to''' <tex>n_i</tex> | |
− | + | schedule(<tex>O_{ij}</tex>) | |
schedule(O_{ij}) | schedule(O_{ij}) | ||
− | + | if \mu_{ij} = A then do | |
− | + | if T1 < LAST(i) then do | |
− | + | t := LAST(i) | |
− | + | A(t) := O_{ij} | |
− | + | else | |
− | + | t := T1; | |
− | + | A(t) := O_{ij}; | |
− | + | while A(T_1) \ne \emptyset do | |
− | + | T1 := T1 + 1; | |
− | + | else | |
− | + | if T2 < LAST(i) then do | |
− | + | t := LAST(i) | |
− | + | B(t) := O_{ij} | |
− | + | else | |
− | + | t := T2; | |
− | + | A(t) := O_{ij}; | |
− | + | while B(T_2) \ne \emptyset do | |
− | + | T2 := T2 + 1; | |
− | + | LAST(i) := t + 1 | |
Очевидно, что количество шагов алгоритма ограничено <tex>O(r)</tex> | Очевидно, что количество шагов алгоритма ограничено <tex>O(r)</tex> |
Версия 21:16, 21 июня 2012
Эта статья находится в разработке!
Дано
работ и две машины, обозначенные как A и B. -тая работа состоит из операций , которые должны быть выполнены последовательно и, при этом, если операция была совершена на машине , то операция должна быть совершена на машине . Таким образом, -тая работа может характеризоваться двумя значениями: количество операций и машина, на которой была совершена первая операция. Пусть — общее количество операций.Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхняя граница момента начала выполнения последней операции обозначим за
. К примеру, мы можем выбрать . Тогда расписание можно представить как два массива и , где , если операция должна выполниться на машине в момент времени и , если машина простаивает в этот момент. Будем называть пустой операцией. И для каждой операции , выполняющейся на машине существует , для которого . Аналогично для . Расписание достижимо тогда и только тогда, когда из следует для некоторого , и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим , причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим расписанием. — время окончания работы в достижимом расписании можно рассчитать как:или — операция -той работы}
Задача заключается в том, что для данного каждой работе
дедлайна мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:
Следующий алгоритм решает эту задачу:
* Введём для каждой операциивеличину * Создадим список всех операций , упорядоченный в порядке неубывания значений * Найдем соответствующее списку расписание.
Этот алгоритм может быть реализованным с асимптотикой
. Однако, мы будем использовать эвристику с хешами и улучшим асимптотику алгоритма до .Мы предполагаем, что
для и хотя бы для одной работы . Иначе, вычтем из всех минимальное значение поТак как
для всех и справедливо как минимум для одной работы . К тому же, можно предположить, что . Таким образом, работы с , то есть c можно смело игнорировать. Они не влияют на значение улучшаемой функции , так как для некого Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций мы имеем:
Каждую операцию мы кладём в соответствующую корзину
, где . На втором шаге мы планируем операции соответственно возрастающему по номеру корзины порядку, где операции из одной корзины могут выполнятся в произвольном порядке.Давайте детально рассмотрим алгоритм.
и обозначают первый период времени , когда соответсвующие машины и бездействуют. обозначает время окончания последней запланированной операции -той работы. — множество работ, где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(O_{ij}) if \mu_{ij} = A then do if T1 < LAST(i) then do t := LAST(i) A(t) := O_{ij} else t := T1; A(t) := O_{ij}; while A(T_1) \ne \emptyset do T1 := T1 + 1; else if T2 < LAST(i) then do t := LAST(i) B(t) := O_{ij} else t := T2; A(t) := O_{ij}; while B(T_2) \ne \emptyset do T2 := T2 + 1; LAST(i) := t + 1
Очевидно, что количество шагов алгоритма ограничено