1sumwT — различия между версиями
Shersh (обсуждение | вклад) м (→Псевдокод) |
м (rollbackEdits.php mass rollback) |
||
(не показаны 3 промежуточные версии 2 участников) | |||
Строка 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>. | ||
Строка 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>. |
Текущая версия на 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