Обсуждение участницы:Анна — различия между версиями
Анна (обсуждение | вклад) (→Идея) |
Анна (обсуждение | вклад) (→Асимптотика) |
||
Строка 33: | Строка 33: | ||
=== Асимптотика === | === Асимптотика === | ||
Покажем, что данный алгоритм может быть реализован за время <tex>O(nm)</tex>.<br> | Покажем, что данный алгоритм может быть реализован за время <tex>O(nm)</tex>.<br> | ||
− | Для начала рассмотрим следующий вопрос: пусть <tex>U</tex> {{---}} множество работ, для которого существует расписание, в котором отсутствуют опаздывающие работы, пусть <tex>i</tex> {{---}} работа, не принадлежащая <tex>U</tex>, для которой выполняется неравенство <tex> | + | Для начала рассмотрим следующий вопрос: пусть <tex>U</tex> {{---}} множество работ, для которого существует расписание, в котором отсутствуют опаздывающие работы, пусть <tex>i</tex> {{---}} работа, не принадлежащая <tex>U</tex>, для которой выполняется неравенство <tex>d_j \leqslant d_i</tex> для любой <tex>j \in U</tex>. Можно ли построить расписание для множества <tex>V = U \cup \{i\}</tex>, в котором так же будут отсутствовать опаздывающие работы.<br> |
Введем несколько обозначений. Вектора <tex>h</tex>, соответствующие множествам <tex>U</tex> и <tex>V</tex> обозначим как <tex>h^U</tex> и <tex>h^V</tex> соответственно. <tex>x(d_i)</tex> {{---}} количество временных интервалов <tex>t</tex> со свойствами | Введем несколько обозначений. Вектора <tex>h</tex>, соответствующие множествам <tex>U</tex> и <tex>V</tex> обозначим как <tex>h^U</tex> и <tex>h^V</tex> соответственно. <tex>x(d_i)</tex> {{---}} количество временных интервалов <tex>t</tex> со свойствами | ||
*<tex>d_i - m + 1 \leqslant t \leqslant d_i</tex>, | *<tex>d_i - m + 1 \leqslant t \leqslant d_i</tex>, | ||
*<tex>h^U(t) < m</tex>. | *<tex>h^U(t) < m</tex>. | ||
− | Будем говорить, что | + | Будем говорить, что множество работ может быть выполнено ''вовремя'', если существует расписание, в котором все работы из этого множества успевают выполниться без опозданий. |
{{Лемма | {{Лемма | ||
|statement= | |statement= | ||
Пусть даны работы <tex>1, 2 \ldots i</tex> с дедлайнами <tex>d_1 \leqslant d_2 \leqslant \ldots \leqslant d_i</tex>, <tex>U = \{1, 2, \ldots i - 1\}</tex> и <tex>V = U \cup \{i\}</tex>. Тогда для всех работ <tex>j = d_i - m + 1 \ldots d_i</tex>, для которых <tex>h^U(j) < m</tex>, будет верно, что <tex>h^V(j) = h^U(j) + 1</tex>. | Пусть даны работы <tex>1, 2 \ldots i</tex> с дедлайнами <tex>d_1 \leqslant d_2 \leqslant \ldots \leqslant d_i</tex>, <tex>U = \{1, 2, \ldots i - 1\}</tex> и <tex>V = U \cup \{i\}</tex>. Тогда для всех работ <tex>j = d_i - m + 1 \ldots d_i</tex>, для которых <tex>h^U(j) < m</tex>, будет верно, что <tex>h^V(j) = h^U(j) + 1</tex>. | ||
|proof= | |proof= | ||
− | Рассмотрим вектора <tex>h^U</tex> и <tex>h^V</tex> после <tex>i - 1</tex> и <tex>i</tex> итераций алгоритма. Заметим, что значения вектора <tex>h</tex>, не превосходящие <tex>m</tex>, то есть <tex>h(j) < m</tex>, никогда не уменьшаются. Следовательно, если <tex>d_i - m + 1 \leqslant j \leqslant d_i</tex> и <tex>h^U(j) < m</tex>, то <tex>h^V(j) \geqslant h^U(j) + 1</tex>. Чтобы показать, что ситуация, когда при тех же условиях <tex>h^V(j) \geqslant h^U(j) + 2</tex>, невозможна, рассмотрим расписание, построенное алгоритмом. | + | Рассмотрим вектора <tex>h^U</tex> и <tex>h^V</tex> после <tex>i - 1</tex> и <tex>i</tex> итераций алгоритма. Заметим, что значения вектора <tex>h</tex>, не превосходящие <tex>m</tex>, то есть <tex>h(j) < m</tex>, никогда не уменьшаются. Следовательно, если <tex>d_i - m + 1 \leqslant j \leqslant d_i</tex> и <tex>h^U(j) < m</tex>, то <tex>h^V(j) \geqslant h^U(j) + 1</tex>. Чтобы показать, что ситуация, когда при тех же условиях <tex>h^V(j) \geqslant h^U(j) + 2</tex>, невозможна, рассмотрим расписание, построенное алгоритмом.<br> |
+ | Если <tex>h^V(j) \geqslant h^U(j) + 2</tex>, то это значит, что в течение <tex>i</tex> итерации во временной интервал <tex>j</tex> была добавлена работа <tex>i</tex> и еще как минимум одна работа, пусть работа <tex>k</tex>, была перемещена из временного интервала <tex>j + 1</tex> в <tex>j</tex>. Это возможно только если работа <tex>k</tex> ни на одной машине не была назначена до временного интервала <tex>j</tex>. Следовательно, работа <tex>k</tex> выполняется во временной интервал <tex>j</tex> и некоторые временные интервалы <tex>v > j + 1</tex>, откуда следует, что <tex>j < d_k - m + 1 \leqslant d_i - m + 1</tex>, что приводит нас к противоречию. | ||
+ | }} | ||
+ | {{Теорема | ||
+ | |statement= | ||
+ | Пусть <tex>U</tex> {{---}} множество работ, которое может быть выполнено вовремя, пусть <tex>i</tex> {{---}} работа, не принадлежащая <tex>U</tex>, для которой выполняется неравенство <tex>d_j \leqslant d_i</tex> для любой <tex>j \in U</tex>. Тогда множество работ <tex>V = U \cup \{i\}</tex> может быть выполнено вовремя тогда и только тогда, когда <tex>x(d_i) + \sum\limits_{t = 1}^{d_i - m}(m - h^U(t)) \geqslant m</tex> (1). | ||
+ | |proof= | ||
+ | Неравенство (1) равносильно <tex>(d_i - m)m \geqslant \sum\limits_{t = 1}^{d_i - m}h^U(t) + m - x(d_i)</tex>. | ||
}} | }} | ||
Версия 20:41, 11 мая 2016
Задача: |
Дано | одинаковых станков, которые работают параллельно, и работ, которые необходимо выполнить в произвольном порядке на всех станках. Любая работа на любом станке выполняется единицу времени. Для каждой работы есть время окончания — время, до которого она должна быть выполнена. Необходимо проверить, существует ли расписание, при котором все работы будут выполнены вовремя.
Содержание
Описание алгоритма
Идея
Заметим, что если
, то очевидно, что , следовательно, расписания не существует. Поэтому будем полагать, что для .Определим
— количество временных интервалов , где . Будем обозначать как . Для каждого из них мы можем назначить не более работ (по одной на каждый станок). Для каждой работы будем назначать времена обработки на каждой из машин следующим образом: на машине работа займет временной интервал , на машине — интервал и так далее, на машине работа займет временной интервал . В случае коллизий, то есть если найдется временной интервал , содержащий работу, возьмем минимальный такой и перенесем лишнюю работу из него на ту же машину, но на один временной интервал левее. Будем повторять этот процесс, пока необходимо (и пока ). Таким образом, только первый временной интервал может содержать более работ. Причем это может произойти тогда и только тогда, когда задача не имеет решения, то есть не существует расписания, при котором все работы будут выполнены вовремя.Псевдокод
Определим
— количество работ во временном интервале .void checkExistenceOfSchedule(int*): for to for to for to (1) while and (2) find if return true else return false
Замечание: если расписание существует, то оно может быть вычислено данным алгоритмом, если добавить в цикл (1) функцию, отвечающую за добавление работы
на момент в расписании для соответствующей машины и в цикл (2) функцию, отвечающую за перемещение работы, которой нет во временном интервале , но которая есть в , на момент в той же машине (этот шаг будет обоснован далее в доказательстве корректности).Асимптотика
Покажем, что данный алгоритм может быть реализован за время
Для начала рассмотрим следующий вопрос: пусть — множество работ, для которого существует расписание, в котором отсутствуют опаздывающие работы, пусть — работа, не принадлежащая , для которой выполняется неравенство для любой . Можно ли построить расписание для множества , в котором так же будут отсутствовать опаздывающие работы.
Введем несколько обозначений. Вектора , соответствующие множествам и обозначим как и соответственно. — количество временных интервалов со свойствами
- ,
- .
Будем говорить, что множество работ может быть выполнено вовремя, если существует расписание, в котором все работы из этого множества успевают выполниться без опозданий.
Лемма: |
Пусть даны работы с дедлайнами , и . Тогда для всех работ , для которых , будет верно, что . |
Доказательство: |
Рассмотрим вектора |
Теорема: |
Пусть — множество работ, которое может быть выполнено вовремя, пусть — работа, не принадлежащая , для которой выполняется неравенство для любой . Тогда множество работ может быть выполнено вовремя тогда и только тогда, когда (1). |
Доказательство: |
Неравенство (1) равносильно | .
Доказательство корректности
Теорема: |
Для множества работ с дедлайнами задача имеет решение тогда и только тогда, когда . |
Доказательство: |
|