Flow shop — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м
Строка 1: Строка 1:
Дадим определение этого типа задач:
+
== Описание ==
 
{{Определение
 
{{Определение
 
|definition =
 
|definition =
'''Flow shop''' ('''<tex>F_{m}</tex>''' в нотации Грэхема): В системе находится m машин, работающих параллельно. Машины упорядочены. Каждая работа должна быть выполнена последовательно на всех машинах с первой по последнюю.}}
+
'''Flow shop''' ('''<tex>F_{m}</tex>''' в нотации Грэхема): В системе находится <tex> m </tex> машин, работающих параллельно. Машины упорядочены. Каждая работа должна быть выполнена последовательно на всех машинах с первой по последнюю.}}
  
 
Рассмотрим пример:  <tex>F \mid p_{ij} = 1 \mid C_{max}</tex>
 
Рассмотрим пример:  <tex>F \mid p_{ij} = 1 \mid C_{max}</tex>
  
Допустим, у нас <tex>n</tex> работ и <tex>m</tex> машин. В начальный момент времени мы можем начать обрабатывать любую работу на первой машине. В следующий момент на первой машине можно обрабатывать следующую работу, а на второй перейдёт предыдущая работа с первой машины, и так далее. Таким образом, на выполнение всех работ у нас уйдёт <tex>n + m - 1</tex> единиц времени. Проиллюстрируем это диаграммой Ганта для случая <tex>n = 6, m = 5</tex>: (по горизонтали время, по вертикали машины, в ячейке — номер выполняемой работы)
+
Допустим, у нас <tex>n</tex> работ и <tex>m</tex> машин. В начальный момент времени мы можем начать обрабатывать любую работу на первой машине. В следующий момент на первой машине можно обрабатывать следующую работу, а на второй перейдёт предыдущая работа с первой машины, и так далее. Таким образом, на выполнение всех работ у нас уйдёт <tex>n + m - 1</tex> единиц времени. Проиллюстрируем это диаграммой Гантта для случая <tex>n = 6, m = 5</tex>:
 
         '''0  1  2  3  4  5  6  7  8  9  10'''
 
         '''0  1  2  3  4  5  6  7  8  9  10'''
 
         -------------------------------------------
 
         -------------------------------------------
Строка 15: Строка 15:
 
   '''M_5'''  |    -  -  -  -  1  2  3  4  5  6
 
   '''M_5'''  |    -  -  -  -  1  2  3  4  5  6
  
Заметим, что в данном случае <tex>p_{ij}</tex> может быть равно не только единице, но и константе.
+
Заметим, что в данном случае <tex>p_{ij}</tex> может быть равно не только единице, но и любой константе.
 
+
Так же, поскольку работа заканчивает выполняться всегда на последней машине, для решения задач с <tex>p_{ij} = const</tex> нас интересует порядок выполнения работ только на последнем машине.
 
 
{{Утверждение
 
{{Утверждение
|statement = Задачи вида <tex>F | p_{ij} = const | ?</tex> можно сводить к задачам вида <tex>1 | p_{ij} = const | ?</tex> }}
+
|statement = Любая задача вида <tex>F \mid p_{ij} = 1 \mid ? </tex> сводится к соответствующей задаче вида <tex>1 \mid p_{ij} = 1 \mid ?</tex>.
 +
|proof =
 +
Поскольку работа всегда заканчивает выполняться на последней машине, нас интересуют только времена завершения работ на последней машине. Также очевидно, что последняя машина может начать работать только в момент времени <tex> m - 1 </tex>. Оказывается, что любое решение задачи <tex> 1 \mid p_{ij} = 1 \mid ? </tex> с дедлайнами, уменьшенными на <tex> m - 1 </tex> можно преобразовать в оптимальное расписание для задачи <tex>F \mid p_{ij} = 1 \mid ? </tex>. Докажем это.
  
 +
Возьмем оптимальное расписание для соответствующей задачи с одним станком, выполним работы в этом порядке на первой машине, затем на второй машине, начиная с момента времени <tex> 1 </tex>, и так далее, до выполнения на последней машине, начиная с <tex> m - 1 </tex>. Это расписание корректно и соблюдает все дедлайны. Поскольку целевая функция совпадает с соответствующей функцией для задачи на одном станке, оно оптимально и для данной задачи.
 +
}}
  
