<?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=217.66.152.156&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=217.66.152.156&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/217.66.152.156"/>
		<updated>2026-06-10T19:24:55Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=1precpmtnrifmax&amp;diff=23742</id>
		<title>1precpmtnrifmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=1precpmtnrifmax&amp;diff=23742"/>
				<updated>2012-06-04T13:47:13Z</updated>
		
		<summary type="html">&lt;p&gt;217.66.152.156: /* Modify */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
Задача &amp;lt;tex&amp;gt; 1 \mid prec, pmtn, r_i \mid f_{max} &amp;lt;/tex&amp;gt; является обобщением [[Правило Лаулера|&amp;lt;tex&amp;gt;1 \mid prec \mid f_{max}&amp;lt;/tex&amp;gt;]], но здесь у работ также есть времена появления, раньше которых их делать запрещено, и их можно прерывать.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
Работу будем обозначать просто ее номером (&amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;), при этом, номера работ могут меняться в зависимости от того, по какому параметру они отсортированы. Время появления работы — &amp;lt;tex&amp;gt; r_i &amp;lt;/tex&amp;gt;, время, требуемое для ее выполнения — &amp;lt;tex&amp;gt; p_i &amp;lt;/tex&amp;gt;. Множество ребер графа обозначается как &amp;lt;tex&amp;gt; E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Modify ===&lt;br /&gt;
Для начала, модифицируем времена появления работ. Если работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; зависит от &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, то, очевидно, она не может быть начата раньше, чем закончится выполнение &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, поэтому нужно заменить &amp;lt;tex&amp;gt; r_j &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; \max(r_j, r_i + p_i) &amp;lt;/tex&amp;gt;. Алгоритм, делающий это, представлен ниже (работы рассматриваются в порядке топологической сортировки):&lt;br /&gt;
&lt;br /&gt;
 Modify()&lt;br /&gt;
 1    '''for''' i &amp;lt;tex&amp;gt; \in \{ 1 \ldots n \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
 2      '''for''' j: ij &amp;lt;tex&amp;gt; \in E &amp;lt;/tex&amp;gt;&lt;br /&gt;
 3        &amp;lt;tex&amp;gt; r_j \leftarrow \max(r_j, r_i + p_i) &amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
После выполнения этого алгоритма для любых двух работ &amp;lt;tex&amp;gt; i, j &amp;lt;/tex&amp;gt;, таких, что &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; зависит от &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, выполняется &amp;lt;tex&amp;gt; r_j &amp;gt; r_i &amp;lt;/tex&amp;gt;, поэтому, при рассмотрении работ в порядке неубывания времен их появления, они также будут топологически отсортированы.&lt;br /&gt;
&lt;br /&gt;
=== Blocks ===&lt;br /&gt;
Здесь и далее считается, что работы отсортированы в порядке неубывания модифицированных &amp;lt;tex&amp;gt; r_i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Станок, выполняющий работы, выполняет работу в некоторые интервалы времени и простаивает в остальное время. Следующий алгоритм разбивает множество работ на блоки, внутри которых станок работает без простоя.&lt;br /&gt;
&lt;br /&gt;
 Blocks(&amp;lt;tex&amp;gt; \{ 1 \ldots n \} &amp;lt;/tex&amp;gt;)&lt;br /&gt;
 1    &amp;lt;tex&amp;gt; j \leftarrow 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
 2    &amp;lt;tex&amp;gt; t \leftarrow 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
 3    '''for''' &amp;lt;tex&amp;gt; i \in \{ 1 \ldots n \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
 4      '''if''' &amp;lt;tex&amp;gt; t &amp;lt; r_i &amp;lt;/tex&amp;gt;&lt;br /&gt;
 5        &amp;lt;tex&amp;gt; t \leftarrow r_i &amp;lt;/tex&amp;gt;&lt;br /&gt;
 6        &amp;lt;tex&amp;gt; j \leftarrow j + 1 &amp;lt;/tex&amp;gt;&lt;br /&gt;
 7      &amp;lt;tex&amp;gt; B_j \leftarrow B_j \cup i &amp;lt;/tex&amp;gt;&lt;br /&gt;
 8      &amp;lt;tex&amp;gt; t \leftarrow t + p_i &amp;lt;/tex&amp;gt;&lt;br /&gt;
 9    return &amp;lt;tex&amp;gt; {B_1, \ldots, B_j} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если алгоритм Blocks вызывается от пустого множества, то считаем, что он возвращает также пустое множество.&lt;br /&gt;
&lt;br /&gt;
Определим время начала блока &amp;lt;tex&amp;gt; B_j &amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt;s_j = \min\limits_{i \in B_j} r_i &amp;lt;/tex&amp;gt;, а время конца — как &amp;lt;tex&amp;gt; e_j = s_j + \sum\limits_{i \in B_j} p_i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
Существует оптимальное расписание, такое, что все во все временные интервалы &amp;lt;tex&amp;gt; [s_j; e_j] &amp;lt;/tex&amp;gt;, соответствующие блокам &amp;lt;tex&amp;gt; B_j &amp;lt;/tex&amp;gt;, построенным алгоритмом Blocks, станок работает без простоя.&lt;br /&gt;
|proof=&lt;br /&gt;
Возьмем произвольное оптимальное расписание &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;, в нем деление на блоки может также быть произвольным. Найдем первый такой временной интервал &amp;lt;tex&amp;gt; [s_j; e_j] &amp;lt;/tex&amp;gt;, что в &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; есть период простоя внутри &amp;lt;tex&amp;gt; [s_j; e_j] &amp;lt;/tex&amp;gt; (если таких периодов несколько, будем рассматривать первый из них). Обозначим его за &amp;lt;tex&amp;gt; [s; e] &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Возьмем некоторую работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, такую, что она начинается позже, чем в момент времени &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;, не имеет в графе зависимостей предков, завершаемых позже, чем в момент &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; r_i \le s &amp;lt;/tex&amp;gt;. Такая работа обязательно существует, иначе для множества работ, выполняемых позже, чем в момент &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;, было бы &amp;lt;tex&amp;gt; r = \min\limits{k \in T} r_k &amp;gt; s &amp;lt;/tex&amp;gt;, и внутри блока &amp;lt;tex&amp;gt; B_j &amp;lt;/tex&amp;gt; был бы простой &amp;lt;tex&amp;gt; [s_j; r] &amp;lt;/tex&amp;gt;, что невозможно по построению алгоритма Blocks. Очевидно, мы можем начать выполнять ее в момент времени &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; и полностью, либо частично заполнить простой &amp;lt;tex&amp;gt; [s; e] &amp;lt;/tex&amp;gt;; так как &amp;lt;tex&amp;gt; f_i &amp;lt;/tex&amp;gt; — неубывающая функция, то ответ останется оптимальным. Повторяя этот процесс, мы за конечное число шагов придем к оптимальному расписанию с требуемым свойством.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Decompose ===&lt;br /&gt;
Допустим, у нас есть блок работ, который можно выполнить без прерываний. Общая идея алгоритма Decompose следующая: найдем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, которую выгоднее всего выполнить последней. Разобъем оставшееся множество работ на блоки, решим задачу для этих блоков рекурсивно и вставим &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в промежутки между ними, до них и после них, начиная с &amp;lt;tex&amp;gt; r_i &amp;lt;/tex&amp;gt;. Псевдокод этого алгоритма представлен ниже.&lt;br /&gt;
&lt;br /&gt;
 Decompose(B)&lt;br /&gt;
 1    найти &amp;lt;tex&amp;gt; l: f_l(e) = \min \{f_j(e) \mid j \in B, \overline\exists\ k: jk \in E \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
 2    ans &amp;lt;tex&amp;gt; \leftarrow f_l(e) &amp;lt;/tex&amp;gt;&lt;br /&gt;
 3    G &amp;lt;tex&amp;gt; \leftarrow &amp;lt;/tex&amp;gt; Blocks(&amp;lt;tex&amp;gt; B \setminus l &amp;lt;/tex&amp;gt;)&lt;br /&gt;
 4    вставить l в промежутки между блоками G, начиная с &amp;lt;tex&amp;gt; r_l &amp;lt;/tex&amp;gt;&lt;br /&gt;
 5    '''for''' &amp;lt;tex&amp;gt;B_j \in G &amp;lt;/tex&amp;gt;:&lt;br /&gt;
 6      ans = max(ans, Decompose(&amp;lt;tex&amp;gt; B_j &amp;lt;/tex&amp;gt;))&lt;br /&gt;
 7    return ans&lt;br /&gt;
 &lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Расписание для блока, построенное алгоритмом Decompose, является корректным и оптимальным.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем сначала корректность.&lt;br /&gt;
&lt;br /&gt;
Убедимся, что порядок выполнения работ, заданный графом зависимостей, не нарушается. Заметим, что в разбиении &amp;lt;tex&amp;gt; B \setminus l &amp;lt;/tex&amp;gt; на блоки существует не более одного блока &amp;lt;tex&amp;gt; B_0 &amp;lt;/tex&amp;gt;, расположенного до момента времени &amp;lt;tex&amp;gt; r_l &amp;lt;/tex&amp;gt; — иначе после вставки &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; в промежутки между блоками, &amp;lt;tex&amp;gt; B &amp;lt;/tex&amp;gt; выполнялся бы с прерываниями. Далее, заметим, что все интервалы времени, на которые назначается работа из блока &amp;lt;tex&amp;gt; B_j &amp;lt;/tex&amp;gt;, находятся внутри интервала &amp;lt;tex&amp;gt; [s_j; e_j] &amp;lt;/tex&amp;gt;; это относится и к блоку &amp;lt;tex&amp;gt; B_0 &amp;lt;/tex&amp;gt;. Из этих двух наблюдений, а также того, что все работы со временами появления меньше, чем &amp;lt;tex&amp;gt; r_l &amp;lt;/tex&amp;gt;, будут помещены в блок &amp;lt;tex&amp;gt; B_0 &amp;lt;/tex&amp;gt;, следует, что порядок выполнения будет правильным.&lt;br /&gt;
&lt;br /&gt;
Также для корректности требуется, чтобы работы выполнялись не раньше, чем они появляются. Так как время выполнения работы определяется только в строке 4 алгоритма, которая соответствует этому требованию, то условие выполняется.&lt;br /&gt;
&lt;br /&gt;
Найдем теперь нижнюю оценку на &amp;lt;tex&amp;gt; f_{max} &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; f_{max}(J) &amp;lt;/tex&amp;gt; — ответ для множества работ &amp;lt;tex&amp;gt; J &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Очевидно, для любой работы &amp;lt;tex&amp;gt; j \in J &amp;lt;/tex&amp;gt; выполняется &amp;lt;tex&amp;gt; f_{max}(J) \ge f_{max}(J \setminus j) &amp;lt;/tex&amp;gt;, значит, &amp;lt;tex&amp;gt; f_{max}(J) \ge \max\limits_{j \in J} f_{max}(J \setminus j) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также, так как в оптимальном решении какая-то работа без потомков обязательно заканчивается в блоке &amp;lt;tex&amp;gt; B &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; f_{max}(J) \ge f_l(e) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Отсюда следует &amp;lt;tex&amp;gt; f_{max}(J) \ge \max(f_l(e), \max\limits_{j \in J} f_{max}(J \setminus j)) &amp;lt;/tex&amp;gt;. По псевдокоду алгоритма видно, что его ответ достигает этой нижней оценки.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Общий алгоритм ===&lt;br /&gt;
&lt;br /&gt;
Выполним Modify, после чего разобъем все множество работ на блоки и для каждого блока запустим Decompose():&lt;br /&gt;
&lt;br /&gt;
 MakeSchedule()&lt;br /&gt;
 1    Modify()&lt;br /&gt;
 2    B &amp;lt;tex&amp;gt; \leftarrow &amp;lt;/tex&amp;gt; Blocks(&amp;lt;tex&amp;gt; \{1 \ldots n \} &amp;lt;/tex&amp;gt;)&lt;br /&gt;
 3    ans &amp;lt;tex&amp;gt; \leftarrow &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; -\infty &amp;lt;/tex&amp;gt;&lt;br /&gt;
 4    for (&amp;lt;tex&amp;gt; B_j \in B&amp;lt;/tex&amp;gt;):&lt;br /&gt;
 5      ans = max(ans, Decompose(&amp;lt;tex&amp;gt; B_j &amp;lt;/tex&amp;gt;))&lt;br /&gt;
 6    return ans&lt;br /&gt;
&lt;br /&gt;
Из доказанной ранее леммы следует, что &amp;lt;tex&amp;gt; f_{max}(\{ 1 \ldots n \}) = \max\limits_{j} f_{max}(B_j) &amp;lt;/tex&amp;gt;, поэтому расписание для всего множества работ, поделенного на блоки, также будет оптимальным и корректным.&lt;br /&gt;
&lt;br /&gt;
== Время работы ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Время работы алгоритма MakeSchedule — &amp;lt;tex&amp;gt; O(n^2) &amp;lt;/tex&amp;gt; операций.&lt;br /&gt;
|proof=&lt;br /&gt;
Обозначим за &amp;lt;tex&amp;gt; P(n) &amp;lt;/tex&amp;gt; время, необходимое для выполнения алгоритма MakeSchedule на n работах. Очевидно, для корректно определенной функции P в силу структуры алгоритма должно выполняться неравенство:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; P(n) \ge сn + \sum\limits_{i = 1}^{k} P(n_i) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;tex&amp;gt; n_i &amp;lt;/tex&amp;gt; - размер блока с номером &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, построенного алгоритмом Blocks(). Заметим, что &amp;lt;tex&amp;gt; \sum\limits_{i = 1}^{k} n_i = n - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt; P(n) = an^2 &amp;lt;/tex&amp;gt;, то имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; an^2 \ge cn + a \sum\limits_{i = 1}^{k} n_i^2 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; n^2 &amp;gt; (n - 1)^2 = (\sum\limits_{i = 1}^{k} n_i)^2 = \sum\limits_{i = 1}^{k} n_i^2 + 2\sum\limits_{\substack{i, j = 1\\ i \ne j}}^{k} n_i n_j &amp;lt;/tex&amp;gt;, то можно переписать неравенство в следующем виде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; 2a \sum\limits_{\substack{i, j = 1\\ i \ne j}}^{k} n_i n_j \ge cn &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы получить максимальную нижнюю оценку на &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt;, оценим снизу &amp;lt;tex&amp;gt; \sum\limits_{i, j = 1}^{k} n_i n_j &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \sum\limits_{\substack{i, j = 1\\ i \ne j}}^{k} n_i n_j \ge \sum\limits_{\substack{i, j = 1\\ i \ne j}}^{k} 1 \cdot n_j = \sum\limits_{j = 1}^{k} (k - 1) n_j = (k - 1) (n - 1) \ge \frac{nk}{4}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Значит, при &amp;lt;tex&amp;gt; a \ge \frac{c}{2} \frac{n}{\frac{nk}{4}} = \frac{2c}{k} &amp;lt;/tex&amp;gt; требуемое неравенство будет выполняться.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 379 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>217.66.152.156</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=QpmtnriLmax&amp;diff=23723</id>
		<title>QpmtnriLmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=QpmtnriLmax&amp;diff=23723"/>
				<updated>2012-06-04T13:25:59Z</updated>
		
		<summary type="html">&lt;p&gt;217.66.152.156: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Figure_5.2.png|400px|thumb|right|Рис. 1 - Исходная сеть]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Рассмотрим еще одну задачу на нахождение расписания:&lt;br /&gt;
&lt;br /&gt;
# Каждое задание имеет своё времени выпуска &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Срок завершения(дедлайн) &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Требуется минимизировать опоздание &amp;lt;tex&amp;gt;L_i = C_i - d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Алгоритм решения==&lt;br /&gt;
[[Файл:Figure_5.9.a.png|200px|thumb|right|Рис. 2.1 - Заменённая подсеть]]&lt;br /&gt;
&lt;br /&gt;
Применим бинарный поиск. Таким образом сведем задачу к поиску потока сети.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; t_1 &amp;lt; t_2 &amp;lt;...&amp;lt; t_r &amp;lt;/tex&amp;gt; упорядоченная последовательности всех значений &amp;lt;tex&amp;gt;r_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Определим &amp;lt;tex&amp;gt; I_K := [t_{K-1}, t_K], \  T_K = t_K-t_{K-−1} &amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt; K = 2,..., r &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширим сеть, показанную на Рис. 1 следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; - произвольный интервал-узел. Обозначим через &amp;lt;tex&amp;gt; J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt; набор предшественников узла &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt;, тогда замененная нами подсеть(Рис. 2.1) определяется как &amp;lt;tex&amp;gt; I_K, J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt;. Расширение сети показано на Рис. 2.2.&lt;br /&gt;
&lt;br /&gt;
Cчитаем, что станки индексируются в порядке невозрастания скоростей &amp;lt;tex&amp;gt; s_1 \ge s_2 \ge . . . \ge s_m &amp;lt;/tex&amp;gt;, кроме того &amp;lt;tex&amp;gt;s_{m+1} = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расширенная подсеть строится путем добавления к вершинам &amp;lt;tex&amp;gt; I_K, J_{i_1}, J_{i_2}, . . . , J_{i_s} &amp;lt;/tex&amp;gt; вершин &amp;lt;tex&amp;gt;(K, 1), (K, 2), . . . (K, m) &amp;lt;/tex&amp;gt;. При &amp;lt;tex&amp;gt;j = 1,..., m &amp;lt;/tex&amp;gt;, есть дуги от &amp;lt;tex&amp;gt;(K, j)&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; с емкостью &amp;lt;tex&amp;gt; j(s_j - s_{j+1}) T_K &amp;lt;/tex&amp;gt; и для всех &amp;lt;tex&amp;gt;ν = 1,. . . , s&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;j = 1,. . ., m&amp;lt;/tex&amp;gt; существует дуга из &amp;lt;tex&amp;gt;J_{i_ν}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;(K, J)&amp;lt;/tex&amp;gt; с емкостью &amp;lt;tex&amp;gt; (s_j - s_{j+1}) T_K &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для каждого &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; у нас есть такие расширения. Кроме того, мы сохраняем дуги из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;J_i&amp;lt;/tex&amp;gt; емкостью &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; и дуги из &amp;lt;tex&amp;gt;I_K&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; емкостью &amp;lt;tex&amp;gt;S_mT_K&amp;lt;/tex&amp;gt; (Рис. 1).&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Следующие свойства эквивалентны:&lt;br /&gt;
&lt;br /&gt;
(А) Существует допустимое расписание.&lt;br /&gt;
&lt;br /&gt;
(Б) В расширенной сети существует поток от s до t со значением &amp;lt;tex&amp;gt;\sum\limits_{i=1}^{n} p_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Файл:Figure_5.9.b.png|500px|thumb|right|Рис. 2.2 - Расширение сети]]&lt;br /&gt;
&lt;br /&gt;
==Время работы==&lt;br /&gt;
&lt;br /&gt;
Работа с максимальным потоком в расширенной сети занимает &amp;lt;tex&amp;gt;O (m n^3)&amp;lt;/tex&amp;gt; шагов, проверка может быть сделана с такой же скоростью. Для решения &amp;lt;tex&amp;gt;Q|pmtn; r_{i}|L_{max}&amp;lt;/tex&amp;gt; мы используем бинарный поиск, получается алгоритм со сложностью &amp;lt;tex&amp;gt;O (mn^3(log(n) + log (\max\limits_{i=1}^{n} p_i)) &amp;lt;/tex&amp;gt;, потому как &amp;lt;tex&amp;gt;L_{max}&amp;lt;/tex&amp;gt;, ограничен &amp;lt;tex&amp;gt;n \max\limits_{i=1}^{n}p_i&amp;lt;/tex&amp;gt;, при &amp;lt;tex&amp;gt;s_1 = 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Q | pmtn; ri | Cmax&amp;lt;/tex&amp;gt; представляет собой частный случай &amp;lt;tex&amp;gt;Q | pmtn; ri | Lmax&amp;lt;/tex&amp;gt;, и может быть решена более эффективно. Labetoulle, Lawler, Lenstra, и Rinnooy Kan разработали алгоритм работающий за &amp;lt;tex&amp;gt; O(n log(n) + mn) &amp;lt;/tex&amp;gt; специально для этого случая.&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement= Задача &amp;lt;tex&amp;gt;Q | pmtn | Lmax&amp;lt;/tex&amp;gt; может быть решена за &amp;lt;tex&amp;gt; O(n log(n) + mn) &amp;lt;/tex&amp;gt; шагов.&lt;br /&gt;
|proof= &lt;br /&gt;
Решение &amp;lt;tex&amp;gt;Q | pmtn; ri | Cmax&amp;lt;/tex&amp;gt; эквивалентно нахождению наименьшего  &amp;lt;tex&amp;gt;T \ge 0&amp;lt;/tex&amp;gt;, такого, что задача с допустимым временным интервалом &amp;lt;tex&amp;gt;[r_i, T] (i = 1, . . . , n)&amp;lt;/tex&amp;gt; имеет решение.&lt;br /&gt;
&lt;br /&gt;
С другой стороны, решение &amp;lt;tex&amp;gt;Q | pmtn | Lmax&amp;lt;/tex&amp;gt; эквивалентно нахождению такого наименьшего &amp;lt;tex&amp;gt;T \ge 0&amp;lt;/tex&amp;gt;, такого, что задача с временным интервалом &amp;lt;tex&amp;gt;[0, d_i + T]&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;[−T, d_i]&amp;lt;/tex&amp;gt; имеет решение.&lt;br /&gt;
}}&lt;br /&gt;
Таким образом, задачи &amp;lt;tex&amp;gt;Q | pmtn; ri | Cmax&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Q | pmtn | Lmax&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;br /&gt;
&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>217.66.152.156</name></author>	</entry>

	</feed>