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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Новая страница: « =Описание алгоритма= Полагаем, что ребра в графе ориентированы от работы, к работам, зави...»)
 
Строка 1: Строка 1:
  
=Описание алгоритма=
+
==Описание алгоритма==
 
Полагаем, что ребра в графе ориентированы от работы, к работам, зависимым от нее.
 
Полагаем, что ребра в графе ориентированы от работы, к работам, зависимым от нее.
Введем понятие "вынужденного" дедлайна <tex>d'_i</tex>~--- время, до которого необходимо выполнить <tex>i</tex>-ую работу, чтобы успеть
+
Введем понятие ''вынужденного'' дедлайна <tex>d'_i</tex> время, до которого необходимо выполнить <tex>i</tex>-ую работу, чтобы успеть
выполнить все работы, зависящие от нее (не обязательно непосредственно).  
+
выполнить все работы из <tex>S(i)</tex>, где <tex>S(i)</tex> — множество работ, зависящих (не обязательно непосредственно) от <tex>i</tex>-ой работы.
 
Заметим, что эта величина может принимать отрицательные значения.
 
Заметим, что эта величина может принимать отрицательные значения.
Обозначим через $S(i)$~--- множество работ, зависящих от $i$-ой работы, а через <tex>g(i, d)</tex>~--- количество работ из <tex>S(i)</tex>,
+
Обозначим через <tex>g(i, d)</tex> количество работ <tex>k</tex> из <tex>S(i)</tex>,
таких что <tex>d'_k \le d</tex>, где <tex>k \in S(i)</tex>.
+
таких что <tex>d'_k \le d</tex>.
Будем считать, что уже посчитаны работы для всех <tex>j \in S(i)</tex>. Тогда, если <tex>j \in S(i)</tex>, тогда <tex>i</tex>-ая работа
+
 
должна быть закончена до <tex>d'_j - \lceil \frac{g(i, d'_j)}{2} \rceil</tex>. Это следует из факта, что для всех работ <tex>k \in S(i)</tex>,  
+
{{Утверждение
для которых <tex>d'_k \le d'_j</tex> должны быть выполнены на двух машинах после окончания времени обработки <tex>i</tex>-ой детали,  
+
|statement=Пусть уже посчитаны работы для всех <tex>j \in S(i)</tex>. Тогда, если <tex>j \in S(i)</tex>, то <tex>i</tex>-ая работа
но до времени <tex>d'_j</tex>. Тогда финально получаем формулу для вычисления "вынужденного" дедлайна для <tex>i</tex>-ой работы:  
+
должна быть закончена до <tex>d'_j - \lceil \frac{g(i, d'_j)}{2} \rceil</tex>.  
<tex>d'_i = \min{d_i, \min{d'_j - \lceil \frac{g(i, d'_j)}{2} \rceil}}</tex>, где <tex>j \in S(i)</tex>.  
+
|proof=Рассмотрим все работы <tex>k \in S(i)</tex>, для которых <tex>d'_k \le d'_j</tex>. Все эти работы будут выполнены после  
Для вершин, степень которых равна нулю, вынужденный дедлайн равным обычному дедлайну.
+
окончания обработки детали с номером <tex>i</tex>. Для них <tex>d'_k \le d'_j</tex>. Пусть работу <tex>i</tex> закончили выполнять в
Для подсчета "вынужденных" дедлайнов будем поддерживать список <tex>L</tex>, содержащий вершины, отсортированных в порядке  
+
момент времени <tex>d</tex>. Нужно до момента времени <tex>d'_j</tex> выполнить ещё <tex>g(i, d'_j)</tex> работ.
неубывания "вынужденных" дедлайнов. Для вершин, для которых эта величина еще не посчитана, считаем ее равной обычному дедлайну.
+
Так как в нашем распоряжении находятся две машины, то время их выполнения будет не менее, чем <tex>\lceil \frac{g(i, d'_j)}{2} \rceil</tex>.
Будем рассматривать вершины в порядке, обратном топологической сортировке графа. Пусть на текущем шаге мы рассматриваем работу с  
+
Поскольку необходимо выполнить все эти работы до <tex>d'_j</tex>, то <tex>i</tex>-ая работа должна быть закончена до момента времени
номером <tex>i</tex>. Перебирая вершины из <tex>S(i)</tex> в порядке списка <tex>L</tex>, пересчитываем "вынужденный" дедлайн для
+
<tex>d'_j - \lceil \frac{g(i, d'_j)}{2} \rceil</tex>.
<tex>i</tex>-ой вершины по формуле, указанной выше. После чего обновляем ее дедлайн в списке <tex>L</tex>. Используя для нахождения
+
}}
<tex>S(i)</tex> алгоритм Фишера-Мейерса, можно добиться лучшей асимптотики, чем наивным методом. Данный алгоритм
+
 
