<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=91.221.67.89&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=91.221.67.89&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/91.221.67.89"/>
		<updated>2026-04-06T00:11:07Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=QpmtnCmax&amp;diff=54571</id>
		<title>QpmtnCmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=QpmtnCmax&amp;diff=54571"/>
				<updated>2016-06-05T10:47:17Z</updated>
		
		<summary type="html">&lt;p&gt;91.221.67.89: правки&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tex dpi = &amp;quot;200&amp;quot;&amp;gt;Q \mid pmtn \mid C_{max}&amp;lt;/tex&amp;gt;&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition=&lt;br /&gt;
Дано несколько станков с разной скоростью выполнения работ, работающих параллельно. Работа может быть прервана в любой момент и продолжена позже на любой машине. Необходимо минимизировать время выполнения всех работ.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Алгоритм построения расписания===&lt;br /&gt;
Перед выполнением алгоритма, упорядочим все работы по убыванию их времени выполнения:&amp;lt;tex&amp;gt; p_1 \geqslant p_2 \geqslant p_3 \ldots &amp;lt;/tex&amp;gt;, а все машины в порядке убывания скоростей: &amp;lt;tex&amp;gt; s_1 \geqslant s_2 \geqslant s_3 \ldots &amp;lt;/tex&amp;gt;. Введем следующие обозначения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; P_i = p_1 + \ldots + p_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; S_j = s_1 + \ldots + s_j&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;i = 1 \ldots n&amp;lt;/tex&amp;gt;,  &amp;lt;tex&amp;gt;j = 1 \ldots m&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; p_i&amp;lt;/tex&amp;gt; - время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы, &amp;lt;tex&amp;gt; s_j&amp;lt;/tex&amp;gt; - скорость работы &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;-oй машины.&lt;br /&gt;
&lt;br /&gt;
Необходимое условие для выполнения всех работ в интервале &amp;lt;tex&amp;gt;[0..T]&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; P_n = p_1 + \ldots + p_n \leqslant s_1T + \ldots + s_mT = S_mT&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;P_n/S_m \leqslant T&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, должно выполняться условие &amp;lt;tex&amp;gt;P_j/S_j \leqslant T&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt; j = 1 \ldots m - 1 &amp;lt;/tex&amp;gt;, так как это нижняя оценка времени выполнения работ &amp;lt;tex&amp;gt; J_1 \ldots J_j&amp;lt;/tex&amp;gt;. Исходя из этого получаем нижнюю границу &amp;lt;tex&amp;gt;C_{max}&amp;lt;/tex&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_{max}&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\max\{\max\limits_{j=1}^{m-1} {P_j \over S_j}, {P_n \over S_m}\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перейдем к описанию алгоритма. Будем назвать &amp;lt;tex&amp;gt;Level&amp;lt;/tex&amp;gt;-ом работы &amp;lt;tex&amp;gt; p_i(t) &amp;lt;/tex&amp;gt; - невыполненную часть работы &amp;lt;tex&amp;gt; p_i &amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее построим расписание, которое достигает нашей оценки &amp;lt;tex&amp;gt;C_{max}&amp;lt;/tex&amp;gt;, с помощью &amp;lt;tex&amp;gt;Level&amp;lt;/tex&amp;gt;-алгоритма.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Level&amp;lt;/tex&amp;gt; - алгоритм:&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;tex&amp;gt;t \leftarrow 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;\exists p(t) &amp;gt; 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Assign(t)&lt;br /&gt;
       &amp;lt;tex&amp;gt;t_1 \leftarrow \min (s \mid s &amp;gt; t &amp;lt;/tex&amp;gt; '''and''' &amp;lt;tex&amp;gt;p(s) = 0)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;t_2 \leftarrow \min (s \mid s &amp;gt; t&amp;lt;/tex&amp;gt; '''and''' &amp;lt;tex&amp;gt;\exists i&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;j : p_i(t) &amp;gt; p_j(t)&amp;lt;/tex&amp;gt; '''and''' &amp;lt;tex&amp;gt;p_i(s) = p_j(s))&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;t \leftarrow \min(t_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;t_2)&amp;lt;/tex&amp;gt;    &amp;lt;font color=green&amp;gt; // поиск следующего момента времени, в который нужно будет перераспределить машины/работы &amp;lt;/font&amp;gt;&lt;br /&gt;
   Построение расписания&lt;br /&gt;
&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;Assign(t)&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;tex&amp;gt;J = \{i \mid p_i(t) &amp;gt; 0\}&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt; // множество работ с положительным level &amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;M = \{M_1 \ldots M_m\}&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt; // множество всех станков &amp;lt;/font&amp;gt;&lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;J \ne \varnothing&amp;lt;/tex&amp;gt; '''or''' &amp;lt;tex&amp;gt;M \ne \varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
      max  &amp;lt;font color=green&amp;gt; // максимальное значение level из J &amp;lt;/font&amp;gt;&lt;br /&gt;
      count  &amp;lt;font color=green&amp;gt; // количество работ с level = max &amp;lt;/font&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;r = min(|M|&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;count)&amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;I \leftarrow \{r&amp;lt;/tex&amp;gt; работ из &amp;lt;tex&amp;gt;J \mid p(t) = max\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;M' \leftarrow \{r&amp;lt;/tex&amp;gt; самых быстрых машин из &amp;lt;tex&amp;gt;M\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      Распределяем работы&lt;br /&gt;
      &amp;lt;tex&amp;gt;J \leftarrow J \setminus I&amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;M \leftarrow M \setminus M'&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Доказательство корректности алгоритма===&lt;br /&gt;
Так как нижняя граница &amp;lt;tex&amp;gt;C_{max}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_{max}&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\max\{\max\limits_{j=1}^{m-1} {P_j \over S_j}, {P_n \over S_m}\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
то достаточно показать, что составленное расписание достигает этой оценки.&lt;br /&gt;
&lt;br /&gt;
Будем считать, что в начале алгоритма все работы упорядочены, как было сказано ранее: &amp;lt;tex&amp;gt; p_1(0) \geqslant p_2(0) \geqslant \ldots \geqslant p_n(0) &amp;lt;/tex&amp;gt;. Это утверждение не меняется на протяжении всего выполнения алгоритма, для любого момента времени. Получаем: &amp;lt;tex&amp;gt; p_1(t) \geqslant p_2(t) \geqslant \ldots \geqslant p_n(t) &amp;lt;/tex&amp;gt;. Докажем что алгоритм составляет расписание в соответствии с этим свойством. Чтобы доказать этот факт, будем считать что в любой момент времени &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; нет простоев машин, когда есть хотя бы одна невыполненная работа. Получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;  T(s_1 + \ldots + s_m) = p_1 + p_2 + \ldots + p_n &amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt; T = {P_n \over S_m} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом необходимая оценка достигается нашим алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Допустим хотя бы одна машина простаивает, в момент когда есть невыполненные работы, получим следующее неравенство для времен окончания работ (обозначим далее как &amp;lt;tex&amp;gt; f_i &amp;lt;/tex&amp;gt;) на станках &amp;lt;tex&amp;gt;M_1 \ldots M_m&amp;lt;/tex&amp;gt;, пронумерованных по убыванию скоростей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; f_1 \geqslant f_2 \geqslant \ldots \geqslant f_m &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Докажем написанное выше неравенство:&lt;br /&gt;
&lt;br /&gt;
Предположим, что &amp;lt;tex&amp;gt; f_i &amp;lt; f_{i+1} &amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt; 1 \leqslant i \leqslant m-1 &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;Level&amp;lt;/tex&amp;gt; последней работы, выполнявшейся на станке &amp;lt;tex&amp;gt; M_i &amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt; f_i - \varepsilon &amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt; \varepsilon &amp;gt; 0&amp;lt;/tex&amp;gt; достаточно мал) меньше, чем &amp;lt;tex&amp;gt;Level&amp;lt;/tex&amp;gt; последней работы на станке &amp;lt;tex&amp;gt; M_{i+1} &amp;lt;/tex&amp;gt;. Пришли к противоречию, так как при распределении, работы с наибольшим &amp;lt;tex&amp;gt;Level&amp;lt;/tex&amp;gt; выставлялись на самые быстрые станки.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt; f_1 = f_2 = f_3 = \ldots = f_j &amp;gt; f_{j+1}&amp;lt;/tex&amp;gt; ,где &amp;lt;tex&amp;gt; j &amp;lt; m &amp;lt;/tex&amp;gt;. Чтобы работы завершились в момент времени &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;, необходимо начать их в момент времени 0, поскольку если это не выполняется, то у нас найдется работа &amp;lt;tex&amp;gt; J_i &amp;lt;/tex&amp;gt; , которая начинается позже &amp;lt;tex&amp;gt; t = 0 &amp;lt;/tex&amp;gt; и заканчивается в &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;. Это означает, что в момент времени &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt; начинаются как минимум &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; работ. Пусть первые &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; работ стартовали вместе на всех машинах. Мы получаем &amp;lt;tex&amp;gt; p_1(0) \geqslant p_2(0) \geqslant \ldots \geqslant p_m(0) \geqslant p_i(0) &amp;lt;/tex&amp;gt;, из чего следует, что &amp;lt;tex&amp;gt; p_1(T - \varepsilon) \geqslant \ldots \geqslant p_m(T - \varepsilon) \geqslant p_i(T - \varepsilon) &amp;gt; 0 &amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt;, удовлетворяющего условию &amp;lt;tex&amp;gt; 0 \leqslant \varepsilon &amp;lt; T - t &amp;lt;/tex&amp;gt;. Таким образом, до момента времени &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; нет простаивающих машин. Пришли к противоречию. Получаем &amp;lt;tex&amp;gt; T = {P_j \over S_j} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Пример===&lt;br /&gt;
[[Файл:Qpmtncmax.png|600px|thumb|right|Картинка к примеру]]&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть 6 работ и 3 станка. Покажем работу алгоритма для данного случая.&lt;br /&gt;
&lt;br /&gt;
В начальный момент времени начинаем обрабатывать работы с наибольшим временем выполнения &amp;lt;tex&amp;gt;J_1-J_3&amp;lt;/tex&amp;gt; на станках &amp;lt;tex&amp;gt;M_1-M_3&amp;lt;/tex&amp;gt; соответственно. В момент времени &amp;lt;tex&amp;gt;T_1&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;lvl&amp;lt;/tex&amp;gt; 1-ой работы и 2-ой работы совпадает. С этого момента начинаем обрабатывать работы &amp;lt;tex&amp;gt; J_1,J_2&amp;lt;/tex&amp;gt; синхронно на станках: &amp;lt;tex&amp;gt;M_1 M_2&amp;lt;/tex&amp;gt;. В момент времени &amp;lt;tex&amp;gt;T_2&amp;lt;/tex&amp;gt; работа &amp;lt;tex&amp;gt;J_3&amp;lt;/tex&amp;gt; опускается до уровня работы &amp;lt;tex&amp;gt;J_4&amp;lt;/tex&amp;gt;.Работы &amp;lt;tex&amp;gt; J_3,J_4&amp;lt;/tex&amp;gt; выполняем одновременно на одном станке &amp;lt;tex&amp;gt; M_3&amp;lt;/tex&amp;gt;. В момент времени &amp;lt;tex&amp;gt;T_3&amp;lt;/tex&amp;gt; начинаем выполнять первые четыре работы на всех станках одновременно, далее просто добавятся работы &amp;lt;tex&amp;gt;J_5 J_6&amp;lt;/tex&amp;gt; и все работы закончатся одновременно.&lt;br /&gt;
&lt;br /&gt;
===Время работы===&lt;br /&gt;
&amp;lt;tex&amp;gt; Level &amp;lt;/tex&amp;gt; - алгоритм вызывает функцию &amp;lt;tex&amp;gt; Assign(t) &amp;lt;/tex&amp;gt; в самом худшем случае &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; раз. Функция &amp;lt;tex&amp;gt; Assign(t) &amp;lt;/tex&amp;gt; выполняется за &amp;lt;tex&amp;gt;O(nm)&amp;lt;/tex&amp;gt;. Итоговое время работы &amp;lt;tex&amp;gt;O(n^2m)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 124 {{---}} 129 стр. {{---}} ISBN 978-3-540-69515-8&lt;/div&gt;</summary>
		<author><name>91.221.67.89</name></author>	</entry>

	</feed>