Изменения

Перейти к: навигация, поиск

P2precpi1Lmax

620 байт добавлено, 01:45, 5 июня 2016
Несущественные изменения
<tex dpi ="200" >P2 \mid prec, p_i=Описание задачи=1 \mid L_{max}</tex> {{Шаблон:Задача|definition =
Даны два одинаковых станка, на которых необходимо обработать <tex>n</tex> деталей.
Каждую деталь можно обрабатывать на любом станке. Время, необходимое для обработки любой детали,
разность между временем, когда была закончена обработка детали, и временем дедлайна для этой
детали.
}}
 
==Описание алгоритма==
Полагаем, что ребра в графе ориентированы от работы, к работам, зависимым от нее.
Введем понятие ''вынужденного'' дедлайна <tex>d'_i</tex> {{---}} максмальное максимальное время, до которого необходимо выполнить <tex>i</tex>-ую ю работу, чтобы успетьвыполнить все работы из <tex>S(i)</tex>, где <tex>S(i)</tex> {{---}} множество работ, зависящих (не обязательно непосредственно) от <tex>i</tex>-ой й работы.
Заметим, что эта величина может принимать отрицательные значения.
Обозначим через <tex>g(i, d)</tex> количество работ <tex>k</tex> из <tex>S(i)</tex>,
таких что <tex>d'_k \le leqslant d</tex>.
{{Утверждение
|statement=Пусть уже посчитаны работы для всех <tex>j \in S(i)</tex>. Тогда, если <tex>j \in S(i)</tex>, то <tex>i</tex>-ая я работадолжна быть закончена до <tex>d'_j - \lceil \fracdfrac{g(i, d'_j)}{2} \rceil</tex>. |proof=Рассмотрим все работы <tex>k \in S(i)</tex>, для которых <tex>d'_k \le leqslant d'_j</tex>. Все эти работы будут выполнены после окончания обработки детали с номером <tex>i</tex>. Для них <tex>d'_k \le leqslant d'_j</tex>. Пусть работу <tex>i</tex> закончили выполнять в
момент времени <tex>d</tex>. Нужно до момента времени <tex>d'_j</tex> выполнить ещё <tex>g(i, d'_j)</tex> работ.
Так как в нашем распоряжении находятся две машины, то время их выполнения будет не менее, чем <tex>\lceil \fracdfrac{g(i, d'_j)}{2} \rceil</tex>. Поскольку необходимо выполнить все эти работы до <tex>d'_j</tex>, то <tex>i</tex>-ая я работа должна быть закончена до момента времени<tex>d'_j - \lceil \fracdfrac{g(i, d'_j)}{2} \rceil</tex>.
}}
Тогда финально получаем формулу для вычисления «вынужденного» дедлайна для <tex>i</tex>-ой й работы: <tex>d'_i = \min\{d_i, \min\{d'_j - \lceil \fracdfrac{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>.
После подсчета вынужденных дедлайнов, оптимальное расписание считается жадным алгоритмом.
такую, что <tex>\forall k \in S(i) : d'_k </tex> {{---}} не нарушено. Это всегда можно сделать в силу ацикличности графа.
Рассмотрим формулу для подсчёта вынужденного дедлайна:
<tex>d'_i = \min\{d_i, \min\{d'_j - \lceil \fracdfrac{g(i, d'_j)}{2} \rceil\}\}</tex>, где <tex>j \in S(i)</tex>.
Минимум достигся достигатся либо на <tex>d_i</tex>, что невозможно в силу того, что обычные дедлайны не нарушены, либо на каком-то<tex>j \in S(i)</tex>. В этом случае, <tex>d'_i = d'_j - \lceil\fracdfrac{g(i, d'_j)}{2}\rceil</tex>.
Значит, если <tex>d'_i</tex> нарушено, то будет также нарушен вынужденный дедлайн для какого-то <tex>k \in S(i)</tex>,
так как осталось меньше, чем <tex>d'_j - d'_i > \lceil \fracdfrac{g(i, d'_j)}{2} \rceil</tex> единиц времени. Это
противоречит условии выбора <tex>i</tex>.
}}
|statement= Если существует расписание без опоздание, то приведенный выше алгоритм найдет такое расписание.
|proof= Пусть <tex>x(1), x(2),...,x(n)</tex> {{---}} расписание, построенное этим алгоритмом, где <tex>x(i)</tex> {{---}} время
начала обработки <tex>i</tex>-ой й детали. Пусть в этом расписании существует работа, опаздывающая по обычным дедлайнам. Согласно
утверждению 1, в этом расписании также существует работа, опаздывающая по "вынужденным" дедлайнам. Пусть <tex>i</tex> {{---}} такая работа с
минимальным временем начала, то есть, удолетворяющая удовлетворяющая следующему условию: <tex>d'_i < x(i) + 1</tex>.
Следуя алгоритму, в каждый момент времени
<tex>t</tex>, такой что <tex>t < x(i)</tex>, хотя бы одна работа с номером <tex>j</tex>, такая что <tex>d'_j \le leqslant d'_i</tex> должна быть выполнена, так как, иначе, по алгоритму, вместо <tex>i</tex> на этом шаге была бы выбрана работа <tex>j</tex>, имеющая меньшее
<tex>d'</tex> и, по построению модифицированных дедлайнов, независимая от <tex>i</tex>.
Рассмотрим два случая.
'''Первый случай''': в какой-то момент времени только одна работа с номером <tex>k</tex>, такая что <tex>d'_k \le leqslant d'_i</tex> выполнена.
Выберем максимальное время <tex>t</tex>, такое что <tex>t < x(i)</tex>, обладающее таким свойством. Тогда для всех работ c номером
<tex>j</tex>, которые выполнялись в момент времени с <tex>t+1</tex> до <tex>x(i)</tex> выполняется <tex>d'_j \le leqslant d'_i</tex>, кроме того,
ни один станок не простаивал в течении этого периода. Все работы <tex>j</tex>, выполненные в период <tex>[t+1; x(i)]</tex>, а также,
работа <tex>i</tex>, должны быть зависимы от <tex>k</tex>, потому что, иначе, только <tex>j</tex> должна быть выполнена до
момента времени <tex>t+1</tex>. Так как было опоздание,
<tex>\left\lceil \fracdfrac{g'(k, d'_i)}{2} \right\rceil \ge geqslant \left\lceil\fracdfrac{2(x(i) - t) - 1}{2} \right\rceil = x(i) - t</tex>
Из определения вынужденных дедлайнов,
<tex>d'_k \le leqslant d'_i - \left\lceil \fracdfrac{g(k, d'_i)}2 \right\rceil</tex><tex>\le leqslant d'_i - x(i) + t < x(i) + 1 - x(i) + t = t + 1</tex>
Значит, работа <tex>k</tex> тоже опоздала, что противоречит минимальности выбора <tex>x(i)</tex>.
'''Второй случай''': в каждый момент времени такой, что <tex>0 \le leqslant t < x(i)</tex> выполняются две работы. По написанному выше,для всех этих работ <tex>j</tex>, выполняется <tex>d'_j \le leqslant d'_i</tex>.
Тогда есть хотя бы <tex>2x(i) + 1</tex> работ таких, что <tex>d'_j \le leqslant d'_i < x(i) + 1</tex>.
Их невозможно сделать за <tex>x(i)</tex> времени, а значит, в каждом таком расписании есть опоздание.
}}
Рассмотрим остальные в порядке топологической сортировки. Тогда, по индукции, для всех потомков рассматриваемой вершины
утверждение будет верно. Также, так как <tex>d'_k + l \le leqslant d'_j + l \iff d'_k \le leqslant d'_j</tex>,
<tex>(d_i + l)' = \min\{d_i + l, \min\{d'_j + l - \lceil\fracdfrac{g(i, d'_j)}{2}\rceil\}\}</tex> для <tex>j \in S(i)</tex>.
Вынеся за минимум общее слагаемое, по определению вынужденных дедлайнов, получим искомую формулу <tex>(d_i + l)' = d'_i + l</tex>
{{Теорема
|statement=Алгоритм строит оптимальное расписание.
|proof=
Пускай каким-то образом было вычислено оптимальное значение <tex>l_{max}</tex>. Тогда, по второму утверждению, если сдвинуть все
==Сложность алгоритма==
В алгоритме требуется знать для двух произвольных работ, зависит ли, возможно, не непосредственно, одна от другой. Для этого нужно транзитивно замкнуть граф по отношению зависимости. Это можно сделать несколькими способами. Первый и самый простой {{---}} за <tex>\mathcal{O}(n^3)</tex> алгоритмом Флойда-УоршаллаУоршелла. Второй {{---}} при помощи метода четырех русских за <tex>\mathcal{O}(\fracdfrac{n^3}{\log n})</tex>. Третий {{---}} применить алгоритм Фишера-Мейера для построения замыкания графа за <tex>\mathcal{O}(n^{\log_2 7})</tex>. При подсчете вынужденных дедлайнов, за <tex>\mathcal{O}(n)</tex> считается вынужденный дедлайн одной работы. Так как всего работ <tex>n</tex>, суммарное время подсчета вынужденных дедлайнов {{---}} <tex>\mathcal{O}(n^2)</tex>. При, непосредственно, составлении расписания, на каждом шаге за <tex>\mathcal{O}(n)</tex> обрабатываются одна или две работы. Значит, все работы будут обработаны также за <tex>\mathcal{O}(n^2)</tex>.
При подсчете вынужденных дедлайнов, за <tex>O(n)</tex> считается вынужденный дедлайн одной работы. Так как всего работ <tex>n</tex>, суммарное время подсчета вынужденных дедлайнов Итоговая сложность {{---}} <tex>\mathcal{O}(TrCl + n^2)</tex>.
При, непосредственно, составлении расписания, на каждом шаге за <tex>O(n)</tex> обрабатываются одна или две работы== См. Значит, все работы будут обработаны также за ==* [[PpmtnriLmax|<tex>O(n^2)P \mid pmtn, r_i \mid L_{max}</tex>.]]
Итоговая сложность {{---}} <tex>O==Источники информации==* M.J. Fischer and A.R. Meyer, [http://rjlipton.files.wordpress.com/2009/10/matrix1971.pdf «Boolean Matrix Multiplication and Transitive Closure»].* P. Brucker. «Scheduling Algorithms» (TrCl + n^22006)</tex>, 5th edition, стр. 145-149.
==Ссылки==[[Категория: Алгоритмы и структуры данных]][http[Категория://rjlipton.files.wordpress.com/2009/10/matrix1971.pdf Алгоритм Фишера-МейераТеория расписаний]]
10
правок

Навигация