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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Алгоритм)
(Алгоритм)
Строка 10: Строка 10:
 
Будем добавлять в <tex>S</tex> работы в порядке неубывания значений <tex>d_j</tex>, если успеваем их выполнить.  
 
Будем добавлять в <tex>S</tex> работы в порядке неубывания значений <tex>d_j</tex>, если успеваем их выполнить.  
  
  Отсортировать работы так, чтобы <tex>d_1 \leqslant d_2 \leqslant \dots \leqslant d_n</tex>
+
  '''function''' <tex>\mathrm{sequence}</tex>(<tex>d</tex>: '''int[]'''): '''int[]'''
<tex>S = \varnothing</tex>
+
  <tex>S = \varnothing</tex>
<tex>time = 0</tex>
+
  <tex>time = 0</tex>
'''for''' i = 1 '''to''' n '''do'''
+
  '''for''' <tex> i = 1 </tex> '''to''' <tex>n</tex> '''do'''
  <tex>d_i = \min\{d_i, n\}</tex>  
+
    <tex>d[i] = \min\{d[i], n\}</tex>  
'''for''' i = 1 '''to''' n '''do'''
+
  Сортиуем d подсчетом
  '''if''' <tex>time < d_i</tex>
+
  '''for''' <tex> i = 1 </tex> '''to''' <tex>n</tex> '''do'''
    <tex>S = S \cup \{ i \}</tex>
+
    '''if''' <tex>time < d[i]</tex>
  <tex>time</tex> <code>+=</code> <tex>1</tex>
+
      <tex>S = S \cup \{ i \}</tex>
 +
      <tex>time</tex> <code>+=</code> <tex>1</tex>
 +
'''return''' <tex>S</tex>
 
    
 
    
 
Cортировку работ по неубыванию дедлайнов осуществляем с помощью сортировки подсчетом за <tex>O(n)</tex>, а значит и весь алгоритм будет работать за <tex>O(n)</tex>.  
 
Cортировку работ по неубыванию дедлайнов осуществляем с помощью сортировки подсчетом за <tex>O(n)</tex>, а значит и весь алгоритм будет работать за <tex>O(n)</tex>.  

Версия 20:28, 8 июня 2016

[math]1 \mid p_i=1\mid \sum U_i[/math]


Задача:
Дан один станок и [math]n[/math] работ, для которых заданы их дедлайны [math]d_i[/math], а все времена выполнения на этом станке [math]p_i = 1[/math]. Нужно успеть выполнить как можно больше работ.


Алгоритм

Чтобы получить оптимальное расписание, будем строить максимальное множество [math]S[/math] тех работ, которые успеют выполниться. Само расписание тогда будет состоять из всех работ из [math]S[/math], упорядоченных по неубыванию дедлайнов. Будем добавлять в [math]S[/math] работы в порядке неубывания значений [math]d_j[/math], если успеваем их выполнить.

function [math]\mathrm{sequence}[/math]([math]d[/math]: int[]): int[] 
  [math]S = \varnothing[/math]
  [math]time = 0[/math]
  for [math] i = 1 [/math] to [math]n[/math] do
    [math]d[i] = \min\{d[i], n\}[/math] 
  Сортиуем d подсчетом
  for [math] i = 1 [/math] to [math]n[/math] do
    if [math]time \lt  d[i][/math]
      [math]S = S \cup \{ i \}[/math]
      [math]time[/math] += [math]1[/math]
return [math]S[/math]
  

Cортировку работ по неубыванию дедлайнов осуществляем с помощью сортировки подсчетом за [math]O(n)[/math], а значит и весь алгоритм будет работать за [math]O(n)[/math]. Во время сортировки стоит учитывать, что дедлайны могут значительно превосходить количество задач. В таком случае необходимо предварительно пересчитать дедлайны по формуле [math]d_i = \min\{d_i, n\}[/math] (в оптимальном расписании мы не выполняем работы позже времени [math]t=n[/math]).

В результате выполнения данного алгоритма будет получено корректное расписание, в котором каждая работа встречается не более одного раза. Оптимальность полученного расписания доказывается аналогично [math]1 \mid \mid \sum w_{i}U_{i}[/math].

См. также

Источники информации

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