P2precpi1Lmax — различия между версиями
(Новая страница: « =Описание алгоритма= Полагаем, что ребра в графе ориентированы от работы, к работам, зави...») |
|||
Строка 1: | Строка 1: | ||
− | =Описание алгоритма= | + | ==Описание алгоритма== |
Полагаем, что ребра в графе ориентированы от работы, к работам, зависимым от нее. | Полагаем, что ребра в графе ориентированы от работы, к работам, зависимым от нее. | ||
− | Введем понятие | + | Введем понятие ''вынужденного'' дедлайна <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 d | + | таких что <tex>d'_k \le d</tex>. |
− | + | ||
− | должна быть закончена до <tex>d'_j - \lceil \frac{g(i, d'_j)}{2} \rceil</tex>. | + | {{Утверждение |
− | для которых <tex>d'_k \le d'_j</tex> | + | |statement=Пусть уже посчитаны работы для всех <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>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>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>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
Описание алгоритма
Полагаем, что ребра в графе ориентированы от работы, к работам, зависимым от нее. Введем понятие вынужденного дедлайна
— время, до которого необходимо выполнить -ую работу, чтобы успеть выполнить все работы из , где — множество работ, зависящих (не обязательно непосредственно) от -ой работы. Заметим, что эта величина может принимать отрицательные значения. Обозначим через количество работ из , таких что .Утверждение: |
Пусть уже посчитаны работы для всех . Тогда, если , то -ая работа
должна быть закончена до . |
Рассмотрим все работы , для которых . Все эти работы будут выполнены после окончания обработки детали с номером . Для них . Пусть работу закончили выполнять в момент времени . Нужно до момента времени выполнить ещё работ. Так как в нашем распоряжении находятся две машины, то время их выполнения будет не менее, чем . Поскольку необходимо выполнить все эти работы до , то -ая работа должна быть закончена до момента времени . |
Тогда финально получаем формулу для вычисления «вынужденного» дедлайна для
-ой работы: , где . Для вершин, исходящая степень которых равна нулю, по определению вынужденного дедлайна, считаем его равным обычному дедлайну. Для подсчета вынужденных дедлайнов будем поддерживать список , содержащий вершины, отсортированные в порядке неубывания дедлайнов. Дедлайн равен вынужденному дедлайну, если он уже посчитан, и обычному — в противном случае. Будем рассматривать вершины в порядке, обратном топологической сортировке графа, то есть, начиная с вершин нулевой исходящей степени. Пусть на текущем шаге мы рассматриваем работу с номером . Перебирая вершины из в порядке списка , пересчитываем вынужденный дедлайн для -ой вершины по формуле, указанной выше, после чего обновляем дедлайн этой вершины в списке .После подсчета вынужденных дедлайнов, оптимальное расписание считается жадным алгоритмом. На каждом шаге на для обработки на станках выбираются работы с минимальным вынужденным дедлайном, для которых все необходимые работы уже выполнены. Одновременно с этим считается максимальное опоздание.
Доказательство корректности
Утверждение: |
В расписании с обычными дедлайнами нет опозданий тогда и только тогда, когда нет опозданий в расписании с
"вынужденными" дедлайнами. |
Так как "вынужденные" дедлайны меньше обычных, то в эту сторону утверждение очевидно. Напрямую следует из определения вынужденного дедлайна. |
Утверждение: |
Если существует расписание без опоздание, то приведенный выше алгоритм найдет такое расписание. |
Пусть ни один станок не простаивал в течении этого периода. ~---расписание, построенное этим алгоритмом, где ~--- время начала обработки -ой детали. Пусть в этом расписании существует работа, опаздывающая по обычным дедлайнам. Согласно утверждению 1, в этом расписании также существует работа, опаздывающая по "вынужденным" дедлайнам. Пусть работа с минимальным временем начала, удолетворяющая следующему условию: . Следуя алгоритму, в каждый момент времени , такой что , хотя бы одна работа с номером , такая что должна быть выполнена. Рассмотрим два случая. Первый случай: в какой-то момент времени только одна работа с номером , такая что выполнена. Выберем максимальное время , такое что , обладающее таким свойством. Тогда для всех работ c номером , которые выполнялись в момент времени с до выполняется , кроме того |