1sumwT
Задача: |
Есть один станок и | работ. Для каждой работы заданы время выполнения дедлайн и стоимость выполнения этой работы . Необходимо минимизировать .
Псевдополиномиальное решение
Описание алгоритма
Упорядочим работы в порядке неубывания дедлайнов. Обозначим за
Будем делить имеющиеся у нас работы на множества так, чтобы для любого , . Тогда в оптимальном расписании все работы из окажутся до , а работы из будут расположены после . Для работ из оптимальное время начала выполнения , для работ из оптимальное начало . Таким образом, для любой задача разбивается на 2 подзадачи.
Алгоритм вычисляет оптимальное расписание для всех работ рекурсивно.
Псевдокод
Приведенный ниже алгоритм вычисляет оптимальную последовательность работ
для множества работ в начальный момент времени .function sequence(t: int, I: int[]): int[] ifreturn find for to if return
Доказательство корректности алгоритма
Лемма: |
Пусть любая оптимальная последовательность работ для данных дедлайнов , время завершения выполнения -ой работы.
Рассмотрим такие, что Тогда любая оптимальная последовательность работ для будет оптимальна и для . |
Доказательство: |
Рассмотрим последовательность
|
Лемма: |
Пусть веса работ согласованы (из следует ). Тогда существует оптимальная последовательность , в которой работа предшествует работе , если и , и все работы, выполненные до дедлайна, упорядочены в неубывающем порядке . |
Доказательство: |
Пусть |
Теорема: |
Пусть работы отстортированы в порядке неубывания дедлайнов, и веса согласованы. Обозначим за работу с наибольшим .
Тогда существует работа такая, что в оптимальном расписании все работы размещены до , а оставшиеся работы размещены после . |
Доказательство: |
Обозначим за |
Время работы
Пускай все времена выполнения работ различны. Тогда все множества работ, используемые в качестве аргументов рекурсивного вызова функции можно представить в виде
У нас максимум различных значений . Значит, нам нужно вызвать раз. Более того, для фиксированного все значения для могут быть сосчитаны за .
Таким образом, мы получаем алгоритм, работающий за или , где .
См. также
Источники информации
- P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 95 - 98