1ripmtnsumwu

Материал из Викиконспекты
Перейти к: навигация, поиск

[math]1 \mid r_i, pmtn \mid \sum w_{i}U_{i}[/math]


Задача:
Дана задача на нахождение расписания:
  1. У нас есть несколько работ, которе необходимо выполнит на одном станке.
  2. У работ есть время появления [math]r_i[/math]
  3. Работы разрешается прерывать в любой момент времени.
  4. Все значения целочисленны, веса [math]w_{i}[/math] положительны.
Требуется выполнить все работы, чтобы значение [math]\sum w_i U_i[/math] (суммарный вес просроченных работ) было минимальным.


Описание алгоритма

Идея

Пусть работы заданы в порядке неубывания их дедлайнов, то есть [math]d_1 \leqslant d_2 \leqslant \ldots \leqslant d_n[/math]. За [math]k[/math] обозначим количество различных [math]r_{i}[/math].

Назовем множество работ [math]S[/math] выполнимым (англ. feasible), если существует такое расписание для работ из [math]S[/math], что все работы будут выполнены без опозданий. Чтобы проверить, является ли множество работ выполнимым, воспользуемся упрощенной версией EDD правила (см. стр 70 в Брукере):

Составим расписание работ таким образом, чтобы первой в расписании стояла работа с наименьшим значением [math]r_{i}[/math]. В любой момент времени, когда появляется новая работа, либо заканчивает выполняться текущая, вставим в расписание работу с наименьшим оставшимся сроком.

[math]S[/math] выполнимо тогда и только тогда, когда все работы в EDD расписании выполняются без опозданий. Это прямое следствие из уже теоремы 4.4 (Брукер). Если в [math]S[/math] содержится [math]n[/math] работ, то построение EDD расписание может быть выполнено за [math]O(n \log n)[/math] времени. Наша задача сводится к тому, чтобы найти выполнимое множество работ с максимальным суммарным весом.

Для данного непустого множества [math]S[/math] определим следующие величины:

[math]r(S) = \min\limits_{i \in S} r_{i} ; p(S) = \sum\limits_{i \in S} p_{i}; w(S) = \sum\limits_{i \in S} w_{i}[/math]

Кроме того, обозначим за [math]C(S)[/math] время последней выполненной работы из [math]S[/math] в EDD расписании. Оно состоит из периодов непрерывного выполнения работы, разделенных периодами бездействия, когда нет доступных работ для выполнения. Это означает, что [math]S[/math] может быть разделено на множества [math]S_{1} \ldots S_{x}[/math], для которых выполняется [math]C(S_{i}) = r(S_{i}) + p(S_{i}) \lt r(S_{i + 1})[/math] для [math]i = 1 \ldots x - 1 [/math].

Выполнимое множество [math]S[/math] является блоком (англ. block), если работы из [math]S[/math] обрабатываются непрерывно с начала и до конца, и [math]S[/math] не может быть разделен на подмножества, расписания для которых не пересекаются, например, если [math]C(S) = r(S)+ p(S)[/math] и [math]S[/math] не является объединением [math]S_{1}[/math] и [math]S_{2}[/math] таких, что [math]C(S_{1}) \lt r(S_{2})[/math]. Решим задачу [math]1 \mid r_i, pmtn \mid \sum w_{i}U_{i}[/math] методами динамического программирования.

Введем величину [math]C_{i}(r, w) = \min \{C(S) \mid S \subseteq \{ 1 \ldots i \} [/math] — выполнимое[math]; r(S) \geqslant r; w(S) \geqslant w \}[/math] и [math]C_{i}(r, w) = \infty[/math], если множеств, удовлетворяющих условиям, нет.

Максимальный вес выполнимого множества задается максимальным значением [math]w[/math] такого, что [math]C_{n}(r_{\min}, w[/math] конечно, где [math]r_{\min} = \min\limits_{j = 1 \ldots n} r_{i}[/math]. Посчитаем значения [math]C_{j}(r, w)[/math] за [math]n[/math] итераций с начальными значениями

[math]C_{0}(r, 0) = 0[/math] для всех [math]r[/math]
[math]C_{0}(r, w) = \infty[/math] для всех [math]r[/math] и [math]w \gt 0[/math]

[math]j[/math] не может содержаться в выполнимом множестве, если [math]r(S) \gt r_{j}[/math]. Следовательно,

[math]C_{j}(r, w) \left \{\begin{array}{ll} = C_{j - 1}(r, w) & \text{if } r \gt r_{j} \\ \leqslant C_{j - 1}(r, w), & \text{otherwise} \end{array} \right. [/math]

Отсюда следует, что нам нужно посчитать только такие значения [math]C_{j} (r, w)[/math] для которых [math]r \leqslant r_{j}[/math]. Пусть [math] S \subseteq \{ 1 \ldots j \} [/math] и [math]C_{j}(r, w) = C(S)[/math]. Если [math]j \notin S[/math], тогда [math]C_{j}(r, w) = C_{j - 1}(r, w)[/math]. Иначе рассмотрим два случая.

Источники информации

  • Peter Brucker «Scheduling Algorithms», fifth edition, Springer — с. 88-93 ISBN 978-3-540-69515-8