Изменения

Перейти к: навигация, поиск

1ripi1sumf

3702 байта добавлено, 05:56, 5 июня 2016
Пример 2
А именно, покажем, что решение задачи состоит в сопоставлении <tex>n</tex> различным заданиям различных времен начала выполнения работы. Если сопоставляем работе <tex>i</tex> время <tex>t</tex>, то вклад в целевую функцию будет <tex> f_i(t + 1) </tex>.
Далее будет показано, что при построении оптимального расписания нам нужно будет рассмотреть всего <tex>n</tex> различных времен начала работ. Следовательно, подобная задача может быть решена за <tex>\mathcal{O}(n^3)</tex>.
Поскольку <tex>f_i</tex> {{---}} монотонно неубывающие функции, то это значит, что в оптимальном расписании работы должны начинать исполняться как можно раньше. Первые <tex>n</tex> самых ранних для начала исполнения времен <tex>t_i</tex> могут быть вычислены следующим алгоритмом :
Из того, как в алгоритме выбирались значения для <tex>t_i</tex> следует, что <tex>t_{j + 1}</tex> {{---}} минимальное возможное время, большее <tex>t_j,</tex> в которое можно начать выполнять какое-нибудь из оставшихся заданий. Если во время <tex>t_{j+1}</tex> в расписании <tex>S</tex> не выполняется никакого задания, то какое-то задание, которое могло бы выполнится в момент времени <tex>t_{j+1}</tex> выполняется в <tex>S</tex> позднее. Значит оно может быть перемещено в нашем расписании <tex>S</tex> на время <tex>t_{j+1}</tex> без увеличения целевой функции. Таким образом, наше новое расписание тоже будет оптимальным. Получили противоречие с максимальностью <tex>j</tex>. Значит из всех оптимальных расписаний нам подходят только те, в которых <tex>j = n</tex>.
}}
==Частные случаиЧастный случай=====Различные В случае, когда все времена появления появлений заданий======Линейные функции===различны, оптимальное решение может быть посчитано за <tex>\mathcal{O}(n\log n) </tex>.
Поскольку любое задание выполняется за единицу времени, а все функции <tex>f_i</tex> являются неубывающими, то будет достаточно отсортировать работы по возрастанию времен появления и выполнять каждую работу как только она появится. Поскольку все <tex>r_i</tex> различны, то промежутки выполнения работ не будут пересекаться {{---}} расписание будет корректным. == Примеры ===== Пример 1===Даны четыре задания. <tex>r_1 = 3, f_1 = 5t </tex> <tex>r_2 = 2, f_2 = t^2 </tex> <tex>r_3 = 4, f_3 = t + 4 </tex> <tex>r_4 =1, f_4 =2^t </tex> Рассмотрим простой примерОтсортируем задания по неубыванию <tex>r_i</tex>, а дальше будем выполнять их по мере появления.В полученном расписании работы будут идти в порядке <tex>4, 2, 1, 3</tex> и давать в ответе <tex>2^{1 + 1} + (2 + 1)^2 + 5(3 + 1) + (4 + 1) + 4 = 42 </tex>, что является оптимальным результатом. ===Пример 2===Пусть у нас есть три задания, и каждое из них имеет время появления <tex>r_i = 0.</tex>  Заданы функции <tex>f_i</tex>:
<tex>f_1(t) = t^2 </tex>
<tex>f_2(t) = t^3 </tex>
<tex>f_3(t) = \mathrm{e} 3 ^ t </tex> Поступить как в предыдущем примере и просто отсортировать работы мы теперь не можем {{---}} не понятно, в каком порядке сортировать задания с одинаковым временем появления.
Тогда нужно по приведенному в начале алгоритму посчитать времена, когда мы можем начать выполнять задания. В результате получим: <tex>t_1 = 0, t_2 = 1, t_3 = 2</tex>.
Тогда, согласно алгоритму, задача сведется к следующей задаче о назначениях:
\hline
\hline
0 & 1 & $\mathbf{1 }$ & 3 \\1 & 4 & 8 & $\mathbf{9}$\mathrm\2 & $\mathbf{e9}$ & 27 & 27\\\hline\end{tabular} </tex> В результате работы [[Венгерский алгоритм решения задачи о назначениях | Венгерского алгоритма]] будет выбран порядок работ <tex>2, 3, 1</tex>, что даст лучший результат {{---}} <tex>19</tex>. На этом примере хорошо видно, что решение, выбирающие в каждый момент времени <tex>t_i</tex> несделанную работу с минимальным значением <tex>f_i(t_i + 1)</tex> будет давать плохой результат. ===Пример 3===Пусть у нас есть четыре задания, определенные следующим образом: <tex>r_1 = 0, f_1(t) = t^2 </tex> <tex>r_2 = 0, f_2(t) = 2t </tex>  <tex>r_3 = 1, f_3(t) = 2 ^ t </tex> <tex>r_4 = 5, f_3(t) = t + 2 </tex> Работы уже отсортированы, поэтому посчитаем времена <tex>t_i</tex> для выполнения заданий. Получим: <tex>t_1 = 0, t_2 = 1, t_3 = 2, t_4 = 4</tex>. Таблица, необходимая для решения задачи, будет построена так, что если работа с номером <tex>i</tex> ещё не доступна в момент времени <tex>t_j</tex>, то в соответствующей ячейке будет стоять <tex>\infty</tex>. <tex>\begin{tabular}{c||cccc}$t_i$ $\backslash$ i & 1 & 2 & 3 & 4 \\\hline\hline0 & 8 $\mathbf{1}$ & 2 & $\infty$ & $\infty$ \\1 & 4 & 4 & $\mathrmmathbf{e4} ^ 2$ & $\infty$ \\2 & 9 & 27 $\mathbf{6}$ & 8& $\infty$ \\4 & 25 & 10 & 32 & $\mathrmmathbf{e7} ^ 3$\\
\hline
\end{tabular}
</tex>
 В результате будет выбрано расписаниевыбран порядок работ <tex>1, в котором сначала будет идти третья3, 2, затем вторая4</tex>, а затем первая работаи все работы выполнятся за <tex>18</tex> единиц времени.
== См. также ==
* [[Классификация задач]]
264
правки

Навигация