1sumwT — различия между версиями
| Shersh (обсуждение | вклад) м (→Псевдокод) | Shersh (обсуждение | вклад)  м (→Доказательство корректности алгоритма) | ||
| Строка 53: | Строка 53: | ||
| Рассмотрим 2 случая: | Рассмотрим 2 случая: | ||
| − | #  | + | # <tex>C_j</tex> <tex>\leqslant d_j</tex>. | 
| #:Тогда <tex>C_j = \min\{d_j, C_j\}  \leqslant d'_j  \leqslant \max\{d_j, C_j\} = d_j </tex>, из чего следует <tex> w_j\max\{0, C_j ~$-$~ d_j\} = w_j\max\{0, C_j ~$-$~ d'_j\} = 0.</tex>   | #:Тогда <tex>C_j = \min\{d_j, C_j\}  \leqslant d'_j  \leqslant \max\{d_j, C_j\} = d_j </tex>, из чего следует <tex> w_j\max\{0, C_j ~$-$~ d_j\} = w_j\max\{0, C_j ~$-$~ d'_j\} = 0.</tex>   | ||
| #:<tex>C_j  \leqslant d'_j  \leqslant d_j  </tex>, и, учитывая <tex>C'_j \leqslant d'_j,  d'_j  C'_j \leqslant d_j</tex> и <tex>d_j \leqslant C'_j,</tex> получаем, что <tex>w_j \max\{0, C'_j ~$-$~ d_j\} = w_j\max\{0, C'_j ~$-$~ d'_j\} - w_j \max\{0, \min\{C'_j, d'_j\} ~$-$~ d_j\}  </tex>.   | #:<tex>C_j  \leqslant d'_j  \leqslant d_j  </tex>, и, учитывая <tex>C'_j \leqslant d'_j,  d'_j  C'_j \leqslant d_j</tex> и <tex>d_j \leqslant C'_j,</tex> получаем, что <tex>w_j \max\{0, C'_j ~$-$~ d_j\} = w_j\max\{0, C'_j ~$-$~ d'_j\} - w_j \max\{0, \min\{C'_j, d'_j\} ~$-$~ d_j\}  </tex>.   | ||
| #:<tex>A_j = 0  </tex>,   | #:<tex>A_j = 0  </tex>,   | ||
| #:<tex>B_j = w_j \max\{0, \min\{C'_j, d_j \} ~$-$~d'_j\} </tex>; | #:<tex>B_j = w_j \max\{0, \min\{C'_j, d_j \} ~$-$~d'_j\} </tex>; | ||
| − | #  | + | # <tex>C_j \geqslant d_j</tex> | 
| #:Тогда <tex>d_j = \min\{d_j, C_j\}  \leqslant d'_j  \leqslant \max\{d_j, C_j\} = C_j </tex>, из чего следует <tex> w_j\max\{0, C_j ~$-$~ d_j\} = w_j\max\{0, C_j ~$-$~ d'_j\} + w_j(d'_j ~$-$~ d_j). </tex>    | #:Тогда <tex>d_j = \min\{d_j, C_j\}  \leqslant d'_j  \leqslant \max\{d_j, C_j\} = C_j </tex>, из чего следует <tex> w_j\max\{0, C_j ~$-$~ d_j\} = w_j\max\{0, C_j ~$-$~ d'_j\} + w_j(d'_j ~$-$~ d_j). </tex>    | ||
| #:<tex>d_j  \leqslant d'_j  \leqslant C_j</tex> , получаем, что <tex>w_j \max\{0, C'_j ~$-$~ d_j\} = w_j\max\{0, C'_j ~$-$~ d'_j\} + w_j \max\{0, \min\{C'_j, d'_j\} ~$-$~ d_j\} </tex>.   | #:<tex>d_j  \leqslant d'_j  \leqslant C_j</tex> , получаем, что <tex>w_j \max\{0, C'_j ~$-$~ d_j\} = w_j\max\{0, C'_j ~$-$~ d'_j\} + w_j \max\{0, \min\{C'_j, d'_j\} ~$-$~ d_j\} </tex>.   | ||
Версия 22:22, 7 июня 2016
| Задача: | 
| Есть один станок и работ. Для каждой работы заданы время выполнения дедлайн и стоимость выполнения этой работы . Необходимо минимизировать . | 
Содержание
Псевдополиномиальное решение
Описание алгоритма
Упорядочим работы в порядке неубывания дедлайнов. Обозначим за работу с максимальным .
Будем делить имеющиеся у нас работы на множества так, чтобы для любого , . Тогда в оптимальном расписании все работы из окажутся до , а работы из будут расположены после . Для работ из оптимальное время начала выполнения , для работ из оптимальное начало . Таким образом, для любой задача разбивается на две подзадачи.
Алгоритм вычисляет оптимальное расписание для всех работ рекурсивно.
Псевдокод
Приведенный ниже алгоритм вычисляет оптимальную последовательность работ для множества работ в начальный момент времени .
function (: int, : int[]): int[] if return find for to if return
Доказательство корректности алгоритма
| Лемма: | 
| Пусть   — любая оптимальная последовательность работ для данных дедлайнов ,  —  время завершения выполнения -ой работы. 
Рассмотрим  такие, что Тогда любая оптимальная последовательность работ для  будет оптимальна и для . | 
| Доказательство: | 
| Рассмотрим последовательность оптимальную для . Тогда — время завершения работы в данной последовательности. , . Рассмотрим 2 случая: 
 | 
| Лемма: | 
| Пусть веса работ  согласованы (из  следует ). Тогда существует оптимальная последовательность , в которой работа  предшествует работе , если  и , и все работы, выполненные до дедлайна, упорядочены в неубывающем порядке . | 
| Доказательство: | 
| Пусть — оптимальная последовательность. Если работа идет после работы в , то . Веса работ согласованы, поэтому , и выполняется для всех Т. Таким образом, если поместить работу сразу после , расписание останется оптимальным. Кроме того, если работа следует за работой , где и выполнены до дедлайна, тогда, после перемещения на позицию сразу после , работа все еще будет выполнена до дедлайна. Таким образом, общее значение минимизируемой функции не возрастет.Будем повторять перестановки, пока оптимальное расписание не будет удовлетворять условиям леммы. | 
| Теорема: | 
| Пусть работы  отстортированы в порядке неубывания дедлайнов, и веса согласованы. Обозначим за  работу с наибольшим .
Тогда существует работа  такая, что в оптимальном расписании все работы  размещены до , а оставшиеся работы размещены после . | 
| Доказательство: | 
| Обозначим за максимально возможное время завершения работы в любой последовательности, которая оптимальна в соответствии с . Обозначим за оптимальную последовательность, соответствующую и удовлетворяющую условиям леммы. Обозначим за время завершения работы из .Согласно лемме, последовательность оптимальна для исходных . Тогда по определению : . Таким образом, работе не может предшествовать работа такая, что > . Иначе работа j тоже была бы выполнена вовремя, что противоречит условиям леммы. С другой стороны, работе должны предшествовать все работы такие, что , так как . Если мы выберем в качеству работы самую большую работу такую, что , тогда , так как и обладает необходимыми свойствами. | 
Время работы
Пускай все времена выполнения работ различны. Тогда все множества работ, используемые в качестве аргументов рекурсивного вызова функции можно представить в виде , .
У нас максимум различных значений . Значит, мы вызовем в худшем случае раз. Более того, для фиксированного все значения для могут быть сосчитаны за .
Таким образом, мы получаем алгоритм, работающий за или , где .
См. также
Источники информации
- P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 95 - 98
