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 номером , которые выполнялись в момент времени с до выполняется , кроме того ни один станок не простаивал в течении этого периода. |