1sumwu — различия между версиями
Dominica (обсуждение | вклад) |
Dominica (обсуждение | вклад) |
||
Строка 2: | Строка 2: | ||
{{Задача | {{Задача | ||
− | |definition= Есть один станок и <tex>n</tex> работ. Для каждой работы заданы время выполнения <tex> p_i,</tex> | + | |definition= Есть один станок и <tex>n</tex> работ. Для каждой работы заданы время выполнения <tex> p_i,</tex> дедлайн <tex>d_i</tex> и стоимость выполнения этой работы <tex>w_i \geqslant 0</tex>. |
− | + | Необходимо минимизировать <tex>\sum w_i U_i</tex>. | |
}} | }} | ||
− | |||
==Общее решение== | ==Общее решение== | ||
− | В общем случае, когда времена выполнения <tex>p_i</tex> могут быть сколь угодно большими или дробными, данная задача может быть решена с помощью перебора. | + | В общем случае, когда времена выполнения работ <tex>p_i</tex> могут быть сколь угодно большими или дробными, данная задача может быть решена с помощью перебора. |
− | Далее | + | Далее широко будет использоваться следующий факт: |
{{Лемма | {{Лемма | ||
Строка 17: | Строка 16: | ||
|proof= Пусть у нас есть некоторое оптимальное раписание <tex>S</tex>. Получим необходимое нам расписание путем переставления некоторых работ. | |proof= Пусть у нас есть некоторое оптимальное раписание <tex>S</tex>. Получим необходимое нам расписание путем переставления некоторых работ. | ||
#Если работа с номером <tex> i</tex> выполнится в <tex>S</tex> с опозданием, то переставим эту работу в конец. При этом, так как работа просрочна в оптимальном расписании <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>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>S</tex>, как оптимального решения. |
− | #*Поскольку <tex>d_i < d_j </tex> и работа <tex>i</tex> будет заканчиваться на <tex>p_j</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>, а оставшиеся записать в конец расписания в любом порядке. |
− | Далее проверяем полученное расписание на корректность, и в случае успеха, обновляем ответ. | + | Далее проверяем полученное расписание на корректность, и, в случае успеха, обновляем ответ. |
==Псевдополиномиальное решение== | ==Псевдополиномиальное решение== |
Версия 09:09, 4 июня 2016
Задача: |
Есть один станок и | работ. Для каждой работы заданы время выполнения дедлайн и стоимость выполнения этой работы . Необходимо минимизировать .
Содержание
Общее решение
В общем случае, когда времена выполнения работ
могут быть сколь угодно большими или дробными, данная задача может быть решена с помощью перебора. Далее широко будет использоваться следующий факт:Лемма: |
Пусть все работы отсортированы в порядке неубывания дедлайнов .
Тогда существует оптимальное расписание вида , такое, что — номера работ, которые успеют выполниться вовремя, а — номера просроченных работ. |
Доказательство: |
Пусть у нас есть некоторое оптимальное раписание . Получим необходимое нам расписание путем переставления некоторых работ.
|
Для решения переберем все битовые маски. Для каждой маски будем считать, что если бит, соответствующий заданию с номером
равен , то это задание успеет выполниться, а если бит равен — то не успеет. Далее, согласно доказанной лемме, мы должны выписать все задания, которые, по нашему предположению, могут быть выполнены без опоздания в начало расписания в порядке возрастания дедлайнов , а оставшиеся записать в конец расписания в любом порядке. Далее проверяем полученное расписание на корректность, и, в случае успеха, обновляем ответ.Псевдополиномиальное решение
Применим для решения данной задачи динамическое программирование.
Обозначим
. Для всех и будем рассчитывать — значение целевой функции, при условии, что были рассмотрены первые работ и общее время выполнения тех из них, что будут закончены вовремя, не превышает времени .- Если и работа успевает выполниться вовремя в расписании, соответствующем , то , иначе .
- Если , то , поскольку все работы с номерами , законченные позже, чем , будут выполнены с опозданием.
Отсюда, получим соотношение:
В качестве начальных условий следует взять
при и при .Ответом на задачу будет
.Приведенный ниже алгоритм вычисляет
для и . За обозначим самое большое из времен выполнения заданий.сортируем работы по неубыванию времен дедлайнов= 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