1sumwu — различия между версиями
Dominica (обсуждение | вклад) (→Решение) |
Dominica (обсуждение | вклад) |
||
Строка 7: | Строка 7: | ||
Данная задача является NP-сложной задачей. | Данная задача является NP-сложной задачей. | ||
+ | ==Общее решение== | ||
+ | В общем случае, когда времена выполнения <tex>p_i</tex> могут быть сколь угодно большими или дробными, данная задача может быть решена с помощью перебора. | ||
+ | Далее будем пользоваться следующим фактом: | ||
− | == | + | {{Лемма |
+ | |id=lemma1 | ||
+ | |statement= Пусть все работы отсортированы в порядке неубывания дедлайнов <tex>d_i</tex>. | ||
+ | Тогда существует оптимальное расписание вида <tex>i_1, i_2, \ldots, i_s, i_{s+1}, \ldots, i_n </tex>, такое, что <tex>i_1 < i_2 < \ldots < i_s </tex> {{---}} номера работ, которые успеют выполниться вовремя, а <tex>i_{s+1}, \ldots, i_n </tex> {{---}} номера просроченных работ. | ||
+ | |proof= Пусть у нас есть некоторое оптимальное раписание <tex>S</tex>. Получим необходимое нам расписание путем переставления некоторых работ. | ||
+ | #Если работа с номером <tex> i</tex> выполнится в <tex>S</tex> с опозданием, то переставим эту работу в конец. При этом, так как работа просрочна в оптимальном расписании <tex>S</tex>, при такой перестановке не произойдет увеличения целевой функции. | ||
+ | #Если работы с номерами <tex>i</tex> и <tex>j</tex> в расписании <tex>S</tex> выполняются вовремя, но при этом <tex>d_i < d_j </tex>, но <tex>j</tex> стоит в <tex>S</tex> раньше <tex>i</tex>. Тогда переставим работу с номером <tex>j</tex> так, чтобы она выполнялась после работы <tex>i</tex>. Таким образом, каждая из работ, находившихся в <tex>S</tex> между <tex>j</tex> и <tex>i</tex>, включая <tex>i</tex>, будет выполняться в новом расписании на <tex>p_j</tex> единиц времени раньше. Эта перестановка не повлияет на оптимальнось расписания: | ||
+ | #*Ни одна из работ, котарая успевала выполниться в расписании <tex>S</tex>, не попадет в список просроченных работ при переставлении её на более раннее время. | ||
+ | #*Число работ, не успевающих выполниться вовремя, не может уменьшится, иначе бы возникло противоречие в исходным выбором <tex>S</tex>, как оптимального решения. | ||
+ | #*Поскольку <tex>d_i < d_j </tex> и работа <tex>i</tex> будет заканчиваться на <tex>p_j</tex> единиц времени раньше, то стоящая сразу послее нее работа <tex>j</tex> тоже будет успевать выполниться. | ||
+ | }} | ||
+ | |||
+ | Перебираем все битовые маски. Для каждой маски будем считать, что если бит, соответствующий заданию с номером <tex>i</tex> равен <tex>1</tex>, то будем предполагать, что это задание успеет выполниться, если бит равен <tex>0</tex> {{---}} то не успеет. | ||
+ | Далее, согласно доказанной лемме, мы должны выписать все задания, которые, согласно нашему предположению, могут быть выполнены без опоздания в начало расписания в порядке возрастания дедлайнов <tex>d_i</tex>, а оставшиеся записать в конец расписания в любом порядке. | ||
+ | Далее проверяем полученное расписание на корректность, и в случае успеха, обновляем ответ. | ||
+ | |||
+ | ==Псевдополиномиальное решение== | ||
Применим для решения данной задачи [[Динамическое программирование|динамическое программирование]]. | Применим для решения данной задачи [[Динамическое программирование|динамическое программирование]]. | ||
Строка 47: | Строка 66: | ||
<tex> F_j(t) = F_{j}(d_j) </tex> | <tex> F_j(t) = F_{j}(d_j) </tex> | ||
− | Для того, чтобы найти само расписание, по доказанной | + | Для того, чтобы найти само расписание, по доказанной выше лемме, нам достаточно найти множество работ, которые будут выполнены с опозданием. Это может быть сделано следующим способом: |
t = d_n | t = d_n | ||
L = \varnothing | L = \varnothing | ||
Строка 57: | Строка 76: | ||
<tex> t = t - p_j </tex> | <tex> t = t - p_j </tex> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==Время работы== | ==Время работы== | ||
Версия 08:31, 4 июня 2016
Задача: |
Есть один станок и | работ. Для каждой работы заданы время выполнения дедлаин и стоимось выполнения этой работы . Необходим минимизировать .
Данная задача является NP-сложной задачей.
Содержание
Общее решение
В общем случае, когда времена выполнения
могут быть сколь угодно большими или дробными, данная задача может быть решена с помощью перебора. Далее будем пользоваться следующим фактом:Лемма: |
Пусть все работы отсортированы в порядке неубывания дедлайнов .
Тогда существует оптимальное расписание вида , такое, что — номера работ, которые успеют выполниться вовремя, а — номера просроченных работ. |
Доказательство: |
Пусть у нас есть некоторое оптимальное раписание . Получим необходимое нам расписание путем переставления некоторых работ.
|
Перебираем все битовые маски. Для каждой маски будем считать, что если бит, соответствующий заданию с номером
равен , то будем предполагать, что это задание успеет выполниться, если бит равен — то не успеет. Далее, согласно доказанной лемме, мы должны выписать все задания, которые, согласно нашему предположению, могут быть выполнены без опоздания в начало расписания в порядке возрастания дедлайнов , а оставшиеся записать в конец расписания в любом порядке. Далее проверяем полученное расписание на корректность, и в случае успеха, обновляем ответ.Псевдополиномиальное решение
Применим для решения данной задачи динамическое программирование.
Обозначим
. Для всех и будем рассчитывать — значение целевой функции, при условии, что были рассмотрены первые работ и общее время выполнения тех из них, что будут закончены вовремя, не превышает времени .- Если и работа успевает выполниться вовремя в расписании, соответствующем , то , иначе .
- Если , то , поскольку все работы с номерами , законченные позже, чем , будут выполнены с опозданием.
Отсюда, получим соотношение:
В качестве начальных условий следует взять
при и при .Ответом на задачу будет
.Приведенный ниже алгоритм вычисляет
для и . За обозначим самое большое из времен выполнения заданий.сортируем работы по неубыванию времен дедлайнов= for to for to F_j(t) = \infty for to F_0(t) = 0 for to for to if else for to
Для того, чтобы найти само расписание, по доказанной выше лемме, нам достаточно найти множество работ, которые будут выполнены с опозданием. Это может быть сделано следующим способом:
t = d_n L = \varnothing fordownto if </tex> else
Время работы
Время работы приведенного выше алгоритма —
.См. также
Источники информации
- P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 26 - 28