будет описан ниже.
+
Тогда финально получаем формулу для вычисления «вынужденного» дедлайна для <tex>i</tex>-ой работы:  
После подсчета "вынужденных" дедлайнов, оптимальное расписание считается жадным алгоритмом.
+
<tex>d'_i = \min\{d_i, \min\{d'_j - \lceil \frac{g(i, d'_j)}{2} \rceil\}\}</tex>, где <tex>j \in S(i)</tex>.  
На каждом шаге на для обработки на станках выбираются работы с минимальным "вынужденным" дедлайном, для которых все необходимые  
+
Для вершин, исходящая степень которых равна нулю, по определению вынужденного дедлайна, считаем его равным обычному дедлайну.
 +
Для подсчета вынужденных дедлайнов будем поддерживать список <tex>L</tex>, содержащий вершины, отсортированные в порядке  
 +
неубывания ''дедлайнов''. ''Дедлайн'' равен вынужденному дедлайну, если он уже посчитан, и обычному {{---}} в противном случае.  
 +
Будем рассматривать вершины в порядке, обратном топологической сортировке графа, то есть, начиная с вершин нулевой исходящей степени.
 +
Пусть на текущем шаге мы рассматриваем работу с  
 +
номером <tex>i</tex>. Перебирая вершины из <tex>S(i)</tex> в порядке списка <tex>L</tex>, пересчитываем вынужденный дедлайн для
 +
<tex>i</tex>-ой вершины по формуле, указанной выше, после чего обновляем дедлайн этой вершины в списке <tex>L</tex>.  
 +
 
 +
После подсчета вынужденных дедлайнов, оптимальное расписание считается жадным алгоритмом.
 +
На каждом шаге на для обработки на станках выбираются работы с минимальным вынужденным дедлайном, для которых все необходимые  
 
работы уже выполнены. Одновременно с этим считается максимальное опоздание.  
 
работы уже выполнены. Одновременно с этим считается максимальное опоздание.  
  
=Доказательство корректности=
+
==Доказательство корректности==
 
{{Утверждение #1
 
{{Утверждение #1
 
|statement= В расписании с обычными дедлайнами нет опозданий тогда и только тогда, когда нет опозданий в расписании с
 
|statement= В расписании с обычными дедлайнами нет опозданий тогда и только тогда, когда нет опозданий в расписании с

Версия 05:36, 10 июня 2012

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

Полагаем, что ребра в графе ориентированы от работы, к работам, зависимым от нее. Введем понятие вынужденного дедлайна [math]d'_i[/math] — время, до которого необходимо выполнить [math]i[/math]-ую работу, чтобы успеть выполнить все работы из [math]S(i)[/math], где [math]S(i)[/math] — множество работ, зависящих (не обязательно непосредственно) от [math]i[/math]-ой работы. Заметим, что эта величина может принимать отрицательные значения. Обозначим через [math]g(i, d)[/math] количество работ [math]k[/math] из [math]S(i)[/math], таких что [math]d'_k \le d[/math].

Утверждение:
Пусть уже посчитаны работы для всех [math]j \in S(i)[/math]. Тогда, если [math]j \in S(i)[/math], то [math]i[/math]-ая работа должна быть закончена до [math]d'_j - \lceil \frac{g(i, d'_j)}{2} \rceil[/math].
[math]\triangleright[/math]

Рассмотрим все работы [math]k \in S(i)[/math], для которых [math]d'_k \le d'_j[/math]. Все эти работы будут выполнены после окончания обработки детали с номером [math]i[/math]. Для них [math]d'_k \le d'_j[/math]. Пусть работу [math]i[/math] закончили выполнять в момент времени [math]d[/math]. Нужно до момента времени [math]d'_j[/math] выполнить ещё [math]g(i, d'_j)[/math] работ. Так как в нашем распоряжении находятся две машины, то время их выполнения будет не менее, чем [math]\lceil \frac{g(i, d'_j)}{2} \rceil[/math]. Поскольку необходимо выполнить все эти работы до [math]d'_j[/math], то [math]i[/math]-ая работа должна быть закончена до момента времени

[math]d'_j - \lceil \frac{g(i, d'_j)}{2} \rceil[/math].
[math]\triangleleft[/math]

Тогда финально получаем формулу для вычисления «вынужденного» дедлайна для [math]i[/math]-ой работы: [math]d'_i = \min\{d_i, \min\{d'_j - \lceil \frac{g(i, d'_j)}{2} \rceil\}\}[/math], где [math]j \in S(i)[/math]. Для вершин, исходящая степень которых равна нулю, по определению вынужденного дедлайна, считаем его равным обычному дедлайну. Для подсчета вынужденных дедлайнов будем поддерживать список [math]L[/math], содержащий вершины, отсортированные в порядке неубывания дедлайнов. Дедлайн равен вынужденному дедлайну, если он уже посчитан, и обычному — в противном случае. Будем рассматривать вершины в порядке, обратном топологической сортировке графа, то есть, начиная с вершин нулевой исходящей степени. Пусть на текущем шаге мы рассматриваем работу с номером [math]i[/math]. Перебирая вершины из [math]S(i)[/math] в порядке списка [math]L[/math], пересчитываем вынужденный дедлайн для [math]i[/math]-ой вершины по формуле, указанной выше, после чего обновляем дедлайн этой вершины в списке [math]L[/math].

После подсчета вынужденных дедлайнов, оптимальное расписание считается жадным алгоритмом. На каждом шаге на для обработки на станках выбираются работы с минимальным вынужденным дедлайном, для которых все необходимые работы уже выполнены. Одновременно с этим считается максимальное опоздание.

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

Утверждение:
В расписании с обычными дедлайнами нет опозданий тогда и только тогда, когда нет опозданий в расписании с "вынужденными" дедлайнами.
[math]\triangleright[/math]

[math]\Leftarrow[/math] Так как "вынужденные" дедлайны меньше обычных, то в эту сторону утверждение очевидно.

[math]\Rightarrow[/math] Напрямую следует из определения вынужденного дедлайна.
[math]\triangleleft[/math]
Утверждение:
Если существует расписание без опоздание, то приведенный выше алгоритм найдет такое расписание.
[math]\triangleright[/math]

Пусть [math]x(1), x(2),...,x(n)[/math]~---расписание, построенное этим алгоритмом, где [math]x(i)[/math]~--- время начала обработки [math]i[/math]-ой детали. Пусть в этом расписании существует работа, опаздывающая по обычным дедлайнам. Согласно утверждению 1, в этом расписании также существует работа, опаздывающая по "вынужденным" дедлайнам. Пусть [math]i[/math] работа с минимальным временем начала, удолетворяющая следующему условию: [math]d'_i \lt x(i) + 1[/math]. Следуя алгоритму, в каждый момент времени [math]t[/math], такой что [math]t \lt x(i)[/math], хотя бы одна работа с номером [math]j[/math], такая что [math]d'_j \le d'_i[/math] должна быть выполнена. Рассмотрим два случая. Первый случай: в какой-то момент времени только одна работа с номером [math]k[/math], такая что [math]d'_k \le d'_i[/math] выполнена. Выберем максимальное время [math]t[/math], такое что [math]t \lt x(i)[/math], обладающее таким свойством. Тогда для всех работ c номером [math]j[/math], которые выполнялись в момент времени с [math]t+1[/math] до [math]x(i)[/math] выполняется [math]d'_j \le d'_i[/math], кроме того

ни один станок не простаивал в течении этого периода.
[math]\triangleleft[/math]