264
правки
Изменения
1sumwu
,Нет описания правки
Данная задача является 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>, а оставшиеся записать в конец расписания в любом порядке.Далее проверяем полученное расписание на корректность, и в случае успеха, обновляем ответ. ==Псевдополиномиальное решение==
Применим для решения данной задачи [[Динамическое программирование|динамическое программирование]].
<tex> F_j(t) = F_{j}(d_j) </tex>
Для того, чтобы найти само расписание, по доказанной ниже выше лемме, нам достаточно найти множество работ, которые будут выполнены с опозданием. Это может быть сделано следующим способом:
t = d_n
L = \varnothing
<tex> t = t - p_j </tex>
==Время работы==