J2pij1Lmax

Материал из Викиконспекты
Версия от 21:21, 15 мая 2016; 188.143.145.59 (обсуждение) (Описание решения)
Перейти к: навигация, поиск

J2pij=1Lmax

Задача:
Дано n работ i=1,,n и две машины, обозначенные как A и B. i-тая работа состоит из ni операций Oij (j=1,ni), которые должны быть выполнены последовательно и, при этом, если Oij операция была совершена на машине

A(B), то операция Oi,j1 должна быть совершена на машине B(A). Задача заключается в том, что для данного каждой i-той работе дедлайна di0 необходимо найти достижимое расписание с наименьшими максимальным временем опоздания:

max{Cidii=1,,n}

Описание решения

Судя по условию, i-тая работа может характеризоваться двумя значениями: количество операций ni и машиной, на которой была совершена первая операция. Пусть r=i=1nNi — общее количество операций.

Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхнюю границу момента начала выполнения последней операции обозначим за tmax. К примеру, мы можем выбрать tmax=r. Тогда расписание можно представить как два списка A(t) и B(t) (t=0,,tmax), где A(t)=Oij, если операция Oij должна выполниться на машине A в момент времени t и A(t)= , если машина A простаивает в этот момент. И для каждой операции Oij, выполняющейся на машине A существует t, для которого A(t)=Oij. Аналогично для Bi. Расписание достижимо тогда и только тогда, когда из A(t)(B(t))=Oij,1<jni следует Oi,j1=B(s)(A(s)) для некоторого s<t, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данного списка L осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующем L, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим L расписанием. Ci — время окончания работы i в достижимом расписании y=(A(t),B(t)) можно рассчитать как:

Ci=max{t+1A(t)} или B(t) — операция i-той работы.

Задача заключается в том, что для данного каждой работе i дедлайна di0 нужно найти достижимое расписание с наименьшим максимальным временем опоздания:

max{Cidii=1,,n}

Следующий алгоритм решает эту задачу:

  • введём для каждой операции Oij величину l(Oij)=dini+j,
  • создадим список всех операций L, упорядоченный в порядке неубывания значений l(Oij),
  • найдем соответствующее списку L расписание.

Этот алгоритм может быть реализован с асимптотикой O(rlogr).

Мы предполагаем, что di0 для i=1,,n и хотя бы для одной работы i di=0. Иначе, вычтем из всех di минимальное значение по di.

Так как Ci1 для всех i=1,,n и di=0 справедливо Li=Cidi1 как минимум для одной работы i. К тому же, можно предположить, что Cir. Таким образом, работы с di>r1, то есть c Li=Cidi<1, можно смело игнорировать. Они не влияют на значение улучшаемой функции max(Li), так как для некого i Li1 можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций Oij мы имеем:

r+1l(Oij)=dini+jr1

Каждую операцию мы кладём в соответствующий список (на самом деле это должна быть куча (англ. heap) для хорошей асимптотики) L(k), где k=l(Oij)=dini+j (r+1kr1). На втором шаге мы планируем операции соответственно возрастающему по номеру списка k порядку, где операции из одного списка могут выполнятся в произвольном порядке.

Алгоритм

Рассмотрим алгоритм. Пусть:

  • T1 и T2 — первый период времени t0, когда соответствующие машины A и B бездействуют;
  • LAST(i) — время окончания последней запланированной операции i-той работы;
  • Z — множество работ, где dir.
function main():
  for k = -r + 1 to r - 1
    L(k) = 
    Z = 
  for i = 1 to n
    if di < r
      for j = 1 to ni
        добавить Oij в L(dini+j)
    else
      добавить работу i в Z
  for i = 1 to n
    LAST(i) = 0
  T1 = 0
  T2 = 0
  for k = -r + 1 to r - 1
    while L(k)
      Выбрать задание Oij из L(k)
      L(k) = L(k){Oij}
      schedule(Oij) 
  while z
    Выбрать работу i из Z
    Z = Z{i};
    for j = 1 to ni
      schedule(Oij) 	
function schedule(Oij):
  if μij == A
    if T1 < LAST(i) 
      t = LAST(i)
      A(t) = Oij (*)
    else
      t = T1
      A(t) = Oij
      while A(T1) 
        T1 = T1 + 1
  else
    if T2 < LAST(i)
      t = LAST(i)
      B(t) = Oij (**)
    else
      t = T2
      A(t) = Oij
      while B(T2)
        T2 = T2 + 1
  LAST(i) = t + 1

Очевидно, что количество шагов алгоритма ограничено O(r).

Доказательство

Для доказательства того, что алгоритм решения задачи корректен, необходимо показать то, что он строит достижимое расписание. Это справедливо тогда и только тогда, когда до исполнения строчек (*) и (**) пусты A(t) и B(t) соответственно. Иначе две разные операции будут выполняться в один момент времени на одной машине. Для того, чтобы показать достижимость докажем лемму.

Лемма:
Пусть Y=(A(t),B(t)) — расписание, где B(t)= (A(t)=). Тогда для каждого s>t, где B(s)=Oij (A(s)=Oij) выполняется A(s1)=Oi,j1 (B(s1)=Oi,j1))
Доказательство:

