|
|
Строка 30: |
Строка 30: |
| Покажем, что в <tex>S^*</tex> работа <tex>k</tex> может быть заменена работой <tex>l</tex> без увеличения значения целевой функции. Рассмотрим два случая:<br> | | Покажем, что в <tex>S^*</tex> работа <tex>k</tex> может быть заменена работой <tex>l</tex> без увеличения значения целевой функции. Рассмотрим два случая:<br> |
| 1. Пусть <tex>l < k</tex>.<br> | | 1. Пусть <tex>l < k</tex>.<br> |
− | То, что <tex>k</tex> не принадлежит множеству <tex>S</tex>, значит, что либо на некотором шаге появилась опаздывающая работа <tex>j</tex>, которая заменила <tex>k</tex>, либо работа <tex>k</tex> опаздывала и <tex>w_k</tex> было меньше <tex>\min\limits_{i \in S}w_i</tex>, и поэтому она не была добавлена. В любом случае в это время работа <tex>l</tex> уже принадлежала <tex>S</tex>. Из этого следует, что <tex>w_k \leq w_l</tex>, во втором случае очевидно, почему, а в первом {{---}} потому что на этапе замены мы выбрали <tex>k</tex>, а не <tex>l</tex>. Следовательно, мы не ухудшим целевую функцию заменой <tex>k</tex> на <tex>l</tex>.<br> | + | То, что <tex>k</tex> не принадлежит множеству <tex>S</tex>, значит, что либо на некотором шаге появилась опаздывающая работа <tex>j</tex>, которая заменила <tex>k</tex>, либо работа <tex>k</tex> опаздывала и <tex>w_k</tex> было меньше <tex>\min\limits_{i \in S}w_i</tex>, и поэтому она не была добавлена. В любом случае в это время работа <tex>l</tex> уже принадлежала <tex>S</tex>. Во втором случае очевидно, что <tex>w_k \leq w_l</tex>. То же неравенство выполняется и в первом случае, так как на этапе замены мы выбрали <tex>k</tex>, а не <tex>l</tex>. Следовательно, мы не ухудшим целевую функцию заменой <tex>k</tex> на <tex>l</tex>.<br> |
| 2. Пусть <tex>l > k</tex>.<br> | | 2. Пусть <tex>l > k</tex>.<br> |
| Замена работы <tex>k</tex> в <tex>S^*</tex> на работу <tex>l</tex> не противоречит условию, что за все работы в этом множестве штраф налагаться не будет, так как <tex>k</tex> выполнялась в срок, а <tex>d_k \leq d_l</tex> и все работы выполняются одинаковое количество времени. Следовательно, <tex>l</tex> так же будет выполнена в срок. Осталось доказать, что <tex>w_k \leq w_l</tex>. <br> | | Замена работы <tex>k</tex> в <tex>S^*</tex> на работу <tex>l</tex> не противоречит условию, что за все работы в этом множестве штраф налагаться не будет, так как <tex>k</tex> выполнялась в срок, а <tex>d_k \leq d_l</tex> и все работы выполняются одинаковое количество времени. Следовательно, <tex>l</tex> так же будет выполнена в срок. Осталось доказать, что <tex>w_k \leq w_l</tex>. <br> |
Строка 39: |
Строка 39: |
| * <tex>j_{v + 1}</tex> превосходит <tex>j_v</tex>, где <tex>v \in [0 \cdots s - 1]</tex> | | * <tex>j_{v + 1}</tex> превосходит <tex>j_v</tex>, где <tex>v \in [0 \cdots s - 1]</tex> |
| * <tex>j_{s - 1} < l \leq j_s</tex> , | | * <tex>j_{s - 1} < l \leq j_s</tex> , |
− | то <tex>w_l \geq w_{k_{j_s}} \geq \cdots \geq w_{k_{j_0}} = w_k</tex>, что доказывает терему.<br> | + | то <tex>w_l \geq w_{k_{j_s}} \geq \cdots \geq w_{k_{j_0}} = w_k</tex>, что доказывает теорему.<br> |
| }} | | }} |
[math] P \mid p_i=1 \mid \sum w_i U_i[/math]
Задача: |
Дано [math]m[/math] одинаковых станков, на которых нужно выполнить [math]n[/math] работ. Любая работа на любом станке выполняется единицу времени. Для каждой работы есть время окончания [math]d_i[/math] — ожидается, что до этого времени она будет закончена, и штраф [math]w_i[/math], который нужно будет выплатить в случае, если работа была закончена после [math]d_i[/math]. Необходимо минимизировать суммарный штраф, который придется выплатить. |
Описание алгоритма
Оптимальное расписание для этой задачи будем задавать множеством работ [math]S[/math], которые будут выполнены в начале, как после будет показано, именно за эти работы штраф начислен не будет. Работы, которые не войдут в [math]S[/math], то есть завершатся с опозданием, могут быть выполнены в конце в любом порядке.
Чтобы построить множество [math]S[/math], будем добавлять работы в порядке неуменьшения их времен окончания, и как только некоторая работа [math]j[/math] опаздывает, удалим из [math]S[/math] работу с минимальным значением [math]w_i[/math] и поставим [math]j[/math] на ее место.
Пусть есть работы [math]1 \cdots n[/math] с временами окончания [math]d_1 \leq d_2 \leq \cdots \leq d_n[/math]. Будем называть простоем временной интервал, в который на машине ничего не обрабатывается. Тогда следующий алгоритм вычислит оптимальное множество [math]S[/math].
[math]S \leftarrow \varnothing[/math]
for [math]j = 1[/math] to [math]n[/math]:
if [math]j[/math] опаздывает, и все более ранние простои заполнены:
найти [math]i: w[i] = \min\limits_{k \in S}(w[k])[/math]
if [math]w[i] \lt w[j][/math]:
заменить [math]i[/math] на [math]j[/math] в [math]S[/math]
else:
добавить [math]i[/math] в [math]S[/math] и поставить [math]i[/math] на место самого раннего простоя
Таким образом, работы, не попавшие в [math]S[/math], будут иметь минимальное значение [math]w_i[/math].
Доказательство корректности
Теорема: |
Вышеописанный алгоритм корректен и строит оптимальное множество работ [math]S[/math]. |
Доказательство: |
[math]\triangleright[/math] |
Пусть [math]S[/math] — множество работ, вычисленное с помощью алгоритма. Тогда все работы, находящиеся в этом множестве, будут выполнены в срок, то есть штраф за них налагаться не будет, так как если работа [math]j[/math] заменила работу [math]i[/math], которая успевала выполниться до истечения [math]d_i[/math], то [math]j[/math] так же успеет выполниться в срок, потому что [math]d_i \leq d_j[/math].
Пусть [math]S^*[/math] — множество работ без штрафов в оптимальном расписании.
Определим работы [math]l[/math] и [math]k[/math] следующим образом:
- [math]l[/math] — первая работа в [math]S[/math]: [math]l \notin S^*[/math]
- [math]k[/math] — первая работа в [math]S^*[/math]: [math]k \notin S[/math]
Покажем, что в [math]S^*[/math] работа [math]k[/math] может быть заменена работой [math]l[/math] без увеличения значения целевой функции. Рассмотрим два случая:
1. Пусть [math]l \lt k[/math].
То, что [math]k[/math] не принадлежит множеству [math]S[/math], значит, что либо на некотором шаге появилась опаздывающая работа [math]j[/math], которая заменила [math]k[/math], либо работа [math]k[/math] опаздывала и [math]w_k[/math] было меньше [math]\min\limits_{i \in S}w_i[/math], и поэтому она не была добавлена. В любом случае в это время работа [math]l[/math] уже принадлежала [math]S[/math]. Во втором случае очевидно, что [math]w_k \leq w_l[/math]. То же неравенство выполняется и в первом случае, так как на этапе замены мы выбрали [math]k[/math], а не [math]l[/math]. Следовательно, мы не ухудшим целевую функцию заменой [math]k[/math] на [math]l[/math].
2. Пусть [math]l \gt k[/math].
Замена работы [math]k[/math] в [math]S^*[/math] на работу [math]l[/math] не противоречит условию, что за все работы в этом множестве штраф налагаться не будет, так как [math]k[/math] выполнялась в срок, а [math]d_k \leq d_l[/math] и все работы выполняются одинаковое количество времени. Следовательно, [math]l[/math] так же будет выполнена в срок. Осталось доказать, что [math]w_k \leq w_l[/math].
Пусть работа [math]k_{i_0} = k[/math] была заменена работой [math]i_0[/math], а так же [math]k_{i_1} \cdots k_{i_r}[/math] — последовательность работ из [math]S[/math], каждая из которых была на некотором шаге заменена работой [math]i_1 \cdots i_r[/math] соответственно. Тогда [math]i_0 \lt i_1 \lt \cdots \lt i_r[/math].
Рис. 1. [math]i_v[/math] превосходит [math]i_u[/math].
Будем говорить [math]i_v[/math] превосходит [math]i_u[/math], где [math]u \lt v[/math], если [math]k_{i_v} \leq i_u[/math]. Тогда [math]w_{k_{i_v}} \geq w_{k_{i_u}}[/math], так как когда мы вставляли работу [math]i_u[/math] мы выбрали для замены [math]k_{i_u}[/math], то есть ее вес был минимальным среди всех работ, находившихся на тот момент в [math]S[/math], включая [math]k_{i_v}[/math]. Для большей ясности на рисунке 1 показано, в каком порядке располагаются эти работы относительно друг друга согласно их номерам.
Если из последовательности [math]i_0 \lt i_1 \lt \cdots \lt i_r[/math] можно выделить подпоследовательность [math]j_0 = i_0 \lt j_1 \lt \cdots \lt j_s[/math] со свойствами:
- [math]j_{v + 1}[/math] превосходит [math]j_v[/math], где [math]v \in [0 \cdots s - 1][/math]
- [math]j_{s - 1} \lt l \leq j_s[/math] ,
то [math]w_l \geq w_{k_{j_s}} \geq \cdots \geq w_{k_{j_0}} = w_k[/math], что доказывает теорему. |
[math]\triangleleft[/math] |