<?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=109.248.7.75&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=109.248.7.75&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/109.248.7.75"/>
		<updated>2026-05-14T11:01:13Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=QpmtnCmax&amp;diff=27179</id>
		<title>QpmtnCmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=QpmtnCmax&amp;diff=27179"/>
				<updated>2012-07-01T18:23:29Z</updated>
		
		<summary type="html">&lt;p&gt;109.248.7.75: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Постановка задачи==&lt;br /&gt;
Есть несколько станков с разной скоростью выполнения работ. Работу на каждом из станков можно прервать и продолжить позже. &lt;br /&gt;
&lt;br /&gt;
Цель - выполнить все как можно быстрее.&lt;br /&gt;
&lt;br /&gt;
1. Найдем нижнюю границу времени выполнения.&lt;br /&gt;
&lt;br /&gt;
2. Составим оптимальное расписание.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм построения расписания==&lt;br /&gt;
Перед выполнением алгоритма, упорядочим все работы по убыванию их времени выполнеия:&amp;lt;tex&amp;gt; p_1 \ge p_2 \ge p_3... &amp;lt;/tex&amp;gt;, а все машины в порядке убывания скоростей: &amp;lt;tex&amp;gt; s_1 \ge s_2 \ge s_3 ... &amp;lt;/tex&amp;gt;. Введем следующие обозначения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; P_i = p_1 + ... + p_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; S_j = s_1 + ... + s_j&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;i = 1 ... n&amp;lt;/tex&amp;gt;,  &amp;lt;tex&amp;gt;j = 1 ... 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 + ... + p_n \le s_1T + ... + s_mT = S_mT&amp;lt;/tex&amp;gt; или  &amp;lt;tex&amp;gt;P_n/S_m \le T&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того, должно выполняться условие &amp;lt;tex&amp;gt;P_j/S_j \le T&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt; j = 1..m - 1 &amp;lt;/tex&amp;gt;, так как это нижняя оценка времени выполнения работ &amp;lt;tex&amp;gt; J_1...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;level&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Assign(t)&lt;br /&gt;
       &amp;lt;tex&amp;gt;t1 \leftarrow \min (s &amp;gt; t \mid s&amp;lt;/tex&amp;gt; - время окончания какой-то работы &amp;lt;tex&amp;gt; ) &amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;t2 \leftarrow \min (s &amp;gt; t \mid &amp;lt;/tex&amp;gt; для некоторых работ &amp;lt;tex&amp;gt;i, j : p_i(t) &amp;gt; p_j(t)&amp;lt;/tex&amp;gt; и &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(t1,t2) &amp;lt;/tex&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 &amp;lt;/tex&amp;gt; - множество работ с положительным &amp;lt;tex&amp;gt;level&amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;M = \{M_1,...,M_m\}&amp;lt;/tex&amp;gt; - множество всех станков&lt;br /&gt;
   '''WHILE''' множества &amp;lt;tex&amp;gt;J&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; не пустые&lt;br /&gt;
      Найти множество работ &amp;lt;tex&amp;gt;I \subset J&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;level&amp;lt;/tex&amp;gt; которых максимален.&lt;br /&gt;
      &amp;lt;tex&amp;gt;r \leftarrow min&amp;lt;/tex&amp;gt;(|&amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt;|,|&amp;lt;tex&amp;gt;I&amp;lt;/tex&amp;gt;|)&lt;br /&gt;
      Назначаем работы из множества &amp;lt;tex&amp;gt;I&amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; самых быстрых машин из множества &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;J \leftarrow J&amp;lt;/tex&amp;gt;\&amp;lt;tex&amp;gt;I&amp;lt;/tex&amp;gt;&lt;br /&gt;
      Удаляем из множества &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;r&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) \ge p_2(0) \ge ... \ge p_n(0) &amp;lt;/tex&amp;gt;. Это утверждение не меняется на протяжении всего выполнения алгоритма, для любого момента времени. Получаем: &amp;lt;tex&amp;gt; p_1(t) \ge p_2(t) \ge ... \ge 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 + ... + s_m) = p_1 + p_2 + ... + 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 ... M_m&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; f_1 \ge f_2 \ge ... \ge 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 \le i \le 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;. Пришли к противоречию.&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 = ... = 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) \ge p_2(0) \ge ... \ge p_m(0) \ge p_i(0) &amp;lt;/tex&amp;gt;, из чего следует, что &amp;lt;tex&amp;gt; p_1(T - \varepsilon) \ge ... \ge p_m(T - \varepsilon) \ge 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 \le \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 г. {{---}} 379 стр. {{---}} ISBN 978-3-540-69515-8&lt;/div&gt;</summary>
		<author><name>109.248.7.75</name></author>	</entry>

	</feed>