Редактирование: 1ripippmtnsumwu
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 1: | Строка 1: | ||
− | <tex dpi=200> 1 \mid r_i,p_i=p | + | <tex dpi=200> 1 \mid r_i,p_i=p \mid \sum w_i U_i</tex> |
{{Задача | {{Задача | ||
Строка 8: | Строка 8: | ||
== Решение == | == Решение == | ||
− | Необходимо найти выполнимое множество работ <tex>O</tex> такое, что его суммарный вес <tex>\sum \limits_{i \in | + | === Постановка цели === |
+ | |||
+ | Необходимо найти выполнимое множество работ <tex>O</tex> такое, что его суммарный вес <tex>\sum \limits_{i \in X} w_i</tex> максимален. Эта проблема решается с помощью [[Динамическое программирование | динамического программирования]]. | ||
Предполагается, что работы отсортированы в порядке неубывания дедлайна. | Предполагается, что работы отсортированы в порядке неубывания дедлайна. | ||
− | === | + | === Jackson Preemptive Schedule === |
− | Пусть у нас есть множества работ <tex>O</tex>, для которых надо составить расписание. Возможны два случая: | + | <tex>JPS</tex> - это алгоритм построения расписания работ для одной машины с прерываниями. Пусть у нас есть множества работ <tex>O</tex>, для которых надо составить расписание, и множество <tex>P \subset O</tex>, которое состоит из работ, доступных для выполнения на данный момент. Возможны два случая: |
− | # Если машина освободилась, то вставляем в расписание работу <tex>J_i</tex> с наименьшим <tex>d_i</tex>. | + | # Если машина освободилась, то вставляем в расписание работу <tex>J_i\in P</tex> с наименьшим <tex>d_i</tex>. Также удалим <tex>J_i</tex> из <tex>P</tex>. |
− | # Если машина занята работой <tex>J_k</tex> и в момент времени <tex>r_i</tex> появилась работа <tex>J_i</tex>, тогда если <tex>d_i < d_k</tex>, то прервем <tex>J_k</tex> и поставим на выполнение <tex>J_i</tex>. В противном случае просто | + | # Если машина занята работой <tex>J_k</tex> и в момент времени <tex>r_i</tex> появилась работа <tex>J_i</tex>, тогда если <tex>d_i < d_k</tex>, то прервем <tex>J_k</tex> и поставим на выполнение <tex>J_i</tex>, а <tex>J_k</tex> добавим в <tex>P</tex>. В противном случае просто добавим <tex>J_i</tex> в <tex>P</tex>. |
− | Можно заметить что, если работа была вставлена в | + | Можно заметить что, если работа была вставлена в <tex>JPS</tex> после своего дедлайна, то данное множество работ <tex>O</tex> не является выполнимым. Таким образом, решение задачи сводится к нахождению такого множества работ <tex>O</tex>, которое будет выполнимым по <tex>JPS</tex> и чей вес будет максимален. |
{{Лемма | {{Лемма | ||
− | |statement=Пусть <tex>\Theta=\{t \mid t = r_i + l \cdot p | + | |statement=Пусть <tex>\Theta=\{t \mid t = r_i + l \cdot p; i = 1, \dots, n; l = 0, \dots, n - 1\}</tex>. Тогда <tex>\forall J_i \in O</tex> время начала <tex>s_i</tex> и время окончания <tex>e_i</tex> этой работы в <tex>JPS</tex> будет принадлежать <tex>\Theta</tex>. |
|proof= | |proof= | ||
− | Сначала докажем лемму для <tex>e_i</tex>. Пусть <tex>t</ | + | Сначала докажем лемму для <tex>e_i</tex>. Пусть <tex>t</tex> - минимальная временная точка такая, что между <tex>t</tex> и <tex>s_i</tex> <tex>JPS</tex> не простаивает. По структуре <tex>JPS</tex> <tex>t = r_x</tex>. Работы, которые выполняются между <tex>s_i</tex> и <tex>e_i</tex>, не могут выполняться ни до <tex>s_i</tex>, ни после <tex>e_i</tex>, даже частично. Это следует из структуры <tex>JPS</tex> - если работа <tex>J_u</tex> была прервана работой <tex>J_v</tex>, то после выполнения <tex>J_v</tex> мы снова вставляем в расписание <tex>J_u</tex>. Таким образом, <tex>e_i - s_i</tex> делится на <tex>p</tex>. Возможны следующие два случая: |
# <tex>J_i</tex> вызвало прерывание, тогда <tex>s_i = r_i</tex>. | # <tex>J_i</tex> вызвало прерывание, тогда <tex>s_i = r_i</tex>. | ||
# <tex>J_i</tex> не вызывало прерываний, следовательно между <tex>r_x</tex> и <tex>s_i</tex> выполнилось некоторое количество работ, тогда <tex>s_i - r_x</tex> делится на <tex>p</tex>. | # <tex>J_i</tex> не вызывало прерываний, следовательно между <tex>r_x</tex> и <tex>s_i</tex> выполнилось некоторое количество работ, тогда <tex>s_i - r_x</tex> делится на <tex>p</tex>. | ||
− | В любом из этих двух случаев есть такое <tex>r_y = r_x \vee r_i</tex>, такое что | + | В любом из этих двух случаев есть такое <tex>r_y = r_x \vee r_i</tex>, такое что <tex>JPS</tex> не простаивает между <tex>r_y</tex> и <tex>e_i</tex>. Тогда <tex>e_i - r_y</tex> делится на <tex>p</tex>. Следовательно, <tex>e_i - r_y</tex> не превышает <tex>n \cdot p</tex>, так как <tex>JPS</tex> не простаивает. Поэтому <tex>e_i \in \Theta</tex>. |
− | Теперь докажем принадлежность <tex>s_i</tex> к <tex>\Theta</tex>. По структуре | + | Теперь докажем принадлежность <tex>s_i</tex> к <tex>\Theta</tex>. По структуре <tex>JPS</tex> <tex>s_i</tex> - это либо окончание предыдущей работы <tex>e_u</tex>, либо <tex>r_i</tex>. Таким образом, легко понять, что <tex>s_i \in \Theta</tex>. |
}} | }} | ||
=== Динамика === | === Динамика === | ||
− | + | {{Определение | |
− | + | |id = def1 | |
− | + | |definition = <tex>\forall t_u, t_v \in \Theta, u <= v, \forall k = 1, \dots ,n:</tex> | |
+ | #<tex>U_k(t_u, t_v) = \{J_i \mid i < k ; t_u <= r_i < t_v\};</tex> | ||
+ | #<tex>W_k(t_u, t_v, m)</tex> - максимальный вес <tex>Z \subset U_k(t_u, t_v), |Z| = m</tex> такой, что <tex>m \in (1, \dots ,n)</tex> и <tex>JPS</tex> от <tex>Z</tex> разрешимо и заканчивается до <tex>t_v</tex>. Если такое <tex>Z</tex> существует, будем говорить, что <tex>Z</tex> реализует <tex>W_k(t_u, t_v, m)</tex>. Если же такого <tex>Z</tex> нет, то <tex>W_k(t_u, t_v, m) = - \infty.</tex>}} | ||
{{Лемма | {{Лемма | ||
|statement= | |statement= | ||
− | <tex>\forall t_u, t_v \in \Theta, u | + | <tex>\forall t_u, t_v \in \Theta, u <= v, \forall k \in (1, \dots ,n), \forall m \in (1, \dots ,n):</tex> |
* <tex>r_k \notin [t_u, t_v) \Rightarrow W_k(t_u, t_v, m) = W_{k-1}(t_u, t_v, m);</tex> | * <tex>r_k \notin [t_u, t_v) \Rightarrow W_k(t_u, t_v, m) = W_{k-1}(t_u, t_v, m);</tex> | ||
* Иначе <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>, где | ||
Строка 44: | Строка 48: | ||
|proof= | |proof= | ||
− | Если <tex>r_k \notin [t_u, t_v)</tex>, то работа <tex>J_k</tex> не может быть поставлена ни в какой <tex>Z</tex> такой, что | + | Если <tex>r_k \notin [t_u, t_v)</tex>, то работа <tex>J_k</tex> не может быть поставлена ни в какой <tex>Z</tex> такой, что <tex>JPS</tex> от <tex>Z</tex> разрешимо и <tex>Z \subset U_k(t_u, t_v)</tex>. Тогда, очевидно, что <tex>W_k(t_u, t_v, m) = W_{k-1}(t_u, t_v, m);</tex> |
Строка 53: | Строка 57: | ||
* <tex> W_{k-1}(t_u, t_v, m) < W'_k</tex> | * <tex> W_{k-1}(t_u, t_v, m) < W'_k</tex> | ||
*:Пусть существуют такие <tex>t_x, t_y \in \Theta</tex> и три числа <tex>m_1,m_2,m_3</tex>, такие что | *:Пусть существуют такие <tex>t_x, t_y \in \Theta</tex> и три числа <tex>m_1,m_2,m_3</tex>, такие что | ||
− | *:# <tex> \max(r_k, t_u) \leqslant t_x < t_y \leqslant \min(d_k, t_v)</tex> | + | *:# <tex> \max(r_k, t_u) \leqslant t_x < t_y \leqslant \min(d_k, t_v)</tex>, |
− | *:# <tex> m_1 + m_2 + m_3 = m - 1</tex> | + | *:# <tex> m_1 + m_2 + m_3 = m - 1</tex>, |
− | *:# <tex> p \cdot (m_2 + 1) = t_y - t_x</tex> | + | *:# <tex> p \cdot (m_2 + 1) = t_y - t_x</tex>, |
− | *: Очевидно, что <tex>U_{k-1}(t_u, t_x), U_{k-1}(t_x, t_y)</tex> и <tex>U_{k-1}(t_y, t_v)</tex> не пересекаются. Следовательно, | + | *: Очевидно, что <tex>U_{k-1}(t_u, t_x), U_{k-1}(t_x, t_y)</tex> и <tex>U_{k-1}(t_y, t_v)</tex> не пересекаются. Следовательно, <tex>JPS</tex> подмножеств, которые реализуют <tex>W_{k-1}(t_u, t_x, m_1), W_{k-1}(t_x, t_y, m_2)</tex> и <tex>W_{k-1}(t_y, t_v, m_3)</tex>, поставленные друг за другом дадут правильное расписание для <tex>m-1</tex> работ взятых из <tex>U_{k-1}(t_u, t_v)</tex>. Более того, у нас достаточно места чтобы вставить работу <tex>J_k</tex> в промежуток между <tex>t_x</tex> и <tex>t_y</tex>. Это возможно, так как <tex>p \cdot (m_2 + 1) = t_y - t_x</tex> и ровно <tex>m_2</tex> работ распределено для <tex>U_{k-1}(t_x, t_y)</tex>. Таким образом <tex>W'_k \leqslant W_k(t_u, t_v, m)</tex>. |
Строка 63: | Строка 67: | ||
*:Тогда <tex>W_k(t_u, t_v, m) = W_{k-1}(t_u, t_v, m) \leqslant \max(W_{k-1}(t_u, t_v, m), W'_k)</tex>. | *:Тогда <tex>W_k(t_u, t_v, m) = W_{k-1}(t_u, t_v, m) \leqslant \max(W_{k-1}(t_u, t_v, m), W'_k)</tex>. | ||
* <tex>J_k \in Z</tex>. | * <tex>J_k \in Z</tex>. | ||
− | *:Положим <tex>t_x</tex> и <tex>t_y</tex> временем начала выполнения и завершения работы <tex>J_k</tex> в | + | *:Положим <tex>t_x</tex> и <tex>t_y</tex> временем начала выполнения и завершения работы <tex>J_k</tex> в <tex>JPS</tex> от <tex>Z</tex>. Благодаря предыдущей лемме, мы знаем, что <tex>t_x, t_y \in \Theta</tex>. Также выполняется условие <tex> \max(r_k, t_u) \leqslant t_x < t_y \leqslant \min(d_k, t_v).</tex> Пусть <tex>Z_1, Z_2, Z_3</tex> будут подмножествами <tex>Z/J_k</tex> такими, что все работы в <tex>Z_1, Z_2</tex> и <tex>Z_3</tex> имеют время появления <tex>r_i</tex> в границах <tex>[t_u,t_x)</tex>, <tex>[t_x, t_y)</tex> и <tex>[t_y,t_v)</tex> соответственно. По структуре <tex>JPS</tex>(работа <tex>J_k</tex> имеет максимальный дедлайн <tex>d_k</tex>) все работы в <tex>Z_1</tex> завершаться до <tex>t_x</tex>. Более того, все работы в <tex>Z_2</tex> начнут выполняться после <tex>t_x</tex> и завершаться до <tex>t_y</tex>, аналогично для <tex>Z_3</tex>. Также <tex>p \cdot (|Z_2| + 1) = t_y - t_x,</tex> так как <tex>J_k</tex> выполнялась в промежутке <tex>[t_x, t_y).</tex> При этом, <tex>|Z_1| + |Z_2| + |Z_3| = m - 1.</tex> Можно заметить, что <tex>weight(Z_1) \leqslant W_{k-1}(t_u, t_x, |Z_1|), weight(Z_2) \leqslant W_{k-2}(t_x, t_y, |Z_2|)</tex> и <tex>weight(Z_3) \leqslant W_{k-1}(t_y, t_v, |Z_3|).</tex> Следовательно, <tex>W_k(t_u, t_v, m) = w_k + \sum\limits_{i = 1}^3weight(Z_i) \leqslant W'_k \leqslant \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>W_k(t_u, t_v, m) = \max(W_{k-1}(t_u, t_v, m), W'_k).</tex> Лемма доказана. |
}} | }} | ||
− | === | + | == См. также == |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | * [[P1sumu]] | |
− | + | * [[1pi1sumwu]] | |
− | + | * [[1ripipsumwu]] | |
− | |||
− | * [[1pi1sumwu | ||
− | * [[1ripipsumwu | ||
== Источники информации == | == Источники информации == | ||
− | + | Philippe Baptiste - Polynomial Time Algorithms for Minimizing the Weighted Number of Late Jobs on a Single Machine with Equal Processing Times | |
− | [[Категория: | + | [[Категория: Дискретная математика и алгоритмы]] |
[[Категория: Теория расписаний]] | [[Категория: Теория расписаний]] |