Докажем по индукции по s, что если B(s)=Oij и s>t, то A(s1)=Oi,j1. Это, очевидно, верно при s=t+1 так как если B(t+1)=Oij и A(t) не соответствует работе i, то B(t)= означает что операция Oij должна быть запланирована в расписании ранее.

Предположим теперь что лемма верна для всех v при t<v<s и B(s)=Oij . Выберем максимальное l, такое что t<l<s и B(l)=. По предположению индукции, A(v1) и B(v) соответствуют одной и той же работе для v = l + 1,\ldots,s —- 1. Пусть A(s - 1) не соответствует работе i. Тогда для каждого v \in\{l, l + 1,\ldots , s - 1\} операция A(v) не соответствует работе i. Таким образом, O_{ij} может быть обработан в момент l, что противоречит тому, что Y является расписанием.
\triangleleft
Теорема:
Пусть O_{ij} — операция, которую планируют строчкой (*) или (**) и t = LAST(i) \gt T1(T2). Тогда A(t) = \emptyset (B(t) = \emptyset)
Доказательство:
\triangleright
Предположим что A(t) \neq \emptyset (B(t) \neq \emptyset). Поскольку A(T1) = \emptyset (B(T2) = \emptyset ), из предыдущей леммы следует, что A(t) и B(t-1) (B(t) и A(t-1)) являются операциями одной и той же задачи k. Так как LAST (i)= t, то должно быть значение k \neq i. Это невозможно, т.к. при LAST (i) = t и \mu_{ij} = A(\mu_{ij} = B) , B(t - 1) = O_{i,j-1} (A(t - 1) = O_{i,j-1}).
\triangleleft
Лемма:
Если существует расписание без опозданий, то данный алгоритм построит расписание без опозданий.
Доказательство:
\triangleright

Покажем, что если в расписании, построенном данным алгоритмом есть опоздание, то опоздание есть в каждом расписании. Если есть опоздание в Y = (A(t), B(t)) , то существует операция A(t) или B(t) с l(A(t)) \lt t + 1 или l(B(t)) \lt t + 1. Например, это неравенство верно для последней операции в конце работы. Выберем минимальное t с этим свойством и предположим, что l(A(t)) \lt t + 1. Тогда мы докажем, что l(A(v)) \leqslant l(A(t)) for v = 1, . . . , t - 1 и l(A(0)) \leqslant l(A(t)) if A(0) \neq \emptyset. (***) Таким образом, в каждом расписании должно существовать, по крайней мере, одно опоздание, т.к. если A(0)\neq \emptyset то l(A(v)) \lt t + 1 при v = 0, . . . , t и мы должны запланировать t + 1 операций во временном интервале [0, t] , что невозможно. Если же A(0) = \emptyset , то все задачи начинаются на машине B и t операций должны обрабатываться в интервале времени [1, t] , что тоже не возможно. Для доказательства (***) заметим, что (***) верно, если A(t) является первой операцией для работы, так как если l(A(t)) \lt l(A(v)) при некоторых v = 0. . . , t - 1, то алгоритм должен запланировать A(t) перед A(v) . Теперь положим A(t) = O_{ij} для какого-нибудь i и j \gt 1. Получим O_{ij-1} = B(s) при s \lt t - 1, так как из s = t - 1 следует l(B(s)) = l(A(t)) - 1 \lt t = s + 1, а это противоречит минимальности t. Из этого следует, что l(A(v)) \lt l(A(t)) при v = s + 1,\ldots,t - 1 так как в противном случае A(t) должно быть запланировано ранее. Также l(A(s)) \lt l(A(s + 1)) поскольку в противном случае A (s + 1) должно быть запланировано на время s, так как A (s + 1) и B(s) являются операциями различных задач. Для s = 0 мы доказали (***). Иначе пусть A(s) = O_{i’,j’,} . Если A (s) — первая операция задачи, мы закончили. В противном случае, если O_{i’,’j-1} = B(r) при r \lt s - 1, мы снова имеем

l(A(v)) \leqslant l(A(s)), v = r, . . . , s - 1.

Если O_{i',j'-1} = B(s - 1) , тогда возьмем минимальное r \leqslant s - 1 такое, что B(v) и A(v+1) являются последовательными операциями одной и той же задачи при v = r, \ldots,s - 1. A(s + 1) не соответствует задаче i, и мы снова имеем l(A(v)) \lt l(A(s + 1)), v = r,\ldots,s.Если r = 0, мы закончили. Если r \gt 0, продолжаем таким же образом.
\triangleleft
Теорема:
Расписание, построенное данным алгоритмом, оптимально.
Доказательство:
\triangleright

Пусть l — максимальное опоздание оптимального расписания. Тогда \max\limits_{i=1..n}L(i) = \max\limits_{i=1..n}(C_i - d_i) \leqslant l эквивалентно \max\limits_{i=1..n}(C_i - (d_i+l)) \leqslant 0.

По первой лемме, данный алгоритм применительно к задаче с дедлайнами d_i + l дает оптимальное расписание для исходной задаче. Кроме того, это расписание совпадает с расписанием, которое мы получим, применив данный алгоритм к исходной задаче.
\triangleleft

См. также.

Источники информации

  • Peter Brucker. «Scheduling Algorithms» — «Springer», 2006 г. — 180 — 186 стр. — ISBN 978-3-540-69515-8