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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Источники информации)
(Алгоритм)
Строка 8: Строка 8:
 
Отсортируем работы по порядку их появления.
 
Отсортируем работы по порядку их появления.
  
Алгоритм <tex>1 | r_{i}, d_{i}, p_{i}=1 | -</tex>
+
Алгоритм <tex>1 | r_{i}, d_{i}, p_{i}=1 | -</tex>:
    <tex>S:=\varnothing;</tex>
+
  <tex>S = \varnothing;</tex>
    <tex>j\leftarrow1;</tex>
+
  <tex>j = 1;</tex>
    <tex>time\leftarrow1;</tex>
+
  <tex>time = 1;</tex>
    <tex>FOR</tex>  <tex>i := 1</tex> <tex>TO</tex> <tex>n</tex> <tex>DO</tex>
+
  '''for''' <tex> i = 1 </tex> '''to''' <tex> n </tex>:
          <tex>BEGIN</tex>
+
      '''if''' <tex>S == \varnothing</tex>:
          <tex>IF</tex> <tex>S=\varnothing</tex> <tex>THEN</tex>
+
          <tex>time=r_{j}</tex>
              <tex>BEGIN</tex> <tex>time:=r_{j}</tex> <tex>END</tex>
+
      '''while''' <tex>time==r_{j}</tex>:
          <tex>WHILE</tex> <tex>time=r_{j}</tex> <tex>DO</tex>
+
          <tex>S \leftarrow S \cup \{j\}</tex>
              <tex>BEGIN</tex>
+
          <tex>j = j + 1;</tex>
              Добавить <tex>j</tex> в <tex>S</tex>
+
      <tex>d_{k} = min\{d_{i}</tex> | <tex>i \in S\}</tex>
              <tex>j:=j+1;</tex>
+
      '''if''' <tex>d_{k} \le time</tex>:
              <tex>END</tex>
+
          Расписание составить невозможно
          Пусть <tex>k\in S</tex> и <tex>d_{k}</tex> минимально
+
      '''else''':
          <tex>IF</tex> <tex>d_{k}\le time</tex> <tex>THEN</tex>
+
           <tex>S \leftarrow S \setminus \{k\}</tex>
              Расписание составить невозможно
+
          <tex>time = time + 1;</tex>
           <tex>ELSE</tex>
 
              <tex>BEGIN</tex>
 
              Удалить <tex>k</tex> из <tex>S</tex>
 
              <tex>time:=time+1;</tex>
 
              <tex>END</tex>
 
          <tex>END</tex>
 
  
Сложность алгоритма <tex>O(n\log n)</tex> если в качестве <tex>S</tex> использовать структуру, которая позволяет поиск элемента с минимальным <tex>d_{i}</tex> за <tex>O(\log n)</tex>.  
+
Сложность алгоритма <tex>O(n\log n)</tex> если в качестве <tex>S</tex> использовать структуру, которая позволяет поиск элемента с минимальным <tex>d_{i}</tex> за <tex>O(\log n)</tex>.
  
 
==Доказательство корректности алгоритма==
 
==Доказательство корректности алгоритма==

Версия 20:47, 4 июня 2016

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

Дан один станок на котором нужно выполнить [math]n[/math] работ. Для каждой работы известны моменты времени, когда можно начинать её выполнять — [math]r_{i}[/math] и когда необходимо закончить её выполнение — [math]d_{i}[/math]. Время выполнения [math]p_{i}[/math] у всех работ одинаково и равно 1. Необходимо узнать, можно ли построить расписание, при котором все работы будут выполнены.

Алгоритм

Идея алгоритма в том, чтобы из тех работ, которые уже можно выполнить, ставить в расписание ту, у которой наименьшее [math]d_{i}[/math]. Если эта работа уже просрочена, значит хорошее расписание построить нельзя.

Пусть [math]S[/math] - множество ещё не включенных в расписание работ, к выполнению которых уже можно приступить. Изначально [math]S[/math] пустое. Отсортируем работы по порядку их появления.

Алгоритм [math]1 | r_{i}, d_{i}, p_{i}=1 | -[/math]:

 [math]S = \varnothing;[/math]
 [math]j = 1;[/math]
 [math]time = 1;[/math]
 for [math] i = 1 [/math] to [math] n [/math]:
     if [math]S == \varnothing[/math]:
         [math]time=r_{j}[/math]
     while [math]time==r_{j}[/math]:
         [math]S \leftarrow S \cup \{j\}[/math]
         [math]j = j + 1;[/math]
     [math]d_{k} = min\{d_{i}[/math] | [math]i \in S\}[/math]
     if [math]d_{k} \le time[/math]:
         Расписание составить невозможно
     else:
         [math]S \leftarrow S \setminus \{k\}[/math]
         [math]time = time + 1;[/math]

Сложность алгоритма [math]O(n\log n)[/math] если в качестве [math]S[/math] использовать структуру, которая позволяет поиск элемента с минимальным [math]d_{i}[/math] за [math]O(\log n)[/math].

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

Пусть с помощью нашего алгоритма составить хорошее расписание не удалось. Докажем, что в этом случае хорошего расписания не существует. Заметим, что расписание состоит из непрерывных блоков, между которыми есть пропуски - все поступившие работы выполнены, а новых работ ещё не появилось. Расписание может состоять из одного блока.

Рассмотрим первый блок, для которого не получилось составить расписание. Возьмем в нём первую работу, для которой не нашлось места. Пусть её индекс будет [math]k[/math]. Попробуем вставить эту работу в расписание. До блока её вставить нельзя, так как [math]r_{i}[/math] больше или равно времени начала блока. А в блоке нет пропусков, поэтому нужно поменять её с какой-то [math]i[/math]-ой, которая уже стоит в этом блоке расписания. У всех таких работ [math]d_{i}[/math] меньше или равно [math]d_{k}[/math], так как в алгоритме мы каждый раз брали работу с минимальным [math]d_{i}[/math]. Но [math]i[/math]-ую работу нельзя выполнить после [math]k[/math]-ой. Значит [math]k[/math]-ую работу выполнить нельзя.

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

  • P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 200