1sumwT — различия между версиями
| Shersh (обсуждение | вклад) м (→Доказательство корректности алгоритма) | Shersh (обсуждение | вклад)  м (→Время работы) | ||
| Строка 96: | Строка 96: | ||
| Пускай все времена выполнения работ различны. Тогда все множества работ, используемые в качестве аргументов рекурсивного вызова функции можно представить в виде <tex>\langle i, j, k \rangle : \{ v \mid i \leqslant v \leqslant j \wedge  p_v < p_k\}</tex>, <tex> i, j, k \in \{1, 2, \ldots, n\}</tex>. | Пускай все времена выполнения работ различны. Тогда все множества работ, используемые в качестве аргументов рекурсивного вызова функции можно представить в виде <tex>\langle i, j, k \rangle : \{ v \mid i \leqslant v \leqslant j \wedge  p_v < p_k\}</tex>, <tex> i, j, k \in \{1, 2, \ldots, n\}</tex>. | ||
| − | У нас максимум <tex> p = \sum\limits_{i=1}^n p_i</tex> различных значений <tex>t</tex>. Значит, мы вызовем <tex> \mathrm{sequence(t,I) | + | У нас максимум <tex> p = \sum\limits_{i=1}^n p_i</tex> различных значений <tex>t</tex>. Значит, мы вызовем <tex> \mathrm{sequence}(t,I)</tex> в худшем случае  <tex>\mathcal{O}(n^3p)</tex> раз. Более того, для фиксированного <tex>k</tex> все значения <tex>\max\{p_v \mid v \in I_{ijk}\}</tex> для  <tex>i, j = 1,\ldots, n,</tex>   <tex>i < j</tex> могут быть сосчитаны за <tex>\mathcal{O}(n^2)</tex>.   | 
| Таким образом, мы получаем алгоритм, работающий за <tex>\mathcal{O}(n^3p)</tex> или <tex>\mathcal{O}(n^4p_{max})</tex>, где <tex>p_{max} = \max\limits_{i=1}^n p_i</tex>. | Таким образом, мы получаем алгоритм, работающий за <tex>\mathcal{O}(n^3p)</tex> или <tex>\mathcal{O}(n^4p_{max})</tex>, где <tex>p_{max} = \max\limits_{i=1}^n p_i</tex>. | ||
Версия 22:23, 7 июня 2016
| Задача: | 
| Есть один станок и работ. Для каждой работы заданы время выполнения дедлайн и стоимость выполнения этой работы . Необходимо минимизировать . | 
Содержание
Псевдополиномиальное решение
Описание алгоритма
Упорядочим работы в порядке неубывания дедлайнов. Обозначим за работу с максимальным .
Будем делить имеющиеся у нас работы на множества так, чтобы для любого , . Тогда в оптимальном расписании все работы из окажутся до , а работы из будут расположены после . Для работ из оптимальное время начала выполнения , для работ из оптимальное начало . Таким образом, для любой задача разбивается на две подзадачи.
Алгоритм вычисляет оптимальное расписание для всех работ рекурсивно.
Псевдокод
Приведенный ниже алгоритм вычисляет оптимальную последовательность работ для множества работ в начальный момент времени .
function (: int, : int[]): int[] if return find for to if return
Доказательство корректности алгоритма
| Лемма: | 
| Пусть   — любая оптимальная последовательность работ для данных дедлайнов ,  —  время завершения выполнения -ой работы. 
Рассмотрим  такие, что Тогда любая оптимальная последовательность работ для  будет оптимальна и для . | 
| Доказательство: | 
| Рассмотрим последовательность оптимальную для . Тогда — время завершения работы в данной последовательности. , . Рассмотрим 2 случая: 
 | 
| Лемма: | 
| Пусть веса работ  согласованы (из  следует ). Тогда существует оптимальная последовательность , в которой работа  предшествует работе , если  и , и все работы, выполненные до дедлайна, упорядочены в неубывающем порядке . | 
| Доказательство: | 
| Пусть — оптимальная последовательность. Если работа идет после работы в , то . Веса работ согласованы, поэтому , и выполняется для всех Т. Таким образом, если поместить работу сразу после , расписание останется оптимальным. Кроме того, если работа следует за работой , где и выполнены до дедлайна, тогда, после перемещения на позицию сразу после , работа все еще будет выполнена до дедлайна. Таким образом, общее значение минимизируемой функции не возрастет.Будем повторять перестановки, пока оптимальное расписание не будет удовлетворять условиям леммы. | 
| Теорема: | 
| Пусть работы  отстортированы в порядке неубывания дедлайнов, и веса согласованы. Обозначим за  работу с наибольшим .
Тогда существует работа  такая, что в оптимальном расписании все работы  размещены до , а оставшиеся работы размещены после . | 
| Доказательство: | 
| Обозначим за максимально возможное время завершения работы в любой последовательности, которая оптимальна в соответствии с . Обозначим за оптимальную последовательность, соответствующую и удовлетворяющую условиям леммы. Обозначим за время завершения работы из .Согласно лемме, последовательность оптимальна для исходных . Тогда по определению : . Таким образом, работе не может предшествовать работа такая, что > . Иначе работа j тоже была бы выполнена вовремя, что противоречит условиям леммы. С другой стороны, работе должны предшествовать все работы такие, что , так как . Если мы выберем в качеству работы самую большую работу такую, что , тогда , так как и обладает необходимыми свойствами. | 
Время работы
Пускай все времена выполнения работ различны. Тогда все множества работ, используемые в качестве аргументов рекурсивного вызова функции можно представить в виде , .
У нас максимум различных значений . Значит, мы вызовем в худшем случае раз. Более того, для фиксированного все значения для могут быть сосчитаны за .
Таким образом, мы получаем алгоритм, работающий за или , где .
См. также
Источники информации
- P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 95 - 98
