F2Cmax — различия между версиями
AMaltsev (обсуждение | вклад) м (убрал неоднозначность) |
AMaltsev (обсуждение | вклад) м |
||
Строка 1: | Строка 1: | ||
+ | <tex dpi=200>F2 \mid\mid C_{max} </tex> | ||
{{Задача | {{Задача | ||
|definition=Рассмотрим задачу: | |definition=Рассмотрим задачу: | ||
− | * | + | *дано <tex>n</tex> работ и <tex>2</tex> станка, |
− | * | + | *для каждой работы известно её время выполнения на каждом станке <tex>p_{ij}</tex>, |
− | * | + | *каждую работу необходимо выполнить сначала на первом станке, а потом на втором. |
Требуется минимизировать время окончания выполнения всех работ. }} | Требуется минимизировать время окончания выполнения всех работ. }} | ||
Строка 10: | Строка 11: | ||
Пусть <tex>p_{i1}</tex> {{---}} время выполнения <tex>i</tex>-ой работы на первом станке, а <tex>p_{i2}</tex> {{---}} на втором.<br/> | Пусть <tex>p_{i1}</tex> {{---}} время выполнения <tex>i</tex>-ой работы на первом станке, а <tex>p_{i2}</tex> {{---}} на втором.<br/> | ||
<ol> | <ol> | ||
− | <li> | + | <li>Алгоритм строит два списка <tex> L </tex> и <tex> R </tex>. Изначально они пусты. Также поддерживается множество еще не распределенных по спискам <tex> L </tex> и <tex> R </tex> работ <tex>X = \{i \mid i = 1, \dots, n\}</tex> </li> |
− | <li> Пока множество <tex> X </tex> не пусто, | + | <li> Пока множество <tex> X </tex> не пусто, распределяем работы по спискам следующим образом: |
<ul> | <ul> | ||
<li> Находим такие индексы <tex> i </tex> и <tex> j </tex>, что <tex>p_{ij} = \min \{ p_{ij} \mid i \in X; j = 1, 2\}</tex> </li> | <li> Находим такие индексы <tex> i </tex> и <tex> j </tex>, что <tex>p_{ij} = \min \{ p_{ij} \mid i \in X; j = 1, 2\}</tex> </li> | ||
Строка 18: | Строка 19: | ||
</ul> | </ul> | ||
</li> | </li> | ||
− | <li> Рассмотрим список <tex> T = L | + | <li> Рассмотрим список <tex> T = L + R</tex> - конкатенацию <tex> L</tex> и <tex>R</tex>. Утверждается, что этот список является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором станке, при этом избегая одновременного выполнения одной и той же работы. </li> |
</ol> | </ol> | ||
Строка 29: | Строка 30: | ||
|proof= | |proof= | ||
[[Файл:f2cmax_first_fixed.png|400px|thumb|right|Рис. 1]] | [[Файл:f2cmax_first_fixed.png|400px|thumb|right|Рис. 1]] | ||
− | Предположим обратное: что не существует оптимального расписания с одинаковыми перестановками работ на станках. Рассмотрим некоторое оптимальное расписание с максимальным по длине общим префиксом на станках. | + | Предположим обратное: что не существует оптимального расписания с одинаковыми перестановками работ на станках. |
− | + | Рассмотрим некоторое оптимальное расписание с максимальным по длине общим префиксом на станках. Пусть его длина равна <tex> k </tex>, где <tex> k < n </tex>. Пусть на <tex> k </tex> позиции на первом и втором станках стоит работа <tex> i </tex>, а на втором станке на позиции <tex> k + 1 </tex> стоит работа <tex> j </tex>. Тогда заметим, что если мы поставим работу <tex> j </tex> на первом станке сразу после работы <tex> i </tex>, то последовательные работы с <tex> h </tex> по <tex> m </tex> (см. Рис. 1) по-прежнему будут успевать выполниться, так как на втором станке они выполняются в текущем расписании после <tex> j </tex>. Таким образом нам удалось увеличить длину наибольшего общего префикса, а так как по нашему предположению она была максимальна, то наше предположение неверно, то искомое расписание с одинаковым порядком выполнения работ на обоих станках существует. | |
− | Пусть его длина равна <tex> k </tex>, где <tex> k < n </tex>. Пусть на <tex> k </tex> позиции на первом и втором станках стоит работа <tex> i </tex>, а на втором станке на позиции <tex> k + 1 </tex> стоит работа <tex> j </tex>. Тогда заметим, что если мы поставим работу <tex> j </tex> на первом станке сразу после работы <tex> i </tex>, то последовательные работы с <tex> h </tex> по <tex> m </tex> (см. Рис. 1) по-прежнему будут успевать выполниться, так как на втором станке они выполняются в текущем расписании после <tex> j </tex>. Таким образом нам удалось увеличить длину наибольшего общего префикса, а так как по нашему предположению она была максимальна, то наше предположение неверно, то искомое расписание с одинаковым порядком выполнения работ на обоих станках существует. | ||
}} | }} | ||
− | Таким образом задача сводится к поиску этой искомой перестановки. Докажем, что полученный | + | Таким образом задача сводится к поиску этой искомой перестановки. Докажем, что полученный приведенным выше алгоритмом список является оптимальной перестановкой работ. |
{{лемма | {{лемма | ||
|id=lemma1 | |id=lemma1 | ||
|about=1 | |about=1 | ||
− | |statement= Если для каких-то работ <tex> i </tex> и <tex> j </tex> из списка <tex> T </tex> верно неравенство <tex> \min(p_{i1}, p_{j2}) < \min(p_{j1}, p_{i2}) </tex>, то работа <tex> i </tex> встречается в списке <tex> T </tex> раньше, чем <tex> j </tex> | + | |statement= Если для каких-то работ <tex> i </tex> и <tex> j </tex> из списка <tex> T </tex> верно неравенство <tex> \min(p_{i1}, p_{j2}) < \min(p_{j1}, p_{i2}) </tex>, то работа <tex> i </tex> встречается в списке <tex> T </tex> раньше, чем <tex> j </tex>. |
|proof= | |proof= | ||
Пусть <tex> p_{i1} < p_{j2} </tex>. Случай <tex> p_{i1} > p_{j2} </tex> рассматривается аналогично. | Пусть <tex> p_{i1} < p_{j2} </tex>. Случай <tex> p_{i1} > p_{j2} </tex> рассматривается аналогично. | ||
− | + | Так как <tex> p_{i1} < \min(p_{j1}, p_{i2}) \leqslant p_{i2} </tex>, то работа <tex> i \in L </tex>. Работа <tex> j </tex> либо стоит в <tex> R </tex>, либо она стоит в <tex> L </tex> и при этом <tex> p_{i1} < p_{j1} </tex>. Заметим, что в обоих случаях она расположена позже (в силу нашего построения), чем работа <tex> i </tex>. | |
}} | }} |
Версия 23:32, 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