QSumCi — различия между версиями
м (rollbackEdits.php mass rollback) |
|||
(не показано 17 промежуточных версий 6 участников) | |||
Строка 1: | Строка 1: | ||
− | + | <tex dpi=200>Q\mid\mid\sum{C_i}</tex> | |
− | <tex>Q\mid\mid\sum{C_i}</tex> | ||
− | |||
− | |||
− | Цель - составить такое расписание, чтобы суммарное время окончания всех работ было минимальным. | + | {{Задача |
− | + | |definition = Есть несколько станков с разной скоростью выполнения работ и несколько работ с заданным временем выполнения.<br>Цель {{---}} составить такое расписание, чтобы суммарное время окончания всех работ было минимальным.}} | |
− | ==Алгоритм | + | == Решение == |
− | Пусть <tex> i_1, i_2, \ | + | === Алгоритм === |
− | Теперь введем неубывающую последовательность <tex> t_1, t_2 | + | Пусть <tex> i_1, i_2, \ldots i_r </tex> последовательность работ, выполняемых на станке с номером <tex> j </tex>. Тогда вклад этих работ в целевую функцию будет равен <tex> p_{i1}\cfrac{r}{s_j} + p_{i2}\cfrac{r-1}{s_j} + \ldots + p_{ir}\cfrac{1}{s_j} </tex>. По [[Задача_о_минимуме/максимуме_скалярного_произведения|теореме о минимуме/максимуме скалярного произведения]] видно, что сумма оптимальна, когда последовательность <tex> p_{ij} </tex> не убывает. |
+ | Теперь введем неубывающую последовательность <tex> t_1, t_2 \ldots t_n </tex>, которая состоит из <tex> n </tex> минимальных элементов из множества <tex> \left\{ \cfrac{1}{s_1}, \cfrac{1}{s_2} \ldots \cfrac{1}{s_m}, \cfrac{2}{s_1}, \cfrac{2}{s_2} \ldots \cfrac{2}{s_m}, \cfrac{3}{s_1} \ldots \right\}</tex> (для поиска <tex> t_1, t_2 \ldots t_n </tex> создадим [[Приоритетные очереди|приоритетную очередь]], положим в нее числа <tex> \cfrac{1}{s_1}, \cfrac{1}{s_2} \ldots \cfrac{1}{s_m}</tex> и будем последовательно извлекать <tex>n</tex> минимумов. После извлечения очередного минимума вида <tex>\cfrac{i}{s_j}</tex> добавим в очередь число <tex>\cfrac{i + 1}{s_j}</tex> и продолжим извлечение). Тогда <tex> t_i</tex> показывает на каком станке и какой по счету с конца должна выполняться работа с номером <tex>i</tex> в отсортированном по длительности списке работ. Сопоставляя работы и <tex> t_i</tex> составляем расписание. | ||
+ | === Корректность === | ||
{{Теорема | {{Теорема | ||
|statement= | |statement= | ||
Приведенный алгоритм верен. | Приведенный алгоритм верен. | ||
|proof= | |proof= | ||
− | # Докажем правильность выбора мест работ. Станок, на котором выполняется работа, и номер работы на этом станке с конца | + | # Докажем правильность выбора мест работ. Станок, на котором выполняется работа, и номер работы на этом станке с конца определяют коэффициент перед длительностью выполнения <tex> p_i\cfrac{t}{s_j} </tex>, тут <tex> t</tex> {{---}} номер работы с конца, а <tex>j</tex> {{---}} номер станка. Именно с таким коэффициентом работа войдет в целевую функцию. Мы выбираем минимальные <tex>n</tex> коэффициентов, следовательно, взяв хотя бы один другой коэффициент, мы увеличим время работы. |
− | # Докажем, что работы надо сопоставлять в порядке не убывания. Предположим у нас есть коэффициенты <tex> t_i </tex> и <tex> t_j </tex>, такие что <tex> t_i \ | + | # Докажем, что работы надо сопоставлять в порядке не убывания. Предположим, у нас есть коэффициенты <tex> t_i </tex> и <tex> t_j </tex>, такие что <tex> t_i \leqslant t_j </tex> и работы <tex> p_k \geqslant p_l </tex>, и мы сопоставили <tex> t_i </tex> с <tex> p_l </tex>, а <tex>t_j</tex> с <tex>p_k</tex>. Тогда, если мы поменяем работы местами, то значение целевой функции станет меньше на <tex> p_k(t_j - t_i)+p_l(t_i-t_j) = (p_k - p_l)(t_j-t_i) \geqslant 0</tex>. Видно, что результат не ухудшится. |
}} | }} | ||
− | ==Время работы== | + | === Время работы === |
+ | |||
+ | Начальная сортировка работ и [[Двоичная куча#Построение кучи за O(n)|инициализация приоритетной очереди]] занимают <tex>O(n\log{n} + m)</tex> времени. Затем происходит выбор минимальных коэффициентов, посредством приоритетной очереди время работы составит <tex>O(n\log{m})</tex>. Итого суммарное время работы <tex> O(n(\log{n}+\log{m}) + m)</tex>. | ||
− | + | == Источники информации == | |
+ | * Peter Brucker Scheduling Algorithms {{---}} Springer, 2006. {{---}} с. 133. {{---}} ISBN 978-3-540-69515-8 | ||
− | + | [[Категория: Алгоритмы и структуры данных]] | |
− | |||
− | [[Категория: | ||
[[Категория: Теория расписаний]] | [[Категория: Теория расписаний]] |
Текущая версия на 19:33, 4 сентября 2022
Задача: |
Есть несколько станков с разной скоростью выполнения работ и несколько работ с заданным временем выполнения. Цель — составить такое расписание, чтобы суммарное время окончания всех работ было минимальным. |
Решение
Алгоритм
Пусть теореме о минимуме/максимуме скалярного произведения видно, что сумма оптимальна, когда последовательность не убывает. Теперь введем неубывающую последовательность , которая состоит из минимальных элементов из множества (для поиска создадим приоритетную очередь, положим в нее числа и будем последовательно извлекать минимумов. После извлечения очередного минимума вида добавим в очередь число и продолжим извлечение). Тогда показывает на каком станке и какой по счету с конца должна выполняться работа с номером в отсортированном по длительности списке работ. Сопоставляя работы и составляем расписание.
последовательность работ, выполняемых на станке с номером . Тогда вклад этих работ в целевую функцию будет равен . ПоКорректность
Теорема: |
Приведенный алгоритм верен. |
Доказательство: |
|
Время работы
Начальная сортировка работ и инициализация приоритетной очереди занимают времени. Затем происходит выбор минимальных коэффициентов, посредством приоритетной очереди время работы составит . Итого суммарное время работы .
Источники информации
- Peter Brucker Scheduling Algorithms — Springer, 2006. — с. 133. — ISBN 978-3-540-69515-8