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
Очевидно, что количество шагов алгоритма ограничено