Методы решения задач теории расписаний — различия между версиями
(→O | p_ij = 1| Sum(U_i)) |
(→Жадное построение расписания) |
||
Строка 95: | Строка 95: | ||
== Жадное построение расписания == | == Жадное построение расписания == | ||
+ | {{Определение | ||
+ | |definition= | ||
+ | '''Жадный алгоритм''' — алгоритм, в котором локальные оптимизации ответа достигают глобальнового оптимума. | ||
+ | }} | ||
+ | |||
+ | Естественно, далеко не все оптимизационные задачи можно решать жадно — для этого сначала необходимо доказать оптимальность жадного выбора. Обычно это делают двумя способами: | ||
+ | |||
+ | === Неправильно === | ||
+ | Приведем пример часто распространенных '''неправильных''' действий при доказательстве оптимальности жадного алгоритма: | ||
+ | |||
+ | Пусть предложенным нами алгоритмом мы получили какое-то решение <tex> S </tex>. Атомарными изменениями в этом решении <tex> S </tex> будем получать другие допустимые решения <tex> S' </tex> и докажем, что <tex> f(S) \le f(S') </tex>. Тогда решение <tex> S </tex> — оптимально. | ||
+ | |||
+ | Проблема в этих рассуждениях в том, что ими мы доказываем локальную оптимальность алгоритма в решении <tex> S </tex>. Получение же глобального минимума может потребовать нескольких атомарных изменений в расписании, поэтому доказать оптимальность таким образом в общем случае невозможно. Как ближайшую аналогию, можно привести '''неправильное''' утверждение для произвольной функции <tex> f(\bar x) </tex> — «если все частные производные <tex> \frac{\partial f}{\partial x_1} \dots \frac{\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') \le f(O) </tex>, то есть <tex> O' </tex> также оптимально. | ||
+ | # <tex> O' </tex> «более похоже» на <tex> S </tex>, чем на <tex> O </tex>. | ||
+ | |||
+ | Если такой способ найден, получаем, что какой-то последовательностью модификаций <tex> O \to O_t' \to \dots \to O_1' \to S </tex> получим <tex> f(S) \le f(O_1') \le \dots \le f(O_t') \le f(O) </tex>, из чего следует оптимальность <tex> S </tex>. | ||
+ | |||
+ | Отношение «более похоже» должно быть [[Отношение порядка | отношением частичного строгого порядка]]. Часто в качестве него можно выбрать отношение «длина наибольшего общего префикса решения <tex> A </tex> и <tex> S </tex> меньше наибольшего общего префикса решения <tex> B </tex> и <tex> S </tex>». Тогда если мы сможем увеличить длину наибольшего общего префикса для оптимального решения, не нарушив оптимальности, мы приблизимся к <tex> S </tex>. Можно выбирать и более сложные отношения, например, в доказательстве оптимальности алгоритма <tex> P \mid \mid \sum w_i C_i </tex> для решения задачи <tex> P \mid pmtn \mid \sum w_i C_i </tex> используется отношение «время последнего прерывания больше или количество прерываний меньше». | ||
+ | |||
=== Примеры === | === Примеры === | ||
==== 1 | prec | f_max ==== | ==== 1 | prec | f_max ==== | ||
+ | Дано множество работ <tex> J </tex> размера <tex> n </tex>, для которых заданы отношения предшествования, нужно минимизировать <tex> f_{max} = \max\limits_i f_i(C_i) </tex>, где <tex> f_i</tex> — монотонно неубывают по времени завершения работы <tex> i </tex>. | ||
+ | |||
+ | Приведем алгоритм решения и докажем его оптимальность: | ||
+ | # Пусть <tex> U \subseteq J </tex> — множество еще не назначенных работ. Пусть <tex> p(U) = \sum\limits_{i \in U} p_i </tex>. | ||
+ | # Назначим работу <tex> j \in U </tex>, у которой нет потомков в <tex> U </tex> и с минимальным значением <tex> f_j(p(U)) </tex> последней работой в <tex> U </tex>. | ||
+ | |||
+ | {{Теорема | ||
+ | |statement= | ||
+ | Предложенный алгоритм оптимален. | ||
+ | |proof= | ||
+ | Не теряя общности, пронумеруем работы в расписании, построенном нашим алгоритмом, от <tex> 1 </tex> до <tex> n </tex>. Пусть <tex> \pi(1) \dots \pi(n) </tex> — оптимальная последовательность работ такая, что наибольший общий суффикс их расписаний — максимален (пусть они впервые различаются в позиции <tex> r </tex>). Получили, следующую ситуацию: | ||
+ | |||
+ | pi: ... ... r-1 k .... j r r+1 ... n | ||
+ | |||
+ | Докажем, что можно привести это расписание к оптимальному расписанию с большим общим суффиксом. Заметим, что если выполнить работу r-1 прямо перед r, расписание все еще будет допустимым (несмотря на еще не доказанную оптимальность, наш алгоритм строит только допустимые расписания, а в построенном нами расписании r-1 стояло прямо перед r). По оптимальному расписанию j выполняется непосредственно перед r. Таким образом, у работ j и r нет ни одного потомка в можестве работ 1, 2.. r-2, r-1. По построенной нашим алгоритмом последовательности 1..n мы получаем, что <tex> f_{r-1}(\sum\limits_{i}^{r-1} p_i) \le f_j(\sum\limits_{i}^{r-1}) </tex> (иначе мы бы поставили последней на тот момент работу j, а не r). Сдвинем в последовательности <tex> \pi </tex> работы k .. j влево на одну позицию, а работу r-1 поместим перед r. Так как после сдвига влево, <tex>f_k \dots f_j </tex> не могли увеличиться, максимум так же не мог увеличиться. Следовательно, оптимальная последовательность <tex> \pi </tex> имела не самый длинный общий суффикс, что противоречит её выбору. | ||
+ | }} | ||
== Примечания == | == Примечания == |
Версия 10:30, 27 апреля 2012
Содержание
Сведение к другой задаче
При сведении текущей задачи теории расписаний
к какой-то другой (не обязательно задаче теории расписаний) необходимо доказать два пункта:- Допустимость расписания, построенного с помощью задачи , или существование способа его трансформации в допустимое без нарушения оптимальности.
- Следствие того, что если мы оптимизируем , мы также оптимизируем ответ для (обратное в общем случае неверно).
Примечание — если требуется полиномиальное время для решения задачи, требуется, чтобы сведение к другой задаче и трансформация расписания в допустимое также происходили за полиномиальное время.
Примеры
1 | intree | Sum(w_i C_i)
Предположим, что мы уже умеем решать задачу [1]. Сведем нашу задачу к ней следующим образом:
- Развернем все ребра, теперь если работа зависела от работы , работа будет зависеть от .
- Заменим все стоимости на противоположные .
Утверждается, что решив соответствующую задачу
и развернув полученное расписание, мы получим ответ для текущей задачи.- Полученное расписание будет допустимым, так как расписание для было допустимым, и в нем никакие две работы не пересекались и не прерывались. Развернув, мы не могли нарушить это свойство. Также из-за того, что мы развернули расписание, мы добились того, что все работы выполняются в правильном порядке (в расписании для из-за того, что расписание было развернуто, порядок был нарушен для всех работ). Таким образом, получили что расписание — допустимое.
- Пусть с помощью задачи
- Заметим, что первое слагаемое соответствует целевой функции для последовательности , а второе и третье слагаемые — константы, зависящие только от начальных данных и не зависящие от перестановки работ. Таким образом, оптимальное значение для также минимизирует , ч.т.д.
мы получили последовательность работ (не теряя общности, занумеруем их от 1 до n). Распишем по определению значение целевой функции для :
R || Sum(C_i)
В этой задаче дано
работ и машин, причем для каждой машины длительность выполнения на ней -й работы своя и равна .Рассмотрим произвольное допустимое расписание для этой задачи. Рассмотрим какую-то машину
, пусть на ней выполняется работ. Тогда вклад этой машины в целевую функцию (не теряя общности, пронумеруем работы на этой машине от до ) рассчитывается как:
Заметим, что в каждом допустимом расписании перед каждой работой окажется коэффициент
, означающий, что соответствующая работа выпллняется -й с конца. Понятно, что в различных расписаниях может принимать значения от до .Сведем задачу к назначению каждой работы mincost-maxflow. Поместим в левую долю графа работы, в правую долю — пары из машины и коэффициента и проведем соответствующие ребра пропускной способности и стоимости , соответствующие вкладу работы в целевую функцию, если она окажется в позиции с конца на машине . Проведем из стока в левую долю ребра стоимости и пропускной способности , из правой доли в сток — также ребра стоимости и пропускной способности . Найдем в этой сети максимальный поток минимальной стоимости. Утверждается, что если ребро насыщено потоком, то работа в оптимальном расписании должна стоять на машине в позиции с конца.
позиции с конца на машине с помощью задачи- Целевые функции задачи mincost-maxflow и текущей задачи совпадают, так как у ребер между долями пропускная способность 1, а у дополнительных ребер из истока и в сток нулевая стоимость, и они не могут внести вклад в целевую функцию.
- Расписание, построенное по вышепредставленному способу действительно будет допустимым.
- Благодаря ограничениям на поток, входящий в левую долю, каждая работа будет назначена только один раз.
- Благодаря ограничениям на поток, выходящий из правой доли, на каждую позицию будет назначено не более одной работы.
- Докажем, что не возникает ситуации такой, что существует такая позиция , что в этой позиции с конца стоит какая-то работа, а в позиции с конца — нет (это противоречит определению -й с конца работы). Такая ситуация означает, что ребро оказалось насышено потоком, а ребро — не насыщено. Но стоимость ребра меньше стоимости ребра , поэтому можем переместить поток с ребра на ребро , не нарушив свойства потока и улучшив целевую функцию, что противоречит оптимальности ответа для mincost-maxflow. Следовательно, такой позиции не возникнет и расписание будет допустимым.
O | p_ij=1 | Sum(w_i C_i)
Докажем, что оптимальный ответ для
равен оптимальному ответу к задаче , где прерывания позволено делать только в целые моменты времени.- Целевые функции задач совпадают, поэтому из оптимальности следует оптимальность .
- Покажем, как получить из расписания
- Построим двудольный граф, в левую долю которого поместим работы, а в правую — возможные моменты времени. Из вершины, соответствующей работе будет идти ребро в вершину, соответствующую временному моменту , если работа в расписании для претендует на выполнение в момент времени .
- Раскрасим ребра этого графа в цветов, из теории графов известно, что это можно сделать.
- Назначим выполнение единичного элемента работы в момент времени на машине , если соответствующее ребро раскрашено в цвет .
- После данного преобразования мы не изменим значение целевой функции (так как мы переставляем только элементы работ, выполняющихся в один и тот же момент времени). Также расписание станет допустимым для , так как по определению реберной раскраски, не будет ни одной работы, два единичных блока которых выполняется на одной машине и во все моменты времени не окажется того, что на одну машину назначено две работы.
допустимое расписание для (в расписании для допустимость нарушает то, что на одной машине выполняется несколько блоков одной работы):
Чтобы непосредственно решить эту задачу, воспользуемся теоремой о том, что для задачи [2]. Известно, что для того, чтобы получить оптимальное расписание для такой задачи без прерываний, надо помещать работы по очереди на машины в порядке убывания весов. Длительности у всех работ совпадают, поэтому расписание будет состоять из блоков по работ и, возможно, одного неполного блока из работ. Таким образом, аналогично задаче , чтобы получить допустимое расписание, можно не строить раскраску графа, а просто циклически сдвигать последовательности работ внутри каждого блока, что позволяет достичь асимптотики .
существует оптимальное расписание без прерыванийМетод сведения задачи к задаче на параллельных машинах также работает для некоторых других open-shop задач.
Построение расписания по нижней оценке
Этот метод обычно применим к задачам, в которых целевая функция —
. Построим какой-то набор нижних ограничений на произвольное расписание для задачи и возьмем из них максимальное. Затем построим произвольное допустимое расписание, достигающее этой оценки.С помощью этого метода решаются:
Примеры
P | pmtn | C_max
- В допустимом расписании выполнение всех работ не может завершиться раньше одной из них, поэтому .
- Если все станки работали время , на них могло выполниться не больше работы, то есть и .
- Тогда .
Построим расписание, подходящее под эту границу: будем по очереди заполнять машины работами в произвольном порядке, и если очередная работа не помещается на текущей машине полностью, перенесем ее выходящую за
часть на следующую машину. Благодаря первому ограничению никакая работа не будет выполняться одновременно на двух станках, а благодаря второму — не останется работы, которую мы не сможем выполнить.O | p_ij=1 | C_max
- В допустимом расписании на каждом станке надо обработать каждую работу, поэтому .
- В допустимом расписании каждую работу нужно обработать на всех станках, причем ее нельзя обрабатывать на двух станках одновременно, поэтому .
- Тогда
Оптимальное расписание получается циклическими сдвигами последовательности
и выглядит следующим образом:- Для :
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
- Для :
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
Бинарный поиск по ответу
Этот способ часто подходит для задач, в которых надо минимизировать
. Важно помнить, что если требуется полиномиальное по решение, оно не должно зависеть от логарифма ответа, но иногда ответ ограничен полиномом от (в частности, в ), и мы можем применить этот метод.Примеры
O | p_ij = 1| Sum(U_i)
Перенумеруем работы по возрастанию их дедлайнов, то есть
.Утверждение: |
Если мы можем выполнить каких-то работ, мы можем выполнить последних работ. |
Действительно, если в допустимом расписании все периоды выполнения | работы заменить на периоды выполнения работы , оно останется допустимым, так как .
Таким образом, будем брать последние [3]). Получили решение за .
работ и пытаться составить из них допустимое расписание (для этого известен полиномиальный алгоритм заЖадное построение расписания
Определение: |
Жадный алгоритм — алгоритм, в котором локальные оптимизации ответа достигают глобальнового оптимума. |
Естественно, далеко не все оптимизационные задачи можно решать жадно — для этого сначала необходимо доказать оптимальность жадного выбора. Обычно это делают двумя способами:
Неправильно
Приведем пример часто распространенных неправильных действий при доказательстве оптимальности жадного алгоритма:
Пусть предложенным нами алгоритмом мы получили какое-то решение
. Атомарными изменениями в этом решении будем получать другие допустимые решения и докажем, что . Тогда решение — оптимально.Проблема в этих рассуждениях в том, что ими мы доказываем локальную оптимальность алгоритма в решении
. Получение же глобального минимума может потребовать нескольких атомарных изменений в расписании, поэтому доказать оптимальность таким образом в общем случае невозможно. Как ближайшую аналогию, можно привести неправильное утверждение для произвольной функции — «если все частные производные неотрицательны, то в точке наблюдается глобальный минимум».Правильно
Правильная стратегия(агрумент обмена, exchange argument) заключаются в рассмотрении текущего решения
и оптимального решения . Далее предлагается способ модификации в так, что:- , то есть также оптимально.
- «более похоже» на , чем на .
Если такой способ найден, получаем, что какой-то последовательностью модификаций
получим , из чего следует оптимальность .Отношение «более похоже» должно быть отношением частичного строгого порядка. Часто в качестве него можно выбрать отношение «длина наибольшего общего префикса решения и меньше наибольшего общего префикса решения и ». Тогда если мы сможем увеличить длину наибольшего общего префикса для оптимального решения, не нарушив оптимальности, мы приблизимся к . Можно выбирать и более сложные отношения, например, в доказательстве оптимальности алгоритма для решения задачи используется отношение «время последнего прерывания больше или количество прерываний меньше».
Примеры
1 | prec | f_max
Дано множество работ
размера , для которых заданы отношения предшествования, нужно минимизировать , где — монотонно неубывают по времени завершения работы .Приведем алгоритм решения и докажем его оптимальность:
- Пусть — множество еще не назначенных работ. Пусть .
- Назначим работу , у которой нет потомков в и с минимальным значением последней работой в .
Теорема: |
Предложенный алгоритм оптимален. |
Доказательство: |
Не теряя общности, пронумеруем работы в расписании, построенном нашим алгоритмом, от до . Пусть — оптимальная последовательность работ такая, что наибольший общий суффикс их расписаний — максимален (пусть они впервые различаются в позиции ). Получили, следующую ситуацию:pi: ... ... r-1 k .... j r r+1 ... nДокажем, что можно привести это расписание к оптимальному расписанию с большим общим суффиксом. Заметим, что если выполнить работу r-1 прямо перед r, расписание все еще будет допустимым (несмотря на еще не доказанную оптимальность, наш алгоритм строит только допустимые расписания, а в построенном нами расписании r-1 стояло прямо перед r). По оптимальному расписанию j выполняется непосредственно перед r. Таким образом, у работ j и r нет ни одного потомка в можестве работ 1, 2.. r-2, r-1. По построенной нашим алгоритмом последовательности 1..n мы получаем, что (иначе мы бы поставили последней на тот момент работу j, а не r). Сдвинем в последовательности работы k .. j влево на одну позицию, а работу r-1 поместим перед r. Так как после сдвига влево, не могли увеличиться, максимум так же не мог увеличиться. Следовательно, оптимальная последовательность имела не самый длинный общий суффикс, что противоречит её выбору. |