1ripippmtnsumwu — различия между версиями
Swanwarp (обсуждение | вклад) м |
Swanwarp (обсуждение | вклад) (→Псевдокод) |
||
Строка 81: | Строка 81: | ||
<tex>W_1(t_u, t_v, 1) = w_1</tex> | <tex>W_1(t_u, t_v, 1) = w_1</tex> | ||
− | '''for''' <tex>k = | + | '''for''' <tex>k = 2</tex> '''to''' <tex>n</tex> |
'''for''' <tex>m = 1</tex> '''to''' <tex>n</tex> | '''for''' <tex>m = 1</tex> '''to''' <tex>n</tex> | ||
− | '''foreach''' <tex>t_u, t_v \in \Theta | + | '''foreach''' <tex>t_u, t_v \in \Theta \mid t_u \leqslant t_v</tex> |
'''if''' <tex>r_k \not\in [t_u, t_v)</tex> | '''if''' <tex>r_k \not\in [t_u, t_v)</tex> | ||
<tex>W_k (t_u, t_v, m) \leftarrow W_{k - 1} (t_u, t_v, m)</tex> | <tex>W_k (t_u, t_v, m) \leftarrow W_{k - 1} (t_u, t_v, m)</tex> | ||
Строка 90: | Строка 90: | ||
<tex>W_k (t_u, t_v, m) \leftarrow \max(W_{k - 1} (t_u, t_v, m), W'_k\})</tex> | <tex>W_k (t_u, t_v, m) \leftarrow \max(W_{k - 1} (t_u, t_v, m), W'_k\})</tex> | ||
− | '''return''' <tex>W_n(\min\limits_{t \in \Theta} (t - p), \max\limits_{t \in \Theta} (t), n)</tex> | + | '''return''' <tex>\max\limits_{i \in [1, \dots, n]}(W_n(\min\limits_{t \in \Theta} (t - p), \max\limits_{t \in \Theta} (t), i))</tex> |
+ | |||
+ | === Оценка алгоритма === | ||
+ | Заметим, что множество <tex>\Theta</tex> содержит не более <tex>n^2</tex> элементов. Следовательно, цикл по <tex>t_u, t_v</tex> итерируется <tex>O(n^4)</tex> раз. Внутри этого цикла мы тратим <tex>O(n^4)</tex> времени на подсчет <tex>W'_k</tex>, так как зная <tex>t_x, m_1</tex> и <tex>m_2</tex> мы можем посчитать <tex>t_y</tex> и <tex>m_3</tex>. Также алгоритм использует шестимерный массив для хранения <tex>W_k (t_u, t_v, m)</tex>. Таким образом, учитывая итерации алгоритма по <tex>k</tex> и <tex>m</tex>, нам потребуется <tex>O(n^{10})</tex> времени и <tex>O(n^6)</tex> памяти для работы алгоритма. | ||
== См. также == | == См. также == |
Версия 21:31, 5 июня 2016
Задача: |
Дано | работ и 1 станок. Для каждой работы известны её время появления и вес , а также дедлайн . Время выполнения всех работ равно . Каждую работу можно прервать и продолжить ее выполнение в любой момент времени. Требуется выполнить все работы, чтобы значение (суммарный вес просроченных работ) было минимальным.
Содержание
Решение
Постановка цели
Необходимо найти выполнимое множество работ динамического программирования. Предполагается, что работы отсортированы в порядке неубывания дедлайна.
такое, что его суммарный вес максимален. Эта проблема решается с помощьюJackson Preemptive Schedule
- это алгоритм построения расписания работ для одной машины с прерываниями. Пусть у нас есть множества работ , для которых надо составить расписание, и множество , которое состоит из работ, доступных для выполнения на данный момент. Возможны два случая:
- Если машина освободилась, то вставляем в расписание работу с наименьшим . Также удалим из .
- Если машина занята работой и в момент времени появилась работа , тогда если , то прервем и поставим на выполнение , а добавим в . В противном случае просто добавим в .
Можно заметить что, если работа была вставлена в
после своего дедлайна, то данное множество работ не является выполнимым. Таким образом, решение задачи сводится к нахождению такого множества работ , которое будет выполнимым по и чей вес будет максимален.Лемма: |
Пусть . Тогда время начала и время окончания этой работы в будет принадлежать . |
Доказательство: |
Сначала докажем лемму для . Пусть - минимальная временная точка такая, что между и не простаивает. По структуре . Работы, которые выполняются между и , не могут выполняться ни до , ни после , даже частично. Это следует из структуры - если работа была прервана работой , то после выполнения мы снова вставляем в расписание . Таким образом, делится на . Возможны следующие два случая:
В любом из этих двух случаев есть такое , такое что не простаивает между и . Тогда делится на . Следовательно, не превышает , так как не простаивает. Поэтому .
|
Динамика
Определение: |
|
Лемма: |
|
Доказательство: |
Если , то работа не может быть поставлена ни в какой такой, что от разрешимо и . Тогда, очевидно, что
|
Псевдокод
Отсортировать работы поforeach if for to for to foreach if else Подсчитать по формуле из леммы return
Оценка алгоритма
Заметим, что множество
содержит не более элементов. Следовательно, цикл по итерируется раз. Внутри этого цикла мы тратим времени на подсчет , так как зная и мы можем посчитать и . Также алгоритм использует шестимерный массив для хранения . Таким образом, учитывая итерации алгоритма по и , нам потребуется времени и памяти для работы алгоритма.См. также
Источники информации
Philippe Baptiste - Polynomial Time Algorithms for Minimizing the Weighted Number of Late Jobs on a Single Machine with Equal Processing Times