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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Описание алгоритма)
(Псевдокод)
Строка 26: Строка 26:
  
 
==Псевдокод==
 
==Псевдокод==
 +
  <tex>L \leftarrow \varnothing </tex>
 +
  <tex>R \leftarrow \varnothing </tex>
 +
  <tex>X \leftarrow \{1, \dots, n\}</tex>
 +
  while <tex> X \neq \varnothing</tex>
 +
      Найти <tex> i </tex> и <tex> j </tex>, где <tex>p_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}</tex>
 +
      if j = 1
 +
        <tex>L \leftarrow L \circ i </tex>
 +
      else
 +
        <tex>R \leftarrow i \circ R </tex>
 +
      <tex>X \leftarrow X \setminus \{i\} </tex>
 +
  <tex>T \leftarrow L \circ R</tex>
 +
 +
  Расставляем работы на первом станке согласно перестановке <tex> T </tex>
 +
 
 +
  Расставляем работы на втором станке согласно перестановке <tex> T </tex>
 +
  и времени начала соответсвующей работы на первом станке.
  
 
==Сложность алгоритма==
 
==Сложность алгоритма==

Версия 18:57, 10 июня 2013

Постановка задачи

Рассмотрим задачу:

  1. Дано [math]n[/math] работ и [math]2[/math] станка.
  2. Для каждой работы известно её время выполнения на каждом станке.
  3. Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.

Требуется минимизировать время окончания всех работ.

Описание алгоритма

Пусть [math]p_{i1}[/math] — время выполнения [math]i[/math]-ой работы на первом станке, а [math]p_{i2}[/math] — на втором.

  1. Будем в ходе нашего алгоритма строить два списка [math] L [/math] и [math] R [/math]. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам [math] L [/math] и [math] R [/math] работ [math]X = \{i \mid i = 1, \dots, n\}[/math]
  2. Пока множество [math] X [/math] непусто будем распределять работы по спискам следующим образом:
    • Находим такие индексы [math] i [/math] и [math] j [/math], что [math]p_{ij} = \min \{ p_{ij} \mid i \in X; j = 1, 2\}[/math]
    • Если минимум достигается на первом станке (иными словами [math] j = 1 [/math]), то поставим работу [math] i [/math] в конец листа [math] L [/math], иначе ставим в начало листа [math] R [/math]
    • Удаляем работу [math] i [/math] из множества [math] X [/math]
  3. Рассмотрим лист [math] T = L \circ R[/math]. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы.

Доказательство корректности алгоритма

Псевдокод

  [math]L \leftarrow \varnothing [/math]
  [math]R \leftarrow \varnothing [/math]
  [math]X \leftarrow \{1, \dots, n\}[/math]
  while [math] X \neq \varnothing[/math]
     Найти [math] i [/math] и [math] j [/math], где [math]p_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}[/math]
     if j = 1
        [math]L \leftarrow L \circ i [/math]
     else 
        [math]R \leftarrow i \circ R [/math]
     [math]X \leftarrow X \setminus \{i\} [/math]
  [math]T \leftarrow L \circ R[/math]

  Расставляем работы на первом станке согласно перестановке [math] T [/math]
  
  Расставляем работы на втором станке согласно перестановке [math] T [/math]
  и времени начала соответсвующей работы на первом станке.

Сложность алгоритма

Источники

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