Opij1SumTi — различия между версиями
Анна (обсуждение | вклад) (→Доказательство корректности) |
Анна (обсуждение | вклад) (→Доказательство корректности) |
||
Строка 71: | Строка 71: | ||
* Если работа <tex>r</tex> стоит во время <tex>t</tex>, но не во время <tex>C_k</tex>, то мы меняем между собой операции работ <tex>k</tex> и <tex>r</tex>. | * Если работа <tex>r</tex> стоит во время <tex>t</tex>, но не во время <tex>C_k</tex>, то мы меняем между собой операции работ <tex>k</tex> и <tex>r</tex>. | ||
* Если работа <tex>r</tex> поставлена во время <tex>t</tex> и <tex>C_k</tex>, то либо тут есть пустое место в <tex>C_r + 1</tex>, либо там должна быть работа, назовем ее <tex>v</tex>, которая поставлена на время <tex>C_r + 1</tex>, но не поставлена в <tex>C_k</tex>. | * Если работа <tex>r</tex> поставлена во время <tex>t</tex> и <tex>C_k</tex>, то либо тут есть пустое место в <tex>C_r + 1</tex>, либо там должна быть работа, назовем ее <tex>v</tex>, которая поставлена на время <tex>C_r + 1</tex>, но не поставлена в <tex>C_k</tex>. | ||
− | Работа <tex>v</tex> точно там есть, потому что <tex>r</tex> и <tex>k</tex> поставлены на время <tex>C_k</tex>, но не поставлены на время <tex>C_r + 1</tex>. Если свободный промежуток есть, тогда переставим работу <tex>r</tex> со времени <tex>t</tex> на время <tex>C_r + 1</tex> и работу <tex>k</tex> со времени <tex>C_k</tex> на <tex>t</tex>. Иначе мы можем переместить работу <tex>r</tex> с времени <tex>t</tex> на время <tex>C_r + 1</tex>, <tex>k</tex> c <tex>C_k</tex> на <tex>t</tex>, и <tex>v</tex> с <tex>C_r + 1</tex> на <tex>C_k</tex>. Тогда <tex>C_k</tex> должно уменьшиться как минимум на один, а <tex>C_r</tex> увеличится не больше чем на один. | + | Работа <tex>v</tex> точно там есть, потому что <tex>r</tex> и <tex>k</tex> поставлены на время <tex>C_k</tex>, но не поставлены на время <tex>C_r + 1</tex>. Если свободный промежуток есть, тогда переставим работу <tex>r</tex> со времени <tex>t</tex> на время <tex>C_r + 1</tex> и работу <tex>k</tex> со времени <tex>C_k</tex> на <tex>t</tex>. Иначе мы можем переместить работу <tex>r</tex> с времени <tex>t</tex> на время <tex>C_r + 1</tex>, <tex>k</tex> c <tex>C_k</tex> на <tex>t</tex>, и <tex>v</tex> с <tex>C_r + 1</tex> на <tex>C_k</tex>. Тогда <tex>C_k</tex> должно уменьшиться как минимум на один, а <tex>C_r</tex> увеличится не больше, чем на один. |
Если мы продолжим так действовать, мы получим оптимальное расписание <tex>B'</tex> с <tex>C_k \leqslant T_k</tex>, в котором работы <tex>1 \ldots k-1</tex> расположены так же, как в расписании <tex>A</tex>. | Если мы продолжим так действовать, мы получим оптимальное расписание <tex>B'</tex> с <tex>C_k \leqslant T_k</tex>, в котором работы <tex>1 \ldots k-1</tex> расположены так же, как в расписании <tex>A</tex>. | ||
Пусть <tex>h</tex> {{---}} вектор частот для части расписания из работ от <tex>1</tex> до <tex>k - 1</tex>. Предположим, что <tex>h(t') < h(t)</tex> и работа <tex>k</tex> выполняется во временной промежуток <tex>t</tex>, но не выполняется в <tex>t'</tex> в расписании <tex>B'</tex>. Если в <tex>B'</tex> станок простаивает во время <tex>t'</tex>, мы можем переместить работу <tex>k</tex> из <tex>t</tex> в <tex>t'</tex>. Иначе работа <tex>r > k</tex> находится в расписании в промежутке <tex>t'</tex>, но ее нет в <tex>t</tex>. Мы можем передвинуть <tex>r</tex> в <tex>t</tex> и <tex>k</tex> в <tex>t'</tex> без увеличения целевой функции, потому что <tex>C_k \leqslant C_r</tex>. Продолжая действовать таким образом, мы достигнем оптимального расписания, в котором работы <tex>1 \ldots k</tex> расположены таким же образом, как и в <tex>A</tex>. Мы получили противоречие, так как выбранный <tex>k</tex> оказался не максимальным. | Пусть <tex>h</tex> {{---}} вектор частот для части расписания из работ от <tex>1</tex> до <tex>k - 1</tex>. Предположим, что <tex>h(t') < h(t)</tex> и работа <tex>k</tex> выполняется во временной промежуток <tex>t</tex>, но не выполняется в <tex>t'</tex> в расписании <tex>B'</tex>. Если в <tex>B'</tex> станок простаивает во время <tex>t'</tex>, мы можем переместить работу <tex>k</tex> из <tex>t</tex> в <tex>t'</tex>. Иначе работа <tex>r > k</tex> находится в расписании в промежутке <tex>t'</tex>, но ее нет в <tex>t</tex>. Мы можем передвинуть <tex>r</tex> в <tex>t</tex> и <tex>k</tex> в <tex>t'</tex> без увеличения целевой функции, потому что <tex>C_k \leqslant C_r</tex>. Продолжая действовать таким образом, мы достигнем оптимального расписания, в котором работы <tex>1 \ldots k</tex> расположены таким же образом, как и в <tex>A</tex>. Мы получили противоречие, так как выбранный <tex>k</tex> оказался не максимальным. |
Версия 22:48, 8 июня 2016
Задача: |
Дано медлительность. | одинаковых станков, которые работают параллельно, и работ, которые необходимо выполнить в произвольном порядке на всех станках. Любая работа на любом станке выполняется единицу времени. Для каждой работы есть время окончания — время, до которого она должна быть выполнена. Необходимо минимизировать суммарную
Содержание
Описание алгоритма
Идея
Будем полагать, что работы заданы в порядке неубывания их дедлайнов, то есть
.Лемма: |
Пусть есть работы с дедлайнами . Тогда существует оптимальное расписание, в котором времена завершения работ идут в том же порядке, то есть . |
Доказательство: |
Рассмотрим две работы | и из какого-либо оптимального расписания такие, что и . Поменяем эти работы в расписании местами, то есть и . Если они обе успевали выполниться вовремя, то это свойство сохранится, так как , значит по-прежнему и , то есть значение целевой функции мы не ухудшили и расписание осталось оптимальным. Если обе работы не успевали выполниться вовремя, то когда мы поменяем их местами ничего не изменится, то есть значение целевой функции останется прежним, так как мы не меняли значения времен окончаний, а только поменяли их местами. Если работа успевала выполниться, а — нет, то мы снова не ухудшим значение целевой функции. Покажем это. До того, как мы поменяли работы местами, было , так как . После того, как мы поменяли работы местами, . Но так как работа успевает выполниться до дедлайна, то .
Далее будем рассматривать только оптимальное расписание со свойством
.Теорема: |
Всегда существует оптимально расписание такое, что в нем для любого , где — количество станков. |
Доказательство: |
Рассмотрим оптимальное расписание
Таким образом, мы имеем три непересекающихся множества, которые вместе с работой |
Отсортируем работы в порядке неуменьшения дедлайнов. Для текущей работы
вычислим лимит — время, до которого закончится обработка данной работы, то есть , где , — периоды обработки работы . Будем выбирать эти периоды среди моментов времени, в которые выполняется наименьшее число работ.Псевдокод
Определим вектор частот
— количество работ во временном интервале . Работы отсортированы в порядке .function scheduler(): intvector<int> fill( ) fill( ) for to if вычислим — количество временных интервалов , таких, что if else else вычислим периодов с минимальными значениями for to // ставим работу на время return
Асимптотика
Алгоритм может работать за
на станке .
Таким образом, мы получаем распределение одной работы по
станкам для работ. Итоговая асимптотика — .Доказательство корректности
Теорема: |
Алгоритм строит оптимальное расписание для задачи |
Доказательство: |
Воспользуемся для доказательства леммой и теоремой, которые были доказаны выше. Из них мы знаем, что существует оптимальное расписание, для которого выполняются свойства и для любого , где — число станков. Пусть — оптимальное расписание, которое удовлетворяет свойству, по которому работы поставлены в те же временные промежутки, в которых они оказались следуя нашему расписанию . Более того, предположим, что было выбрано так, что максимально. Пусть . С того момента, как работа поставлена в расписании перед , определим временной промежуток в месте, где работа не выполняется в . Тогда в самом расписании этот промежуток либо так же пустой, либо он занят работой .
Работа Пусть точно там есть, потому что и поставлены на время , но не поставлены на время . Если свободный промежуток есть, тогда переставим работу со времени на время и работу со времени на . Иначе мы можем переместить работу с времени на время , c на , и с на . Тогда должно уменьшиться как минимум на один, а увеличится не больше, чем на один. Если мы продолжим так действовать, мы получим оптимальное расписание с , в котором работы расположены так же, как в расписании . — вектор частот для части расписания из работ от до . Предположим, что и работа выполняется во временной промежуток , но не выполняется в в расписании . Если в станок простаивает во время , мы можем переместить работу из в . Иначе работа находится в расписании в промежутке , но ее нет в . Мы можем передвинуть в и в без увеличения целевой функции, потому что . Продолжая действовать таким образом, мы достигнем оптимального расписания, в котором работы расположены таким же образом, как и в . Мы получили противоречие, так как выбранный оказался не максимальным. |
См. также
Источники информации
- Peter Brucker «Scheduling Algorithms», fifth edition, Springer — с. 171-174 ISBN 978-3-540-69515-8