1ripippmtnsumwu — различия между версиями
Swanwarp (обсуждение | вклад) (→Динамика) |
Swanwarp (обсуждение | вклад) (→Динамика) |
||
| Строка 71: | Строка 71: | ||
Исходя из двух неравенств доказанных выше, можно получить требуемое равенство <tex>W_k(t_u, t_v, m) = \max(W_{k-1}(t_u, t_v, m), W'_k).</tex> Лемма доказана. | Исходя из двух неравенств доказанных выше, можно получить требуемое равенство <tex>W_k(t_u, t_v, m) = \max(W_{k-1}(t_u, t_v, m), W'_k).</tex> Лемма доказана. | ||
}} | }} | ||
| + | |||
| + | === Псевдокод === | ||
| + | |||
| + | Отсортировать работы по <tex>d_i</tex> | ||
| + | <tex>fill(W, -\infty)</tex> | ||
| + | |||
| + | '''foreach''' <tex>t_u, t_v \in \Theta \mid t_u \leqslant t_v</tex> | ||
| + | '''if''' <tex>p \leqslant (\min(d_1,t_v)-\max(r_1,t_u))</tex> | ||
| + | <tex>W_1(t_u, t_v, 1) = w_1</tex> | ||
| + | |||
| + | '''for''' <tex>k = 1</tex> '''to''' <tex>n</tex> | ||
| + | '''for''' <tex>m = 1</tex> '''to''' <tex>n</tex> | ||
| + | '''foreach''' <tex>t_u, t_v \in \Theta, m \in [1, n] \mid t_u \leqslant 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> | ||
| + | '''else''' | ||
| + | <tex>W'_k \leftarrow </tex> Подсчитать <tex>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> | ||
== См. также == | == См. также == | ||
Версия 21:09, 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