Opi1sumu
Описание задачи
Дано
одинаковых станков, которые работают параллельно и работ, котороые необходимо выполнить в произвольном порядке на всех станках. Время выполнения каждой работы на любом станке одинаково и равно одному. Для каждой работы известно время, до которого её необходимо выполнить. Необходимо успеть выполнить как можно больше работ.Описание алгоритма
Отсортируем работы в порядке невозрастания дедлайнов.
Утверждение: |
Если в оптимальном расписании можно сделать работ, то можно сделать первые работ. |
Пусть в оптимальном расписании были сделаны работы Тогда, если заменить во всём расписании работу . Докажем, что существует оптимальное расписание, в котором сделаны работы . Пусть работы тоже отсортированы в порядке неубывания дедлайна. Тогда . на работу , то она, тем более, будет выполнена. |
Определение: |
Обозначим за тайм-слот t множество из не более, чем | различных чисел — номера работ, которые мы хотим выполнить в момент времени .
Введем тайм-слот для каждого момента времени от до .
Каждую работу будем пытаться сделать как можно позже. Будет рассматривать работы в порядке невозрастания дедлайнов.
-ю работу попытаемся добавить в тайм-слоты с по .
После добавления некоторые тайм-слоты могли переполниться (тайм-слот переполнился, если в нём уже находилось
работ, и в него добавили -ю).
Для переполнившегося тайм-слота найдём найдем самый правый левее него, который ещё не переполнился и перекинем работу,
которой там еще нет, в него. Так как в нем меньше элементов, то, по принципу Дирихле, это можно сделать.
Утверждение: |
Следуя этому алгоритму, первый тайм-слот переполнится тогдаи только тогда, когда переполнилнился
нулевой тайм-слот. |
? |
Опираясь на это утверждение, можно найти максимальное количество работ, которое можно выполнить. Обозначим его за
.Сведем задачу построения распинания по построенным тайм-слотам к задаче о покрытии двудольного графа минимальным количеством паросочетаний.