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

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 1: Строка 1:
<div style="background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;">Эта статья находится в разработке!</div>
 
<includeonly>[[Категория: В разработке]]</includeonly>
 
 
 
==Постановка задачи==
 
==Постановка задачи==
 
Дан один станок на котором нужно выполнить <tex>n</tex> работ. Для каждой работы известны моменты времени, когда можно начинать её выполнять - <tex>r_{i}</tex> и когда необходимо закончить её выполнение - <tex>d_{i}</tex>. Время выполнения <tex>p_{i}</tex> у всех работ одинаково и равно 1. Необходимо узнать, можно ли построить хорошее расписание (при котором все работы будут выполнены).
 
Дан один станок на котором нужно выполнить <tex>n</tex> работ. Для каждой работы известны моменты времени, когда можно начинать её выполнять - <tex>r_{i}</tex> и когда необходимо закончить её выполнение - <tex>d_{i}</tex>. Время выполнения <tex>p_{i}</tex> у всех работ одинаково и равно 1. Необходимо узнать, можно ли построить хорошее расписание (при котором все работы будут выполнены).
Строка 38: Строка 35:
 
==Доказательство корректности алгоритма==
 
==Доказательство корректности алгоритма==
 
Пусть с помощью нашего алгоритма составить хорошее расписание не удалось. Докажем, что в этом случае хорошего расписания не существует.
 
Пусть с помощью нашего алгоритма составить хорошее расписание не удалось. Докажем, что в этом случае хорошего расписания не существует.
Заметим, что расписание состоит из временных блоков, между которыми есть пропуски - все поступившие работы выполнены, а новые работ ещё не появилось. Расписание может состоять из одного блока.
+
Заметим, что расписание состоит из непрерывных блоков, между которыми есть пропуски - все поступившие работы выполнены, а новых работ ещё не появилось. Расписание может состоять из одного блока.
  
Рассмотрим первый блок, для которого не получилось составить расписание. Возьмем первую работу, для которой не нашлось места. Пусть её индекс будет <tex>k</tex>. Попробуем вставить эту работу в расписание. До блока её вставить нельзя, так как <tex>r_{i}</tex> больше или равно началу блока. А в блоке нет пропусков, поэтому нужно поменять её с какой-то <tex>i-</tex>ой, которая уже стоит в этом блоке расписания. У всех таких работ <tex>d_{i}</tex> меньше или равно <tex>d_{k}</tex>, так как в алгоритме мы каждый раз брали работу с минимальным <tex>d_{i}</tex>. Значит мы не можем поменять <tex>i</tex>-ую и <tex>k</tex>-ую работы, так как <tex>i</tex>-ую нельзя выполнить после <tex>k</tex>-ой. Значит <tex>k</tex>-ую работу выполнить нельзя.
+
Рассмотрим первый блок, для которого не получилось составить расписание. Возьмем в нём первую работу, для которой не нашлось места. Пусть её индекс будет <tex>k</tex>. Попробуем вставить эту работу в расписание. До блока её вставить нельзя, так как <tex>r_{i}</tex> больше или равно времени начала блока. А в блоке нет пропусков, поэтому нужно поменять её с какой-то <tex>i</tex>-ой, которая уже стоит в этом блоке расписания. У всех таких работ <tex>d_{i}</tex> меньше или равно <tex>d_{k}</tex>, так как в алгоритме мы каждый раз брали работу с минимальным <tex>d_{i}</tex>.   Но <tex>i</tex>-ую работу нельзя выполнить после <tex>k</tex>-ой. Значит <tex>k</tex>-ую работу выполнить нельзя.
  
 
==Литература==
 
==Литература==
 
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 379 стр. {{---}} ISBN 978-3-540-69515-8
 
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 379 стр. {{---}} ISBN 978-3-540-69515-8

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

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

Дан один станок на котором нужно выполнить [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\leftarrow1;[/math]
    [math]time\leftarrow1;[/math]
    [math]FOR[/math]  [math]i := 1[/math] [math]TO[/math] [math]n[/math] [math]DO[/math]
         [math]BEGIN[/math]
         [math]IF[/math] [math]S=\varnothing[/math] [math]THEN[/math]
              [math]BEGIN[/math] [math]time:=r_{j}[/math] [math]END[/math]
         [math]WHILE[/math] [math]time=r_{j}[/math] [math]DO[/math]
              [math]BEGIN[/math]
              Добавить [math]j[/math] в [math]S[/math]
              [math]j:=j+1;[/math]
              [math]END[/math]
         Пусть [math]k\in S[/math] и [math]d_{k}[/math] минимально
         [math]IF[/math] [math]d_{k}\le time[/math] [math]THEN[/math]
              Расписание составить невозможно
         [math]ELSE[/math]
              [math]BEGIN[/math]
              Удалить [math]k[/math] из [math]S[/math]
              [math]time:=time+1;[/math]
              [math]END[/math]
         [math]END[/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]-ую работу выполнить нельзя.

Литература

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