QpmtnCmax

Материал из Викиконспекты
Версия от 15:13, 20 мая 2012; Creep (обсуждение | вклад) (Новая страница: «<div style="background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1p...»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
Эта статья находится в разработке!


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

Есть несколько станков с разной скоростью выполнения работ. Работу на каждом из станков можно прервать и продолжить позже.

Цель - выполнить все как можно быстрее.

1. Найдем нижнюю границу времени выполнения.

2. Составим оптимальное расписание.

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

[math] P_i = p_1 + ... + p_i[/math]

[math] S_j = p_1 + ... + p_j[/math]

Где [math]i = 1 ... n[/math]; [math]j = 1 ... m[/math]; [math] n \ge m[/math];

Необходимое условие для выполнения всех работ в интервале [math][0;T][/math]:

[math] P_n = p_1 + ... + p_n \le s_1T + ... + s_mT = S_mT[/math] или [math]P_n/S_m \le T[/math]

Нижняя граница [math]C_{max}[/math] :

[math]w = max[/math]{[math]max_{j=1..m-1} P_i/S_j, P_n/S_m[/math]}

Далее построим расписание, которое достигает нашей оценки w, с помощью Level-алгоритма.

Level - алгоритм:

  [math]t \leftarrow 0 [/math]
  WHILE существуют работы с положительным lvl
      Assign(t)
      [math]t1 \leftarrow min(s\gt t |[/math]работа выполненная в момент времени [math] s)[/math]
      [math]t2 \leftarrow min(s\gt t | p_i(t)\gt p_j(t)[/math] && [math]  p_i(s) == p_j(s))[/math]
      [math] t \leftarrow min(t1,t2) [/math]
  Построение расписания

Функция [math]Assign(t)[/math]:

  [math]J = [/math]{[math]i|p_i(t)\gt 0[/math]}
  [math]M = [/math]{[math]M_1,...,M_m[/math]}
  WHILE ([math]J[/math] != 0 && [math]M[/math] != 0)
     Найти множество работ [math]I[/math] подмножество [math]J[/math] ,lvl которых максимальный
     [math]r \leftarrow min[/math](|[math]M[/math]|,|[math]I[/math]|)
     Назначаем работы из мн-ва [math]I[/math] на [math]r[/math] самых быстрых машин из мн-ва [math]M[/math]
     [math]J \leftarrow J[/math]\[math]I[/math]
     удаляем из мн-ва [math]M[/math] [math]r[/math] самых быстрых машин

Пример

Картинка к примеру

Пусть у нас есть 5 работ и 4 станка. Покажем работу алгоритма для данного случая.

В начальный момент времени начинаем обрабатывать работы с наибольшим временем выполнения [math]J_1-J_4[/math] на станках [math]M_1-M4[/math] соответственно. В момент времени [math]t_1[/math] lvl 4-ой работы опускается до времени выполнения 5-ой работы. С этого момента начинаем обрабатывать работы [math] J_4,J_5[/math] на одном станке: [math]M_4[/math]. В момент времени [math]t_2[/math] происходит похожая ситуация. С этого момента времени работы [math] J_1,J_2[/math] выполняются синхронно на двух станках [math] M_1,M_2[/math]. Далее работы не пересекаются друг с другом и каждая заканчивается на ранее выделенных им станках.

Время работы

Level-алгоритм вызывает функцию Assign(t) в самом худшем случае [math]O(n)[/math] раз. Функция Assign(t) выполняется за [math]O(nm)[/math]. Итоговое время работы [math]O(n^2m)[/math].

Литература

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