J2pij1Lmax — различия между версиями
 (→Алгоритм)  | 
				|||
| Строка 41: | Строка 41: | ||
Давайте детально рассмотрим алгоритм. <tex>T1</tex> и <tex>T2</tex> обозначают первый период времени <tex>t \ge 0</tex>, когда соответствующие машины <tex>A</tex> и <tex>B</tex> бездействуют. <tex>LAST(i)</tex> обозначает время окончания последней запланированной операции <tex>i</tex>-той работы. <tex>Z</tex> {{---}} множество работ, где <tex>d_i \ge r</tex>    | Давайте детально рассмотрим алгоритм. <tex>T1</tex> и <tex>T2</tex> обозначают первый период времени <tex>t \ge 0</tex>, когда соответствующие машины <tex>A</tex> и <tex>B</tex> бездействуют. <tex>LAST(i)</tex> обозначает время окончания последней запланированной операции <tex>i</tex>-той работы. <tex>Z</tex> {{---}} множество работ, где <tex>d_i \ge r</tex>    | ||
| − |   '''main()  | + |   '''function''' main():  | 
| − |     '''for''' k  | + |     '''for''' k = -r + 1 '''to''' r - 1  | 
| − |       <tex>L(k)</tex> = <tex>\emptyset</tex>  | + |       <tex>L(k)</tex> = <tex>\emptyset</tex>  | 
| − |       Z = <tex>\emptyset</tex>  | + |       Z = <tex>\emptyset</tex>  | 
| − |     '''for''' i  | + |     '''for''' i = 1 '''to''' n  | 
      '''if''' <tex>d_i</tex> < r  |       '''if''' <tex>d_i</tex> < r  | ||
| − |         '''for''' j  | + |         '''for''' j = 1 '''to''' <tex>n_i</tex>  | 
          добавить <tex>O_{ij}</tex> в <tex>L(d_i - n_i + j)</tex>  |           добавить <tex>O_{ij}</tex> в <tex>L(d_i - n_i + j)</tex>  | ||
      '''else'''  |       '''else'''  | ||
        добавить работу i в Z  |         добавить работу i в Z  | ||
| − |     '''for''' i  | + |     '''for''' i = 1 '''to''' n  | 
| − |       LAST(i) = 0  | + |       LAST(i) = 0  | 
| − |     T1 = 0  | + |     T1 = 0  | 
| − |     T2 = 0  | + |     T2 = 0  | 
| − |     '''for''' k  | + |     '''for''' k = -r + 1 '''to''' r - 1  | 
      '''while''' <tex>L(k) \ne \emptyset</tex>  |       '''while''' <tex>L(k) \ne \emptyset</tex>  | ||
        Выбрать задание <tex>O_{ij}</tex> из <tex>L(k)</tex>  |         Выбрать задание <tex>O_{ij}</tex> из <tex>L(k)</tex>  | ||
| − |         <tex>L(k)</tex> = <tex>L(k)\setminus\{O_{ij}\}</tex>  | + |         <tex>L(k)</tex> = <tex>L(k)\setminus\{O_{ij}\}</tex>  | 
        schedule(<tex>O_{ij}</tex>)    |         schedule(<tex>O_{ij}</tex>)    | ||
    '''while''' <tex>z \ne \emptyset</tex>  |     '''while''' <tex>z \ne \emptyset</tex>  | ||
      Выбрать работу i из Z  |       Выбрать работу i из Z  | ||
      Z = <tex>Z \setminus\{i\}</tex>;  |       Z = <tex>Z \setminus\{i\}</tex>;  | ||
| − |       '''for''' j  | + |       '''for''' j = 1 '''to''' <tex>n_i</tex>  | 
        schedule(<tex>O_{ij}</tex>) 	  |         schedule(<tex>O_{ij}</tex>) 	  | ||
| − |   '''schedule(<tex>O_{ij}</tex>)  | + |   '''function''' schedule(<tex>O_{ij}</tex>):  | 
    '''if''' <tex>\mu_{ij}</tex> == A  |     '''if''' <tex>\mu_{ij}</tex> == A  | ||
      '''if''' T1 < LAST(i)    |       '''if''' T1 < LAST(i)    | ||
| Строка 72: | Строка 72: | ||
        A(t) = <tex>O_{ij}</tex> (*)  |         A(t) = <tex>O_{ij}</tex> (*)  | ||
      '''else'''  |       '''else'''  | ||
| − |         t = T1  | + |         t = T1  | 
| − |         A(t) = <tex>O_{ij}</tex>  | + |         A(t) = <tex>O_{ij}</tex>  | 
        '''while''' <tex>A(T_1)</tex> <tex>\ne \emptyset</tex>  |         '''while''' <tex>A(T_1)</tex> <tex>\ne \emptyset</tex>  | ||
| − |           T1 = T1 + 1  | + |           T1 = T1 + 1  | 
    '''else'''  |     '''else'''  | ||
      '''if''' T2 < LAST(i)  |       '''if''' T2 < LAST(i)  | ||
| Строка 81: | Строка 81: | ||
        B(t) = <tex>O_{ij}</tex> (**)  |         B(t) = <tex>O_{ij}</tex> (**)  | ||
      '''else'''  |       '''else'''  | ||
| − |         t = T2  | + |         t = T2  | 
| − |         A(t) = <tex>O_{ij}</tex>  | + |         A(t) = <tex>O_{ij}</tex>  | 
        '''while''' <tex>B(T_2) \ne \emptyset</tex>  |         '''while''' <tex>B(T_2) \ne \emptyset</tex>  | ||
| − |           T2 = T2 + 1  | + |           T2 = T2 + 1  | 
    LAST(i) = t + 1  |     LAST(i) = t + 1  | ||
Версия 22:48, 11 мая 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