Задачи с произвольно заданными временами выполнения работ почти все являются NP-трудными и решаются приближённо в случае необходимости.
+
Задачи с произвольными временами выполнения работ почти все являются NP-трудными.
  
== <tex>F_2 \mid \mid C_{max}</tex> ==
+
== Задача Джонсона о двух станках <tex>F_2 \mid \mid C_{max}</tex> ==
  
 
Это единственная из flow shop задач с произвольными временами выполнения работ, которая решается за полиномиальное время.
 
Это единственная из flow shop задач с произвольными временами выполнения работ, которая решается за полиномиальное время.
Строка 30: Строка 33:
 
Приведём здесь решение задачи без доказательства, его можно посмотреть в [1].
 
Приведём здесь решение задачи без доказательства, его можно посмотреть в [1].
  
Оптимальное расписание для первой и второй машины будет совпадать. Таким образом, нам требуется найти перестановку входных работ.
+
Оптимальное расписание для первой и второй машины будет совпадать. Таким образом, нам требуется найти порядок, в котором будут выполняться работы на каждой машине.
  
 
Алгоритм такой: возьмём два пустых списка. Будем рассматривать работы в порядке возрастания <tex>min(p_1, p_2)</tex>, то есть, минимума из времён выполнения данной работы на первой и второй машине. Если у работы <tex>p_1 <= p_2</tex>, то добавим её в конец первого списка. В противном случае, добавим её в начало второго списка. Итоговое расписание — это конкатенация первого и второго списков.
 
Алгоритм такой: возьмём два пустых списка. Будем рассматривать работы в порядке возрастания <tex>min(p_1, p_2)</tex>, то есть, минимума из времён выполнения данной работы на первой и второй машине. Если у работы <tex>p_1 <= p_2</tex>, то добавим её в конец первого списка. В противном случае, добавим её в начало второго списка. Итоговое расписание — это конкатенация первого и второго списков.
Строка 47: Строка 50:
  
  
== <tex>F_2 \mid pmtn \mid C_{max}</tex> ==
+
== Задача Джонсона о двух станках с прерываниями <tex>F_2 \mid pmtn \mid C_{max}</tex> ==
  
Оптимальное решение этой задачи совпадает с решением задачи <tex>F_2 \mid \mid C_{max}</tex> , приведённой выше. Докажем это.
+
Оптимальное решение этой задачи совпадает с решением задачи <tex>F_2 \mid \mid C_{max}</tex>, приведённой выше. Докажем это.
  
 
Пусть у нас есть оптимальное расписание для задачи <tex>F_2 \mid pmtn \mid C_{max}</tex>. Покажем, что его за конечное число шагов можно преобразовать к расписанию без прерываний, не изменив при это значение <tex>C_{max}</tex> .
 
Пусть у нас есть оптимальное расписание для задачи <tex>F_2 \mid pmtn \mid C_{max}</tex>. Покажем, что его за конечное число шагов можно преобразовать к расписанию без прерываний, не изменив при это значение <tex>C_{max}</tex> .
  
Рассмотрим первую машину. Допустим, что некоторая работа J выполняется в 2 разных промежутка времени. Тогда передвинем более ранний промежуток вправо по оси времени так, чтоб он заканчивался в том момент, когда мы начинается второй промежуток. Таким образом работа J станет выполняться без прерывания. При этом работы, которые были между промежутками, сдвинем влево на длину первого промежутка. Расписание при этом осталось корректным, так как работы на машинах по прежнему не пересекаются, и каждая работа на второй машине делается после того, как она сделана на первой: работа J может начать выполняться на второй машине только после того, как она целиком выполнится на первой, то есть уже после конца второго промежутка; а остальные работы были сдвинуты влево, наложений точно не возникнет.
+
Рассмотрим первую машину. Допустим, что некоторая работа <tex> J </tex> выполняется в <tex> 2 </tex> или более разных промежутка времени. Тогда передвинем более ранний промежуток вправо по оси времени так, чтоб он заканчивался в тот момент, когда начинается второй промежуток, при этом работы, которые были между этими двумя промежутками, сдвинем влево на длину первого промежутка. Расписание при этом осталось корректным, так как работы на машинах по-прежнему не пересекаются, и каждая работа на второй машине делается после того, как она сделана на первой: работа <tex> J </tex> может начать выполняться на второй машине только после того, как она целиком выполнится на первой, то есть уже после конца второго промежутка; а время окончания выполнения остальных работ на первой машине неувеличилось.
Будем повторять эту операцию до тех пор, пока на первой машине все работы не станут выполняться без прерываний.
+
Важно, что подобная операция не увеличивает <tex> C_{max} </tex>.
 +
 
 +
