Методы решения задач теории расписаний — различия между версиями
(→1 | intree | Sum(w_i C_i)) |
|||
Строка 11: | Строка 11: | ||
Утверждается, что решив соответствующую задачу <tex> S' </tex> и развернув полученное расписание, мы получим ответ для текущей задачи. | Утверждается, что решив соответствующую задачу <tex> S' </tex> и развернув полученное расписание, мы получим ответ для текущей задачи. | ||
# Полученное расписание будет допустимым, так как расписание для <tex> S' </tex> было допустимым, и в нем никакие две работы не пересекались и не прерывались. Развернув, мы не могли нарушить это свойство. Также из-за того, что мы развернули расписание, мы добились того, что все работы выполняются в правильном порядке (в расписании для <tex> S' </tex> из-за того, что расписание было развернуто, порядок был нарушен для всех работ). Таким образом, получили что расписание — допустимое. | # Полученное расписание будет допустимым, так как расписание для <tex> S' </tex> было допустимым, и в нем никакие две работы не пересекались и не прерывались. Развернув, мы не могли нарушить это свойство. Также из-за того, что мы развернули расписание, мы добились того, что все работы выполняются в правильном порядке (в расписании для <tex> S' </tex> из-за того, что расписание было развернуто, порядок был нарушен для всех работ). Таким образом, получили что расписание — допустимое. | ||
− | # Пусть с помощью задачи <tex> S' </tex> мы получили последовательность работ <tex> 1 \dots n </tex> (не теряя общности, занумеруем их от 1 до n). Распишем по определению значение целевой функции для <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 ) = \\ | #: <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+1}^n p_j ) - \sum\limits_{i=1}^n w_i \sum \limits_{i=1}^n p_i = \\ | ||
Строка 17: | Строка 17: | ||
#: Заметим, что первое слагаемое соответствует целевой функции <tex> \sum w_i C_i </tex> для последовательности <tex> n \dots 1 </tex>, а второе и третье слагаемые — константы, зависящие только от начальных данных и не зависящие от перестановки работ. Таким образом, оптимальное | #: Заметим, что первое слагаемое соответствует целевой функции <tex> \sum w_i C_i </tex> для последовательности <tex> n \dots 1 </tex>, а второе и третье слагаемые — константы, зависящие только от начальных данных и не зависящие от перестановки работ. Таким образом, оптимальное | ||
значение для <tex> S' </tex> также минимизирует <tex> S </tex>, ч.т.д. | значение для <tex> S' </tex> также минимизирует <tex> S </tex>, ч.т.д. | ||
+ | |||
==== R || Sum(C_i) ==== | ==== R || Sum(C_i) ==== | ||
Версия 16:01, 26 апреля 2012
Содержание
Сведение к другой задаче
При сведении текущей задачи теории расписаний
к какой-то другой необходимо доказать два пункта:- Допустимость расписания, построенного с помощью задачи , или существование способа его трансформации в допустимое.
- Следствие того, что если мы оптимизируем , мы также оптимизируем ответ для (обратное в общем случае неверно).
Примечание — если требуется полиномиальное время для решения задачи, требуется, чтобы сведение к другой задаче и трансформация расписания в допустимое также происходили за полиномиальное время.
Примеры
1 | intree | Sum(w_i C_i)
Предположим, что мы уже умеем решать задачу [1]. Сведем нашу задачу к ней следующим образом:
- Развернем все ребра, теперь если работа зависела от работы , работа будет зависеть от .
- Заменим все стоимости на противоположные .
Утверждается, что решив соответствующую задачу
и развернув полученное расписание, мы получим ответ для текущей задачи.- Полученное расписание будет допустимым, так как расписание для было допустимым, и в нем никакие две работы не пересекались и не прерывались. Развернув, мы не могли нарушить это свойство. Также из-за того, что мы развернули расписание, мы добились того, что все работы выполняются в правильном порядке (в расписании для из-за того, что расписание было развернуто, порядок был нарушен для всех работ). Таким образом, получили что расписание — допустимое.
- Пусть с помощью задачи
- Заметим, что первое слагаемое соответствует целевой функции для последовательности , а второе и третье слагаемые — константы, зависящие только от начальных данных и не зависящие от перестановки работ. Таким образом, оптимальное
мы получили последовательность работ (не теряя общности, занумеруем их от 1 до n). Распишем по определению значение целевой функции для :
значение для
также минимизирует , ч.т.д.R || Sum(C_i)
O | p_ij=1 | Sum(C_i)
Построение расписания по нижней оценке
Этим методом обычно применим к задачам, в которых целевая функция —
. Построим какой-то набор нижних ограничений на произвольное расписание для задачи и возьмем из них максимальное. Затем построим произвольное допустимое расписание, достигающее этой оценки.С помощью этого метода решаются:
Примеры
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)
Перенумеруем работы по возрастанию их дедлайнов, то есть
.Утверждение: |
Если мы можем выполнить каких-то работ, мы можем выполнить последних работ. |
Действительно, если в допустимом расписании все периоды выполнения | работы заменить на периоды выполнения работы , оно останется допустимым, так как .
Таким образом, будем брать последние [2]). Получили решение за , где — время решения задачи .
работ и пытаться составить из них допустимое расписание (для этого известен полиномиальный алгоритм