Изменения

Перейти к: навигация, поиск

Методы решения задач теории расписаний

2834 байта добавлено, 03:34, 31 марта 2020
P | pmtn | C_max
== Сведение к другой задаче ==
При сведении текущей задачи теории расписаний <tex> S </tex> к какой-то другой <tex> S' </tex> (не обязательно задаче теории расписаний) необходимо доказать два пункта:# Допустимость расписания, построенного с помощью задачи <tex> P S' </tex>, или существование способа его трансформации в допустимоебез нарушения оптимальности.# Следствие того, что если мы оптимизируем <tex> S' </tex>, мы также оптимизируем ответ для <tex> S </tex> (обратное в общем случае неверно).'''Примечание — если ''': если требуется полиномиальное время для решения задачи, требуется, чтобы сведение к другой задаче и трансформация расписания в допустимое также происходили должны происходить за полиномиальное время.=== Примеры ======= 1 | intree | Sum(w_i C_i) ====Предположим, что мы уже умеем решать задачу <tex> S' = 1 \mid outtree \mid \sum w_i C_i </tex>. Сведем нашу задачу <tex> S </tex> к ней следующим образом:* Развернем все ребра, теперь если работа <tex> i </tex> зависела от работы <tex> j </tex>, работа <tex> j </tex> будет зависеть от <tex> i </tex>.* Заменим все стоимости <tex> w_i </tex> на противоположные <tex> w'_i = - w_i</tex>.Утверждается, что решив соответствующую задачу <tex> S' </tex> и развернув полученное расписание, мы получим ответ для текущей задачи.# Полученное расписание будет допустимым, так как расписание для <tex> S' </tex> было допустимым, и в нем никакие две работы не пересекались и не прерывались. Развернув, мы не могли нарушить это свойство. Также из-за того, что мы развернули расписание, мы добились того, что все работы выполняются в правильном порядке (в расписании для <tex> S' </tex> из-за того, что расписание было развернуто, порядок был нарушен для всех работ). Таким образом, получили что расписание — допустимое.# Пусть с помощью задачи <tex> S' </tex> мы получили последовательность работ <tex> 1 \dots n </tex> (не теряя общности, занумеруем их от 1 до n). Распишем по определению значение целевой функции для <tex> S </tex>:#: <tex>\sum -w_i C_i = \sum \limits_{i=1}^n ( -w_i \sum \limits_{j=1}^i p_j ) = \\\sum\limits_{i=1}^n ( w_i \sum\limits_{j=i+1}^n p_j ) - \sum\limits_{i=1}^n w_i \sum \limits_{i=1}^n p_i = \\\sum\limits_{i=1}^n ( w_i \sum\limits_{j=i}^n p_j ) - \sum\limits_{i=1}^n w_i p_i - \sum\limits_{i=1}^n w_i \sum \limits_{i=1}^n p_i </tex>#: Заметим, что первое слагаемое соответствует целевой функции <tex> \sum w_i C_i </tex> для последовательности <tex> n \dots 1 </tex>, а второе и третье слагаемые — константы, зависящие только от начальных данных и не зависящие от перестановки работ. Таким образом, оптимальное значение для <tex> S' </tex> также минимизирует <tex> S </tex>, ч.т.д.==== R || Sum(C_i) ====
С помощью этого метода решаются:* Задачи класса [[Классификация задач|Open Shop]] при условии <tex>p_{ij}=1</tex> можно свести к задачам равной длительности на параллельных станках:*:[[Opij1Sumwc|<tex> O \mid p_{ij} =1 \mid \sum w_i C_i </tex>]]*:<tex> O \mid p_{ij} =1, r_i \mid C_{max} </tex> <ref>Peter Brucker «Scheduling Algorithms», fifth edition, Springer — с. 161</ref>* Задачи класса [[Классификация задач|Flow Shop]] при условии <tex>p_{ij}= O 1</tex> можно свести к задаче на одном станке:*:[[Fpij1sumwu| p_ij<tex> F \mid p_{ij} =1 \mid \sum w_i U_i </tex>]]* Часто в задачах, в которых допускаются прерывания, оптимальный ответ совпадает с соответствующими задачами без прерываний:*:<tex> P \mid pmtn \mid \sum w_i C_i </tex> <ref>Peter Brucker «Scheduling Algorithms», fifth edition, Springer — с. 121</ref>*:[[Flow shop| Sum(<tex> F2 \mid pmtn \mid C_{max} </tex>]]* Ряд задач можно свести к задаче поиска максимального потока:*:<tex> Q \mid pmtn, r_i\mid L_{max} </tex> <ref>Peter Brucker «Scheduling Algorithms», fifth edition, Springer — с. 129-133</ref>*:[[RSumCi|<tex> R \mid \mid \sum C_i </tex>]]* Некоторые задачи сводятся к другим похожим задачам теории расписаний путем преобразования их расписаний:*:[[1outtreesumwc|<tex> 1 \mid intree \mid \sum w_i C_i) </tex>]] == Построение расписания по нижней оценке ==Этот метод обычно применим к задачам, в которых целевая функция — <tex> C_{max}</tex>. Обычно построение расписания по нижней оценке происходит в два этапа:# Построение некоторого набора нижних ограничений на произвольное расписание для задачи <tex> S </tex>. # Построение произвольного допустимого расписания, достигающего максимального ограничения из построенного набора. С помощью этого метода решаются следующие задачи:* <tex> P \mid pmtn \mid C_{max}</tex> <ref>Peter Brucker «Scheduling Algorithms», fifth edition, Springer — с. 108</ref>* [[RpmtnCmax|<tex> R \mid pmtn \mid C_{max}</tex>]]* [[Opij1Cmax|<tex> O \mid p_{ij}=1 \mid C_{max}</tex>]]* [[QpmtnCmax|<tex> Q \mid pmtn \mid C_{max}</tex>]] Ниже будет рассмотрен частный пример решения задачи подобным образом:=== P | pmtn | C_max ==={{Задача|definition =Имеется <tex>m</tex> однородных машин, работающих параллельно, и <tex>n</tex> работ, которые могут быть прерваны и продолжены позже. Необходимо минимизировать время выполнения всех работ}} Найдем набор ограничений на значение <tex> C_{max} </tex> для произвольного допустимого расписания <tex> S </tex> : # В допустимом расписании выполнение всех работ не может завершиться раньше одной из них, поэтому <tex> C_{max} \geqslant p_i </tex>.# Если все станки работали время <tex> C_{max} </tex>, на них могло выполниться не больше <tex> C_{max} \cdot m </tex> работы, то есть <tex> \sum\limits_{i=1}^n p_i \leqslant C_{max} \cdot m </tex> и <tex> C_{max} \geqslant \dfrac1m \sum\limits_{i=1}^n p_i </tex>.Из этих ограничений следует, что <tex> C_{max} =\max {\left( \max\limits_{i=1 \cdots n} p_i,~ \dfrac1m \sum\limits_{i=1}^n p_i \right)} </tex>. Построим расписание, подходящее под эту границу: будем по очереди заполнять машины работами в произвольном порядке, и если очередная работа не помещается на текущей машине полностью, перенесем ее выходящую за <tex> C_{max} </tex> часть на следующую машину. Благодаря первому ограничению никакая работа не будет выполняться одновременно на двух станках, а благодаря второму — не останется работы, которую мы не сможем выполнить.
== Бинарный поиск по ответу ==
Этот способ часто подходит для задач, в которых надо минимизировать <tex>C_{max} </tex> (если мы умеем решать соответствующую задачу существования расписания), реже для <tex> \sum w_i U_i </tex>. Важно помнить, что если требуется полиномиальное по <tex> n </tex> решение, оно не должно зависеть от логарифма ответа, но иногда ответ ограничен полиномом от <tex>n</tex>, и мы можем применить этот метод.
Примером решения задач подобным методом служит следующая задача:
[[QpmtnriLmax|<tex> Q \mid pmtn, r_i \mid L_{max} </tex>]]
== Построение Жадное построение расписания по нижней оценке ==Этим методом обычно применим к задачамДля решения задач теории расписаний часто применяется [[Определение матроида|теория матроидо]]в, а в которых целевая функция — <tex> C_{max}</tex>. Построим какойчастности — [[Теорема Радо-то набор нижних ограничений Эдмондса (жадный алгоритм)|жадный алгоритм]]: алгоритм решения задач путем выбора локально оптимальных решений на произвольное расписание для задачи <tex> S </tex> и возьмем из них максимальноекаждом этапе алгоритма. Затем построим произвольное допустимое расписаниеЕстественно, достигающее этой оценкидалеко не все оптимизационные задачи можно решать жадно — для этого сначала необходимо доказать оптимальность жадного выбора.
С помощью этого метода решаются:
* [[Правило Лаулера|<tex> P 1 \mid pmtn prec \mid C_f_{max}</tex>]]* [[1outtreesumwc|<tex> R 1 \mid pmtn outtree \mid C_{max}\sum w_i C_i </tex>]]* [[1pi1sumwu|<tex> O 1 \mid p_{ij}p_i =1 \mid C_\sum w_i U_i </tex>]]* [[1sumu|<tex> 1 \mid \mid \sum U_i </tex>]] Обычно оптимальность жадного выбора доказывают двумя способами:  === Неправильно ===Приведем пример часто распространенных '''неправильных''' действий при доказательстве оптимальности жадного алгоритма: Пусть предложенным нами алгоритмом мы получили какое-то решение <tex> S </tex>. Атомарными изменениями в этом решении <tex> S </tex> будем получать другие допустимые решения <tex> S' </tex> и докажем, что <tex> f(S) \leqslant f(S') </tex>. Тогда решение <tex> S </tex> — оптимально. Проблема в этих рассуждениях в том, что ими мы доказываем локальную оптимальность алгоритма в решении <tex> S </tex>. Получение же глобального минимума может потребовать нескольких атомарных изменений в расписании, поэтому доказать оптимальность таким образом в общем случае невозможно. Как ближайшую аналогию, можно привести '''неправильное''' утверждение для произвольной функции <tex> f(\bar x) </tex> — «если все частные производные <tex> \dfrac{\partial f}{max\partial x_1} \dots \dfrac{\partial f}{\partial x_n}</tex>неотрицательны, то в точке <tex> \bar x </tex> наблюдается глобальный минимум». === Правильно ===При доказательстве оптимательности применима стратегия '''аргумент замены''' (англ. ''exchange argument''). Стратегия заключается в рассмотрении текущего решения <tex> S </tex> и оптимального решения <tex> O </tex>. Далее предлагается способ модификации <tex> O </tex> в <tex> O'</tex> так, что:# <tex> f(O') \leqslant f(O) </tex>, то есть <tex> O' </tex> также оптимально.# <tex> O' </tex> «более похоже» на <tex> S </tex>, чем на <tex> O </tex>.
=== Примеры ======= P | pmtn | C_max ====# В допустимом расписании выполнение всех работ не может завершиться раньше одной из них, поэтому <tex> T \ge p_i </tex>.# Если все станки работали время <tex> T </tex>такой способ найден, на них могло выполниться не больше <tex> Tm </tex> работыполучаем, что какой-то есть последовательностью модификаций <tex> O \sum\limits_i p_i \le Tm </tex> и <tex> T to O_t' \ge to \frac1m dots \sumto O_1' \limits_i p_i to S </tex>.# Тогда получим <tex> T_{min} = f(S) \max {leqslant f(O_1') \maxleqslant \limits_i p_i, dots \frac1m leqslant f(O_t') \sum\limits_i p_ileqslant f(O)} </tex>.Построим расписание, подходящее под эту границу: будем по очереди заполнять машины работами в произвольном порядке, и если очередная работа не помещается на текущей машине полностью, перенесем ее выходящую за из чего следует оптимальность <tex> T_{min} S </tex> часть на следующую машину. Благодаря первому ограничению никакая работа не будет выполняться одновременно на двух станках, а благодаря второму — не останется работы, которую мы не сможем выполнить.
==== O Отношение «более похоже» должно быть [[Отношение порядка | p_ij=1 | C_max ====# В допустимом расписании на каждом станке надо обработать каждую работу, поэтому отношением частичного строгого порядка]]. Часто в качестве него можно выбрать отношение «длина наибольшего общего префикса решения <tex> A </tex> и <tex> T \ge n S </tex>.# В допустимом расписании каждую работу нужно обработать на всех станках, причем ее нельзя обрабатывать на двух станках одновременно, поэтому меньше наибольшего общего префикса решения <tex> T \ge m B </tex>.# Тогда и <tex> T_{min} = \max {(m, n)} S </tex>Оптимальное расписание получается циклическими сдвигами последовательности ». Тогда если мы сможем увеличить длину наибольшего общего префикса для оптимального решения, не нарушив оптимальности, мы приблизимся к <tex> 1 \dots n S </tex> . Можно выбирать и выглядит следующим образом:* Для более сложные отношения, например, в доказательстве оптимальности алгоритма <tex> n < m P \mid \mid \sum w_i C_i </tex>: '''0 1 2 ... n-1 n n+1 ... m-1 m''' '''M_1''' 1 2 3 ... n-1 n - ... - - '''M_2''' - 1 2 ... n-2 n-1 n ... - - '''.''' ... ... ... ... ... ... ... ... ... ... '''M_m-1''' - - - ... ... ... ... ... n - '''M_m''' - - - ... ... ... ... ... n-1 n* Для для решения задачи <tex> n P \mid pmtn \mid \ge m sum w_i C_i </tex>: '''0 1 2 ... k k+1 ... n-1 n''' '''M_1''' 1 2 3 ... k k+1 ... n-1 n '''M_2''' n 1 2 ... k-1 k ... n-2 n-1 '''.''' ... ... ... ... ... ... ... ... ... '''.''' ... ... ... ... ... ... ... ... ... '''M_m''' n-m+2 n-m+3 ... ... ... ... ..используется отношение «время последнего прерывания больше или количество прерываний меньше». n-m n-m+1
== Бинарный поиск по ответу ==Этот способ часто подходит для задач, в которых надо минимизировать <tex> \sum w_i U_i </tex>См. Важно помнить, что если требуется полиномиальное по <tex> n </tex> решение, оно не должно зависеть от логарифма ответа, но иногда ответ ограничен полиномом от <tex>n</tex> (в частности, в <tex> \sum U_i </tex>), и мы можем применить этот методтакже.=== Примеры ======= O | p_ij = 1| Sum(U_i) ====Перенумеруем работы по возрастанию их дедлайнов, то есть <tex> d_1 \le d_2 \le \dots d_n </tex>.* [[Правило Лаулера]]{{Утверждение|statement=Если мы можем выполнить <tex> k </tex> каких-то работ, мы можем выполнить <tex> k </tex> последних работ.* [[Flow shop]]* [[Opi1sumu|proof=Действительно, если в допустимом расписании все периоды выполнения <tex> t_{iq} </tex> работы <tex> i </tex> заменить на периоды выполнения работы <tex> j > i </tex>, оно останется допустимым, так как <tex> t_{iq} \le d_i \le d_j </tex>.}}Таким образом, будем брать последние <tex> k </tex> работ и пытаться составить из них допустимое расписание (для этого известен полиномиальный алгоритм<ref>P. Brucker. Scheduling Algorithms (2006), 5th edition, p. 163 </ref>). Получили решение за <tex> O(\log n \cdot T_{exists}(n)) </tex>, где <tex> T_{exists} </tex> — время решения задачи <tex> O \mid p_{ij}=1, d_i \mid - \sum U_i</tex>.]]
== Жадное построение расписания Примечания ===== Примеры ======= 1 | prec | f_max ====<references/>
== Источники информации == 1 | outtree | Sum(w_i C_i) ====* Peter Brucker «Scheduling Algorithms», fifth edition, Springer ISBN 978-3-540-69515-8
[[Категория: Дискретная математика Алгоритмы и алгоритмыструктуры данных]]
[[Категория: Теория расписаний]]
Анонимный участник

Навигация