1sumwT — различия между версиями
| Shersh (обсуждение | вклад) м (→Описание алгоритма) | м (rollbackEdits.php mass rollback) | ||
| (не показано 7 промежуточных версий 3 участников) | |||
| Строка 9: | Строка 9: | ||
| ===Описание алгоритма=== | ===Описание алгоритма=== | ||
| − | Упорядочим работы в порядке неубывания дедлайнов. Обозначим за <tex>k</tex> работу с максимальным <tex>p_i</tex>.  | + | Упорядочим работы в порядке неубывания дедлайнов. Обозначим за <tex>k</tex> работу с максимальным <tex>p_i</tex>.   | 
| − | Будем делить имеющиеся у нас работы на множества <tex> I_1, I_2</tex> так, чтобы для любого <tex>j \geqslant k</tex> <tex>I_1 = \{1,\ldots, j\}\setminus\{k\}</tex>, <tex>I_2 = \{j+1,\ldots, n\}</tex>. Тогда в оптимальном расписании все работы из <tex>I_1</tex> окажутся до <tex>k</tex>, а работы из <tex>I_2</tex> будут расположены после <tex>k</tex>. Для работ из <tex> I_1</tex> оптимальное время начала выполнения <tex>t_1 = 0</tex>, для работ из <tex>I_2</tex> оптимальное начало <tex>t_2 = p = \sum\limits_{i=1}^j p_i</tex>. Таким образом, для любой <tex>j</tex> задача разбивается на две подзадачи.  | + | |
| + | Будем делить имеющиеся у нас работы на множества <tex> I_1, I_2</tex> так, чтобы для любого <tex>j \geqslant k</tex> <tex>I_1 = \{1,\ldots, j\}\setminus\{k\}</tex>, <tex>I_2 = \{j+1,\ldots, n\}</tex>. Тогда в оптимальном расписании все работы из <tex>I_1</tex> окажутся до <tex>k</tex>, а работы из <tex>I_2</tex> будут расположены после <tex>k</tex>. Для работ из <tex> I_1</tex> оптимальное время начала выполнения <tex>t_1 = 0</tex>, для работ из <tex>I_2</tex> оптимальное начало <tex>t_2 = p = \sum\limits_{i=1}^j p_i</tex>. Таким образом, для любой <tex>j</tex> задача разбивается на две подзадачи.   | ||
| + | |||
| Алгоритм вычисляет оптимальное расписание для всех работ рекурсивно. | Алгоритм вычисляет оптимальное расписание для всех работ рекурсивно. | ||
| Строка 17: | Строка 19: | ||
| Приведенный ниже алгоритм вычисляет оптимальную последовательность работ <tex>\pi</tex> для множества работ <tex>I = \{i_1, i_2,\ldots, i_r\}</tex> в начальный момент времени <tex>t</tex>. | Приведенный ниже алгоритм вычисляет оптимальную последовательность работ <tex>\pi</tex> для множества работ <tex>I = \{i_1, i_2,\ldots, i_r\}</tex> в начальный момент времени <tex>t</tex>. | ||
| − |    '''function''' sequence(t: '''int''', I: '''int[]'''): '''int[]''' | + |    '''function''' <tex>\mathrm{sequence}</tex>(<tex>t</tex>: '''int''', <tex>I</tex>: '''int[]'''): '''int[]'''   | 
|      '''if''' <tex>I = \varnothing</tex> |      '''if''' <tex>I = \varnothing</tex> | ||
|        '''return''' <tex>\varnothing</tex> |        '''return''' <tex>\varnothing</tex> | ||
| Строка 25: | Строка 27: | ||
|        <tex>I_1 = \{i_v \mid 1 \leqslant v  \leqslant j \wedge  v \ne k\}</tex> |        <tex>I_1 = \{i_v \mid 1 \leqslant v  \leqslant j \wedge  v \ne k\}</tex> | ||
|        <tex>t_1 = t </tex> |        <tex>t_1 = t </tex> | ||
| − |        <tex>\pi_1 = sequence (t_1 , I_1 )</tex> | + |        <tex>\pi_1 = \mathrm{sequence} (t_1 , I_1 )</tex> | 
|        <tex>I_2 = \{i_v \mid j <  v  \leqslant r\}</tex> |        <tex>I_2 = \{i_v \mid j <  v  \leqslant r\}</tex> | ||
|        <tex>t_2 = t + \sum\limits_{v=1}^j p_{i_v}</tex>   |        <tex>t_2 = t + \sum\limits_{v=1}^j p_{i_v}</tex>   | ||
| − |        <tex>\pi_2 = sequence(t_2 , I_2 )</tex> | + |        <tex>\pi_2 = \mathrm{sequence}(t_2 , I_2 )</tex> | 
| − |        <tex>\pi = \pi_1  \cup  \{i_k\}  \cup \ | + |        <tex>\pi = \pi_1  \cup  \{i_k\}  \cup \pi_2</tex> | 
|        '''if''' <tex>f(\pi, t) < f^*</tex> |        '''if''' <tex>f(\pi, t) < f^*</tex> | ||
| − | |||
|          <tex>f^* = f(\pi, t)</tex> |          <tex>f^* = f(\pi, t)</tex> | ||
| − |      '''return''' <tex>\pi | + |      '''return''' <tex>\pi</tex> | 
| ===Доказательство корректности алгоритма=== | ===Доказательство корректности алгоритма=== | ||
| − | {{Лемма | + | {{Лемма|id=l1  | 
| |statement= | |statement= | ||
| − | Пусть <tex> \pi  | + | Пусть <tex> \pi</tex>  {{---}} любая оптимальная последовательность работ для данных дедлайнов <tex>d_1, d_2,\ldots, d_n</tex>, <tex>C_j</tex> {{---}}  время завершения выполнения <tex>j</tex>-ой работы.   | 
| + | |||
| Рассмотрим <tex>d'_j</tex> такие, что <tex>\min\{d_j, C_j\}  \leqslant d'_j  \leqslant \max\{d_j, C_j\}. </tex>Тогда любая оптимальная последовательность работ для <tex> d_j</tex> будет оптимальна и для <tex>d'_j</tex>. | Рассмотрим <tex>d'_j</tex> такие, что <tex>\min\{d_j, C_j\}  \leqslant d'_j  \leqslant \max\{d_j, C_j\}. </tex>Тогда любая оптимальная последовательность работ для <tex> d_j</tex> будет оптимальна и для <tex>d'_j</tex>. | ||
| |proof= | |proof= | ||
| − | Рассмотрим последовательность <tex>\pi'</tex> оптимальную для <tex>d'_j</tex>. Тогда <tex>C'_j  | + | Рассмотрим последовательность <tex>\pi'</tex> оптимальную для <tex>d'_j</tex>. Тогда <tex>C'_j </tex> {{---}} время завершения работы <tex>j</tex> в данной последовательности.   | 
| − | |||
| − | |||
| − | |||
| − | + | <tex>T( \pi) = T′(\pi) + \sum\limits_{i=1}^n A_j </tex>,   | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | <tex>T( \pi′) = T ′(\pi′) + \sum\limits_{i=1}^n B_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>.  | + | Рассмотрим 2 случая: | 
| − | <tex>A_j = w_j(d'_j, d_j), </tex | + | |
| − | <tex>B_j = -w_j \max\{0, \min\{C'_j, d'_j\}~$-$~d'_j\}</tex>.  | + | # <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  \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>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  \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>A_j = w_j(d'_j, d_j), </tex> | ||
| + | #:<tex>B_j = -w_j \max\{0, \min\{C'_j, d'_j\}~$-$~d'_j\}</tex>.   | ||
| <tex>A_j \geqslant B_j</tex> при любом j, значит <tex>\sum\limits_{i=1}^n A_j  \geqslant \sum\limits_{i=1}^n B_j</tex>. Кроме того, <tex>T(\pi) \geqslant T(\pi')</tex>, так как <tex>\pi'</tex> минимизирует <tex>T'</tex>. <tex>T(\pi) \geqslant T(\pi')</tex> и <tex>\pi'</tex> оптимально для <tex>d_i</tex>. | <tex>A_j \geqslant B_j</tex> при любом j, значит <tex>\sum\limits_{i=1}^n A_j  \geqslant \sum\limits_{i=1}^n B_j</tex>. Кроме того, <tex>T(\pi) \geqslant T(\pi')</tex>, так как <tex>\pi'</tex> минимизирует <tex>T'</tex>. <tex>T(\pi) \geqslant T(\pi')</tex> и <tex>\pi'</tex> оптимально для <tex>d_i</tex>. | ||
| Строка 65: | Строка 69: | ||
| − | {{Лемма | + | {{Лемма|id=l2 | 
| |statement= | |statement= | ||
| Пусть веса работ  согласованы (из <tex>p_i < p_j</tex> следует <tex>w_i  \geqslant w_j</tex>). Тогда существует оптимальная последовательность <tex> \pi </tex>, в которой работа <tex>i</tex> предшествует работе <tex>j</tex>, если <tex> d_i  \leqslant  d_j</tex> и <tex> p_i  < p_j</tex>, и все работы, выполненные до дедлайна, упорядочены в неубывающем порядке <tex>d_i</tex>. | Пусть веса работ  согласованы (из <tex>p_i < p_j</tex> следует <tex>w_i  \geqslant w_j</tex>). Тогда существует оптимальная последовательность <tex> \pi </tex>, в которой работа <tex>i</tex> предшествует работе <tex>j</tex>, если <tex> d_i  \leqslant  d_j</tex> и <tex> p_i  < p_j</tex>, и все работы, выполненные до дедлайна, упорядочены в неубывающем порядке <tex>d_i</tex>. | ||
| Строка 71: | Строка 75: | ||
| |proof= | |proof= | ||
| − | Пусть <tex>\pi  | + | Пусть <tex>\pi </tex> {{---}} оптимальная последовательность.  Если работа <tex>i</tex> идет после работы <tex>j</tex> в <tex> \pi</tex>, то <tex>d_i  \leqslant d_j, p_i < p_j</tex>. Веса работ согласованы, поэтому <tex>w_j \leqslant w_i </tex>, и <tex>w_j\max\{0,T ~$-$~ d_j\} \leqslant w_i\max\{0,T ~$-$~ d_i\}</tex> выполняется для всех Т. Таким образом, если поместить работу <tex>j</tex> сразу после <tex>i</tex>, расписание останется оптимальным.   | 
| + | |||
| Кроме того, если работа <tex>i</tex> следует за работой <tex>j</tex>, где  <tex> d_i  \leqslant d_j </tex> и <tex>i, j</tex> выполнены до дедлайна, тогда, после перемещения <tex>j</tex> на позицию сразу после <tex>i</tex>, работа  <tex>j</tex> все еще будет выполнена до дедлайна. Таким образом, общее значение минимизируемой функции не возрастет. | Кроме того, если работа <tex>i</tex> следует за работой <tex>j</tex>, где  <tex> d_i  \leqslant d_j </tex> и <tex>i, j</tex> выполнены до дедлайна, тогда, после перемещения <tex>j</tex> на позицию сразу после <tex>i</tex>, работа  <tex>j</tex> все еще будет выполнена до дедлайна. Таким образом, общее значение минимизируемой функции не возрастет. | ||
| Будем повторять перестановки, пока оптимальное расписание не будет удовлетворять условиям леммы. | Будем повторять перестановки, пока оптимальное расписание не будет удовлетворять условиям леммы. | ||
| Строка 82: | Строка 87: | ||
| |proof= | |proof= | ||
| − | Обозначим за <tex>C'_k</tex> максимально возможное время завершения работы <tex>k</tex> в любой последовательности, которая оптимальна в соответствии с <tex>d_1, d_2,\ldots, d_n</tex>. Обозначим за <tex>\pi</tex> оптимальную последовательность, соответствующую <tex>d_1, d_2,\ldots, d_k ~$-$~ 1, d'_k = \max\{C'_k, d_k\}, d_k+1,\ldots, d_n</tex> и удовлетворяющую условиям  | + | Обозначим за <tex>C'_k</tex> максимально возможное время завершения работы <tex>k</tex> в любой последовательности, которая оптимальна в соответствии с <tex>d_1, d_2,\ldots, d_n</tex>. Обозначим за <tex>\pi</tex> оптимальную последовательность, соответствующую <tex>d_1, d_2,\ldots, d_k ~$-$~ 1, d'_k = \max\{C'_k, d_k\}, d_k+1,\ldots, d_n</tex> и удовлетворяющую условиям [[#l1 | леммы]]. Обозначим за <tex>C_k</tex> время завершения работы <tex>k</tex> из <tex>\pi</tex>.   | 
| − | Согласно  | + | |
| + | Согласно [[#l1 | лемме]], последовательность <tex>\pi</tex> оптимальна для исходных <tex>d_1, d_2,\ldots, d_n</tex>. Тогда по определению <tex>C'_k</tex>: <tex>C_k \leqslant  C'_k \leqslant \max\{C'_k, d_k\},</tex>  <tex> d'_k = \max\{C'_k, d_k\},</tex> <tex>C_k \leqslant  C'_k \leqslant d'_k</tex>. Таким образом, работе  <tex>k</tex> не может предшествовать работа <tex>j</tex> такая, что <tex>d_j</tex> > <tex>d'_k</tex>. Иначе работа j тоже была бы выполнена вовремя, что противоречит условиям [[#l2 | леммы]]. С другой стороны, работе <tex>k</tex> должны предшествовать все работы <tex>j \ne k</tex> такие, что <tex>d_j \leqslant d'_k</tex>, так как <tex>p_j > p_k</tex>. Если мы выберем в качеству работы <tex>j^*</tex> самую большую работу такую, что <tex>d_j ^* \leqslant d'_k,</tex> <tex>d'_k = \max\{C'_k, d_k\}</tex>, тогда <tex>j ^* \geqslant k</tex>, так как <tex>d_j ^* \leqslant d'_k</tex> и <tex>j^*</tex> обладает необходимыми свойствами. | ||
| }} | }} | ||
| ===Время работы=== | ===Время работы=== | ||
| − | Пускай все времена выполнения работ различны. Тогда все множества работ, используемые в качестве аргументов рекурсивного вызова функции можно представить в виде <tex>\langle i, j, k \rangle : \{ v \mid i \leqslant v \leqslant j \wedge  p_v < p_k\}</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> 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>. | ||
Текущая версия на 19:06, 4 сентября 2022
| Задача: | 
| Есть один станок и работ. Для каждой работы заданы время выполнения дедлайн и стоимость выполнения этой работы . Необходимо минимизировать . | 
Содержание
Псевдополиномиальное решение
Описание алгоритма
Упорядочим работы в порядке неубывания дедлайнов. Обозначим за работу с максимальным .
Будем делить имеющиеся у нас работы на множества так, чтобы для любого , . Тогда в оптимальном расписании все работы из окажутся до , а работы из будут расположены после . Для работ из оптимальное время начала выполнения , для работ из оптимальное начало . Таким образом, для любой задача разбивается на две подзадачи.
Алгоритм вычисляет оптимальное расписание для всех работ рекурсивно.
Псевдокод
Приведенный ниже алгоритм вычисляет оптимальную последовательность работ для множества работ в начальный момент времени .
function (: int, : int[]): int[] if return find for to if return
Доказательство корректности алгоритма
| Лемма: | 
| Пусть   — любая оптимальная последовательность работ для данных дедлайнов ,  —  время завершения выполнения -ой работы. 
Рассмотрим  такие, что Тогда любая оптимальная последовательность работ для  будет оптимальна и для . | 
| Доказательство: | 
| Рассмотрим последовательность оптимальную для . Тогда — время завершения работы в данной последовательности. , . Рассмотрим 2 случая: 
 | 
| Лемма: | 
| Пусть веса работ  согласованы (из  следует ). Тогда существует оптимальная последовательность , в которой работа  предшествует работе , если  и , и все работы, выполненные до дедлайна, упорядочены в неубывающем порядке . | 
| Доказательство: | 
| Пусть — оптимальная последовательность. Если работа идет после работы в , то . Веса работ согласованы, поэтому , и выполняется для всех Т. Таким образом, если поместить работу сразу после , расписание останется оптимальным. Кроме того, если работа следует за работой , где и выполнены до дедлайна, тогда, после перемещения на позицию сразу после , работа все еще будет выполнена до дедлайна. Таким образом, общее значение минимизируемой функции не возрастет.Будем повторять перестановки, пока оптимальное расписание не будет удовлетворять условиям леммы. | 
| Теорема: | 
| Пусть работы  отстортированы в порядке неубывания дедлайнов, и веса согласованы. Обозначим за  работу с наибольшим .
Тогда существует работа  такая, что в оптимальном расписании все работы  размещены до , а оставшиеся работы размещены после . | 
| Доказательство: | 
| Обозначим за максимально возможное время завершения работы в любой последовательности, которая оптимальна в соответствии с . Обозначим за оптимальную последовательность, соответствующую и удовлетворяющую условиям леммы. Обозначим за время завершения работы из .Согласно лемме, последовательность оптимальна для исходных . Тогда по определению : . Таким образом, работе не может предшествовать работа такая, что > . Иначе работа j тоже была бы выполнена вовремя, что противоречит условиям леммы. С другой стороны, работе должны предшествовать все работы такие, что , так как . Если мы выберем в качеству работы самую большую работу такую, что , тогда , так как и обладает необходимыми свойствами. | 
Время работы
Пускай все времена выполнения работ различны. Тогда все множества работ, используемые в качестве аргументов рекурсивного вызова функции можно представить в виде , .
У нас максимум различных значений . Значит, мы вызовем в худшем случае раз. Более того, для фиксированного все значения для могут быть сосчитаны за .
Таким образом, мы получаем алгоритм, работающий за или , где .
См. также
Источники информации
- P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 95 - 98