Будем повторять эту операцию до тех пор, пока на первой машине все работы не станут выполняться без прерываний. Так как количество прерываний конечно, а такая операция уменьшает их количество на один, этот процесс конечен.
  
Теперь избавимся от прерываний на второй машине. Точно так же рассмотрим работу, разбитую на два промежутка. Передвинем более поздний промежуток к концу более раннего, а работы между ними сдвинем вправо. Расписание останется корректным по аналогичным причинам. Повторим операцию.
+
Теперь избавимся от прерываний на второй машине. Точно так же рассмотрим работу, разбитую на два или более промежутка. Передвинем более поздний промежуток к концу более раннего, а работы между ними сдвинем вправо. Доказательство корректности измененного расписания аналогично доказательству для первой машины. Будем повторять данную операцию, пока на второй машине присутствуют прерывания.
  
Таким образом, мы получили корректное расписание без прерываний, не изменив при этом значение <tex>C_{max}</tex> , так как мы только меняли порядок выполнения работ, что и требовалось доказать.
+
Таким образом, мы получили корректное расписание без прерываний, не изменив при этом значение <tex>C_{max}</tex>, что и требовалось доказать.
  
  

Версия 12:50, 22 июня 2012

Описание

Определение:
Flow shop ([math]F_{m}[/math] в нотации Грэхема): В системе находится [math] m [/math] машин, работающих параллельно. Машины упорядочены. Каждая работа должна быть выполнена последовательно на всех машинах с первой по последнюю.


Рассмотрим пример: [math]F \mid p_{ij} = 1 \mid C_{max}[/math]

Допустим, у нас [math]n[/math] работ и [math]m[/math] машин. В начальный момент времени мы можем начать обрабатывать любую работу на первой машине. В следующий момент на первой машине можно обрабатывать следующую работу, а на второй перейдёт предыдущая работа с первой машины, и так далее. Таким образом, на выполнение всех работ у нас уйдёт [math]n + m - 1[/math] единиц времени. Проиллюстрируем это диаграммой Гантта для случая [math]n = 6, m = 5[/math]:

        0   1   2   3   4   5   6   7   8   9   10
        -------------------------------------------
 M_1   |    1   2   3   4   5   6   -   -   -   -
 M_2   |    -   1   2   3   4   5   6   -   -   -
 M_3   |    -   -   1   2   3   4   5   6   -   -
 M_4   |    -   -   -   1   2   3   4   5   6   -
 M_5   |    -   -   -   -   1   2   3   4   5   6

Заметим, что в данном случае [math]p_{ij}[/math] может быть равно не только единице, но и любой константе.

Утверждение:
Любая задача вида [math]F \mid p_{ij} = 1 \mid ? [/math] сводится к соответствующей задаче вида [math]1 \mid p_{ij} = 1 \mid ?[/math].
[math]\triangleright[/math]

Поскольку работа всегда заканчивает выполняться на последней машине, нас интересуют только времена завершения работ на последней машине. Также очевидно, что последняя машина может начать работать только в момент времени [math] m - 1 [/math]. Оказывается, что любое решение задачи [math] 1 \mid p_{ij} = 1 \mid ? [/math] с дедлайнами, уменьшенными на [math] m - 1 [/math] можно преобразовать в оптимальное расписание для задачи [math]F \mid p_{ij} = 1 \mid ? [/math]. Докажем это.

