F2Cmax — различия между версиями
AMaltsev (обсуждение | вклад) м (снята плашка) |
AMaltsev (обсуждение | вклад) (Псевдокод - лучшее соотв. статье) |
||
Строка 94: | Строка 94: | ||
==Псевдокод== | ==Псевдокод== | ||
− | '''function''' F2Cmax(n: '''int''', p: '''int'''[][2]): | + | |
− | + | '''function''' F2Cmax(n: '''int''', p: '''int'''[i][2]): | |
− | X = | + | L = <tex>\varnothing </tex> |
− | '''while''' X | + | R = <tex>\varnothing </tex> |
− | + | X = <tex>\{1, \dots, n\}</tex> | |
+ | '''while''' X <tex> \neq \varnothing</tex>: | ||
+ | Найти i и j , такие что <tex>p_{ij} = \min \{ p_{ij} \mid i \in X; j = 1, 2\}</tex> | ||
'''if''' j == 1: | '''if''' j == 1: | ||
− | + | L.addLast(i) | |
− | '''else''': | + | '''else''': |
− | + | R.addFirst(i) | |
− | X. | + | X.remove(i) |
− | '''return''' | + | T = L <tex>\circ</tex> R |
+ | '''return''' T | ||
==Сложность алгоритма== | ==Сложность алгоритма== |
Версия 15:17, 6 июня 2016
Задача: |
Рассмотрим задачу:
|
Содержание
Описание алгоритма
Пусть
- Будем в ходе нашего алгоритма строить два списка и . Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам и работ
- Пока множество
- Находим такие индексы и , что
- Если минимум достигается на первом станке (иными словами ), то поставим работу в конец списка , иначе ставим в начало списка
- Удаляем работу из множества
непусто будем распределять работы по спискам следующим образом:
- Рассмотрим список . Утверждается, что этот список является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором станке, при этом избегая одновременного выполнения одной и той же работы.
Доказательство корректности алгоритма
Теорема: |
Существует оптимальное расписание, в котором станки выполняют работы в одном и том же порядке. |
Доказательство: |
Предположим обратное, что не существует оптимального расписания с одиннаковыми перестановками работ на станках. Рассмотрим некоторое оптимальное расписание с максимальным по длине общим префиксом на станках. Пусть его длина равна , где . Пусть на позиции на первом и втором станках стоит работа , а на втором станке на позиции стоит работа . Тогда заметим, что если мы поставим работу на первом станке сразу после работы , то последовательные работы с по (см. Рис. 1) по-прежнему будут успевать выполниться, так как на втором станке они выполняются в текущем расписании после . Таким образом нам удалось увеличить длину наибольшего общего префикса, а так как по нашему предположению она была максимальна, то наше предположение неверно, то искомое расписание с одиннаковым порядком выполнения работ на обоих станках существует. |
Таким образом задача сводится к поиску этой искомой перестановки. Докажем, что полученный нашим алгоритмом список является отпимальной перестановкой работ.
Лемма (1): |
Если для каких-то работ и из списка верно неравенство , то работа встречается в списке раньше, чем |
Доказательство: |
Пусть То есть имеем, что . Случай рассматривается аналогично. . Так как , то работа . Работа либо стоит в , либо она стоит в и при этом . Заметим, что в обоих случаях она расположена позже (в силу нашего построения), чем работа , то лемма доказана. |
Лемма (2): |
Пусть имеем произвольное расписание, в котором работа идет сразу же после работы . Тогда если , то можем поменять местами эти работы без ухудшения целевой функции. |
Доказательство: |
Пусть — время, прошедшее с начала выполнения работы на первом станке до окончания работы на втором станке.Рассмотрим возможные случаи расположения работ и (см. Рис. 2)
Таким образом, . Иначе говоря .Аналогично имеем, что Так как , то из условия леммы имеем , то добавим к обеим частям. То получим, что , то есть , то при смене местами работ и ответ не ухудшается. |
Теорема: |
Построенная перестановка является оптимальной. |
Доказательство: |
Рассмотрим произвольную перестановку . Пусть перестановки и имеют общий префикс длины . Пусть и . Рассмотрим множество работ . Заметим, что для любой работы верно, что , так как если было бы верно обратное, то есть , то по лемме 1 было бы верно, что идет раньше , что неверно.Очевидно, что в перестановке Таким образом любая перестановка сводится к нашей без ухудшения ответа такими операциями, что подтверждает оптимальность перестановки работа будет стоять после (иначе общий префикс был бы длиннее), то заметим, что в этой перестановке для работы и для предыдущей работы верно (так как ), то по лемме 2 можем поменять местами работы и без ухудшения ответа. То такими операциями сможем дойти до пары работ и , которые при смене увеличат общий префикс перестановок и . |
Псевдокод
function F2Cmax(n: int, p: int[i][2]): L =R = X = while X : Найти i и j , такие что if j == 1: L.addLast(i) else: R.addFirst(i) X.remove(i) T = L R return T
Сложность алгоритма
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за
(либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за ). И делаем мы это раз, следовательно алгоритм работает за .Источники
- Peter Brucker. «Scheduling Algorithms» — «Springer», 2006 г. — 175 стр. — ISBN 978-3-540-69515-8