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 for downto if </tex> else
Время работы
Время работы приведенного выше алгоритма — .
См. также
Источники информации
- P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 26 - 28