Возьмем оптимальное расписание для соответствующей задачи с одним станком, выполним работы в этом порядке на первой машине, затем на второй машине, начиная с момента времени [math] 1 [/math], и так далее, до выполнения на последней машине, начиная с [math] m - 1 [/math]. Это расписание корректно и соблюдает все дедлайны. Поскольку целевая функция совпадает с соответствующей функцией для задачи на одном станке, оно оптимально и для данной задачи.
[math]\triangleleft[/math]

Задачи с произвольными временами выполнения работ почти все являются NP-трудными.

Задача Джонсона о двух станках [math]F_2 \mid \mid C_{max}[/math]

Это единственная из flow shop задач с произвольными временами выполнения работ, которая решается за полиномиальное время.

Приведём здесь решение задачи без доказательства, его можно посмотреть в [1].

Оптимальное расписание для первой и второй машины будет совпадать. Таким образом, нам требуется найти порядок, в котором будут выполняться работы на каждой машине.

Алгоритм такой: возьмём два пустых списка. Будем рассматривать работы в порядке возрастания [math]min(p_1, p_2)[/math], то есть, минимума из времён выполнения данной работы на первой и второй машине. Если у работы [math]p_1 \lt = p_2[/math], то добавим её в конец первого списка. В противном случае, добавим её в начало второго списка. Итоговое расписание — это конкатенация первого и второго списков.

Псевдокод:

J - множество работ
Head [math] \leftarrow \emptyset [/math]
Tail [math] \leftarrow \emptyset [/math]
while J [math] \ne \emptyset [/math] 
    do
        I [math] \leftarrow [/math] работа с минимальным значением [math]min(p_1, p_2)[/math]
        if [math]p_1 \lt = p_2[/math] Head [math] \leftarrow [/math] Head [math]\circ[/math] I
        else Tail [math] \leftarrow [/math] I [math]\circ[/math] Tail
        J [math] \leftarrow [/math] J [math] \backslash [/math] I
Result [math] \leftarrow [/math] Head [math]\circ[/math] Tail


Задача Джонсона о двух станках с прерываниями [math]F_2 \mid pmtn \mid C_{max}[/math]

Оптимальное решение этой задачи совпадает с решением задачи [math]F_2 \mid \mid C_{max}[/math], приведённой выше. Докажем это.

Пусть у нас есть оптимальное расписание для задачи [math]F_2 \mid pmtn \mid C_{max}[/math]. Покажем, что его за конечное число шагов можно преобразовать к расписанию без прерываний, не изменив при это значение [math]C_{max}[/math] .

Рассмотрим первую машину. Допустим, что некоторая работа [math] J [/math] выполняется в [math] 2 [/math] или более разных промежутка времени. Тогда передвинем более ранний промежуток вправо по оси времени так, чтоб он заканчивался в тот момент, когда начинается второй промежуток, при этом работы, которые были между этими двумя промежутками, сдвинем влево на длину первого промежутка. Расписание при этом осталось корректным, так как работы на машинах по-прежнему не пересекаются, и каждая работа на второй машине делается после того, как она сделана на первой: работа [math] J [/math] может начать выполняться на второй машине только после того, как она целиком выполнится на первой, то есть уже после конца второго промежутка; а время окончания выполнения остальных работ на первой машине неувеличилось. Важно, что подобная операция не увеличивает [math] C_{max} [/math].

Будем повторять эту операцию до тех пор, пока на первой машине все работы не станут выполняться без прерываний. Так как количество прерываний конечно, а такая операция уменьшает их количество на один, этот процесс конечен.

Теперь избавимся от прерываний на второй машине. Точно так же рассмотрим работу, разбитую на два или более промежутка. Передвинем более поздний промежуток к концу более раннего, а работы между ними сдвинем вправо. Доказательство корректности измененного расписания аналогично доказательству для первой машины. Будем повторять данную операцию, пока на второй машине присутствуют прерывания.

Таким образом, мы получили корректное расписание без прерываний, не изменив при этом значение [math]C_{max}[/math], что и требовалось доказать.


См. также

Литература