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

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 7: Строка 7:
  
 
==Алгоритм решения==
 
==Алгоритм решения==
Пусть <tex> i_1, i_2, ... i_r </tex> последовательность работ, выполняемых на станке с номером <tex> j </tex>. Тогда вклад этих работ в целевую функцию будет равен <tex> p_{i1}\frac{r}{s_j} + p_{i2}\frac{r-1}{s_j}+...+p_{ir}\frac{1}{s_j} </tex>. Отсюда видно, что сумма оптимальна, когда последовательность <tex> p_{ij} </tex> не убывает.
+
Пусть <tex> i_1, i_2, \cdots i_r </tex> последовательность работ, выполняемых на станке с номером <tex> j </tex>. Тогда вклад этих работ в целевую функцию будет равен <tex> p_{i1}\frac{r}{s_j} + p_{i2}\frac{r-1}{s_j}+ \cdots +p_{ir}\frac{1}{s_j} </tex>. Отсюда видно, что сумма оптимальна, когда последовательность <tex> p_{ij} </tex> не убывает.
Теперь введем неубывающую последовательность <tex> t_1, t_2 ... t_n </tex>, которая состоит из <tex> n </tex> маленьких элементов из множества <tex> \{\frac{1}{s_1}, \frac{1}{s_2} ... \frac{1}{s_m}, \frac{2}{s_1}, \frac{2}{s_2} ... \frac{2}{s_m}, \frac{3}{s_1} ... \}</tex>. Если <tex> t_i = \frac{k}{s_j} </tex>, то на <tex> j</tex>-том станке
+
Теперь введем неубывающую последовательность <tex> t_1, t_2 ... t_n </tex>, которая состоит из <tex> n </tex> минимальных элементов из множества <tex> \{\frac{1}{s_1}, \frac{1}{s_2} \cdots \frac{1}{s_m}, \frac{2}{s_1}, \frac{2}{s_2} \cdots \frac{2}{s_m}, \frac{3}{s_1} \cdots \}</tex>. Тогда <tex> t_i</tex> показывает на каком станке и какой по счету с конца должна выполняться работа с номером <tex>i</tex> в отсортированном по длительности списке работ. Сопоставляя работы и <tex> t_i</tex> составляем расписание.
  
==Псевдокод==
+
{{Теорема
for <tex>j</tex> = 1 to <tex>m</tex> do
+
|statement=
  <tex>\Pi_j = {\o} </tex>
+
Приведенный алгоритм верен.
  <tex>w_j = \frac{1}{s_j}</tex>
+
|proof=  
for <tex>i</tex> = 1 to <tex>n</tex> do
+
# Докажем правильность выбора мест работ. Станок, на котором выполняется работа, и номер работы на этом станке с конца определяет коэффициент перед длительностью выполнения <tex> p_i\frac{t}{s_j} </tex>, тут <tex> t</tex> - номер работы с конца, а <tex>j</tex> - номер станка. Именно с таким коэффициентом работа войдет в целевую функцию. Мы выбираем минимальные <tex>n</tex> коэффициентов, следовательно, взяв хотя бы один другой коэффициент, мы увеличим время работы.
  Find the largest index <tex> j </tex> of <tex>w_j</tex> = <tex>\min\limits_{l=1}^{m}{w_l}</tex>;
+
# Докажем, что работы надо сопоставлять в порядке не убывания. Предположим у нас есть коэффициенты <tex> t_i </tex> и <tex> t_j </tex>, такие что <tex> t_i \le t_j </tex> и работы <tex> p_k \ge p_l </tex>, и мы сопоставили <tex> t_i </tex> с <tex> p_l </tex>, а <tex>t_j</tex> с <tex>p_k</tex>. Тогда, если мы поменяем работы местами, то значение целевой функции станет меньше на <tex> p_k(t_j - t_i)+p_l(t_i-t_j) = (p_k - p_l)(t_j-t_i) \ge 0</tex>. Видно, что результат не ухудшится.
  <tex>\Pi_j = i \cup \Pi_j </tex>
+
}}
  <tex>w_j = w_j + \frac{1}{s_j} </tex>
+
 
 +
==Время работы==
 +
 
 +
Начальная сортировка работ занимается <tex>O(n\log{n})</tex> времени. Затем происходит выбор минимальных коэффициентов, посредством приоритетной очереди время работы составит <tex>O(n\log{m})</tex>. Итого суммарное время работы <tex> O(n(\log{n}+\log{m}))</tex>.
  
 
==Литература==
 
==Литература==

Версия 20:55, 21 июня 2012


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

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

Цель - составить такое расписание, чтобы суммарное время окончания всех работ было минимальным.

Алгоритм решения

Пусть [math] i_1, i_2, \cdots i_r [/math] последовательность работ, выполняемых на станке с номером [math] j [/math]. Тогда вклад этих работ в целевую функцию будет равен [math] p_{i1}\frac{r}{s_j} + p_{i2}\frac{r-1}{s_j}+ \cdots +p_{ir}\frac{1}{s_j} [/math]. Отсюда видно, что сумма оптимальна, когда последовательность [math] p_{ij} [/math] не убывает. Теперь введем неубывающую последовательность [math] t_1, t_2 ... t_n [/math], которая состоит из [math] n [/math] минимальных элементов из множества [math] \{\frac{1}{s_1}, \frac{1}{s_2} \cdots \frac{1}{s_m}, \frac{2}{s_1}, \frac{2}{s_2} \cdots \frac{2}{s_m}, \frac{3}{s_1} \cdots \}[/math]. Тогда [math] t_i[/math] показывает на каком станке и какой по счету с конца должна выполняться работа с номером [math]i[/math] в отсортированном по длительности списке работ. Сопоставляя работы и [math] t_i[/math] составляем расписание.

Теорема:
Приведенный алгоритм верен.
Доказательство:
[math]\triangleright[/math]
  1. Докажем правильность выбора мест работ. Станок, на котором выполняется работа, и номер работы на этом станке с конца определяет коэффициент перед длительностью выполнения [math] p_i\frac{t}{s_j} [/math], тут [math] t[/math] - номер работы с конца, а [math]j[/math] - номер станка. Именно с таким коэффициентом работа войдет в целевую функцию. Мы выбираем минимальные [math]n[/math] коэффициентов, следовательно, взяв хотя бы один другой коэффициент, мы увеличим время работы.
  2. Докажем, что работы надо сопоставлять в порядке не убывания. Предположим у нас есть коэффициенты [math] t_i [/math] и [math] t_j [/math], такие что [math] t_i \le t_j [/math] и работы [math] p_k \ge p_l [/math], и мы сопоставили [math] t_i [/math] с [math] p_l [/math], а [math]t_j[/math] с [math]p_k[/math]. Тогда, если мы поменяем работы местами, то значение целевой функции станет меньше на [math] p_k(t_j - t_i)+p_l(t_i-t_j) = (p_k - p_l)(t_j-t_i) \ge 0[/math]. Видно, что результат не ухудшится.
[math]\triangleleft[/math]

Время работы

Начальная сортировка работ занимается [math]O(n\log{n})[/math] времени. Затем происходит выбор минимальных коэффициентов, посредством приоритетной очереди время работы составит [math]O(n\log{m})[/math]. Итого суммарное время работы [math] O(n(\log{n}+\log{m}))[/math].

Литература

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