<?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=178.178.30.92&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=178.178.30.92&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/178.178.30.92"/>
		<updated>2026-05-19T16:38:21Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:J2pij1Lmax&amp;diff=26438</id>
		<title>Обсуждение:J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:J2pij1Lmax&amp;diff=26438"/>
				<updated>2012-06-21T22:01:21Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.30.92: Новая страница: «Доказательства довольно крупные.»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Доказательства довольно крупные.&lt;/div&gt;</summary>
		<author><name>178.178.30.92</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26437</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26437"/>
				<updated>2012-06-21T22:00:23Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.30.92: /* Доказательство */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Условие задачи==&lt;br /&gt;
В нотации Грэхема задача носит название &amp;lt;tex&amp;gt;J2\mid p_{ij} = 1\mid L_{max}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&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;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(j = 1,\ldots n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если  &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt; операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&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;d_i \ge 0&amp;lt;/tex&amp;gt; необходимо найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\max\{C_i - d_i | i = 1, \ldots, n\}&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;n_i&amp;lt;/tex&amp;gt; и машиной, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \sum_{i=1}^n N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхнюю границу момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два списка &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,\ldots,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \varnothing&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&gt;
&amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; {{---}} время окончания работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в достижимом расписании &amp;lt;tex&amp;gt;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = \max\{t + 1 | A(t)\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
* Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
* Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;\max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующий список (на самом деле это должен быть heap для хорошей асимптотики) &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру списка &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одного списка могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответствующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 '''main()'''&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; &amp;lt; r&lt;br /&gt;
       '''for''' j: 1 '''to''' n_i&lt;br /&gt;
         добавить &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L(d_i - n_i + j)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       добавить работу i в Z&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     LAST(i) = 0;&lt;br /&gt;
   T1 = 0;&lt;br /&gt;
   T2 = 0;&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;L(k) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Выбрать задание &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;L(k)\setminus\{O_{ij}\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) &lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;z \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Выбрать работу i из Z&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;Z \setminus\{i\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' j: 1 '''to''' &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) 	&lt;br /&gt;
&lt;br /&gt;
 '''schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\mu_{ij}&amp;lt;/tex&amp;gt; == A&lt;br /&gt;
     '''if''' T1 &amp;lt; LAST(i) &lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; (*)&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T1;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;A(T_1)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T1 = T1 + 1;&lt;br /&gt;
   '''else'''&lt;br /&gt;
     '''if''' T2 &amp;lt; LAST(i)&lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       B(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; (**)&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T2;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;B(T_2) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T2 = T2 + 1;&lt;br /&gt;
   LAST(i) = t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство==&lt;br /&gt;
&lt;br /&gt;
Для доказательство того, что алгоритм решения задачи корректен, необходимо показать то, что он строит достижимое расписание. Это справедливо тогда и только тогда, когда до исполнения строчек (*) и (**) пусты A(t) и B(t) соответственно. Иначе две разные операции будут выполняться в один момент времени на одной машине. Для того, чтобы показать достижимость докажем лемму. &lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma6.12 &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;Y = (A(t), B(t))&amp;lt;/tex&amp;gt; — расписание, где &amp;lt;tex&amp;gt;B(t) = \emptyset&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(A(t) = \emptyset)&amp;lt;/tex&amp;gt;. Тогда для каждого &amp;lt;tex&amp;gt;s &amp;gt; t&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;B(s) = O_{ij}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(A(s) = O_{ij})&amp;lt;/tex&amp;gt; выполняется &amp;lt;tex&amp;gt;A(s -1) = O_{i, j - 1}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(B(s - 1) = O_{i, j -1}))&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof={{в разработке}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=theorem6.13. &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; — операция, которую планируют строчкой (*) или (**) и &amp;lt;tex&amp;gt;t = LAST(i) &amp;gt; T1(T2)&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;A(t) = \emptyset&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(B(t) = \emptyset)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof={{в разработке}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma6.14 &lt;br /&gt;
|statement=Если существует расписание без опозданий, то данный алгоритм построит расписание без опозданий.&lt;br /&gt;
|proof={{в разработке}} &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=theorem6.15. &lt;br /&gt;
|statement=Расписание, построенное данным алгоритмом, оптимально.&lt;br /&gt;
|proof={{в разработке}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 180 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>178.178.30.92</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26436</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26436"/>
				<updated>2012-06-21T21:47:35Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.30.92: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Условие задачи==&lt;br /&gt;
В нотации Грэхема задача носит название &amp;lt;tex&amp;gt;J2\mid p_{ij} = 1\mid L_{max}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&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;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(j = 1,\ldots n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если  &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt; операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&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;d_i \ge 0&amp;lt;/tex&amp;gt; необходимо найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\max\{C_i - d_i | i = 1, \ldots, n\}&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;n_i&amp;lt;/tex&amp;gt; и машиной, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \sum_{i=1}^n N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхнюю границу момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два списка &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,\ldots,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \varnothing&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&gt;
&amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; {{---}} время окончания работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в достижимом расписании &amp;lt;tex&amp;gt;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = \max\{t + 1 | A(t)\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
* Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
* Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;\max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующий список (на самом деле это должен быть heap для хорошей асимптотики) &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру списка &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одного списка могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответствующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 '''main()'''&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; &amp;lt; r&lt;br /&gt;
       '''for''' j: 1 '''to''' n_i&lt;br /&gt;
         добавить &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L(d_i - n_i + j)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       добавить работу i в Z&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     LAST(i) = 0;&lt;br /&gt;
   T1 = 0;&lt;br /&gt;
   T2 = 0;&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;L(k) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Выбрать задание &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;L(k)\setminus\{O_{ij}\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) &lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;z \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Выбрать работу i из Z&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;Z \setminus\{i\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' j: 1 '''to''' &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) 	&lt;br /&gt;
&lt;br /&gt;
 '''schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\mu_{ij}&amp;lt;/tex&amp;gt; == A&lt;br /&gt;
     '''if''' T1 &amp;lt; LAST(i) &lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; (*)&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T1;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;A(T_1)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T1 = T1 + 1;&lt;br /&gt;
   '''else'''&lt;br /&gt;
     '''if''' T2 &amp;lt; LAST(i)&lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       B(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; (**)&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T2;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;B(T_2) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T2 = T2 + 1;&lt;br /&gt;
   LAST(i) = t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство==&lt;br /&gt;
&lt;br /&gt;
Для доказательство того, что алгоритм решения задачи корректен, необходимо показать то, что он строит достижимое расписание. Это справедливо тогда и только тогда, когда до исполнения строчек (*) и (**) пусты A(t) и B(t) соответственно. Иначе две разные операции будут выполняться в один момент времени на одной машине. Для того, чтобы показать достижимость докажем лемму. &lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma6.12 &lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;Y = (A(t), B(t))&amp;lt;/tex&amp;gt; — расписание, где &amp;lt;tex&amp;gt;B(t) = \emptyset&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(A(t) = \emptyset)&amp;lt;/tex&amp;gt;. Тогда для каждого &amp;lt;tex&amp;gt;s &amp;gt; t&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;B(s) = O_{ij}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(A(s) = O_{ij})&amp;lt;/tex&amp;gt; выполняется &amp;lt;tex&amp;gt;A(s -1) = O_{i, j - 1}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(B(s - 1) = O_{i, j -1}))&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 180 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>178.178.30.92</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26434</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26434"/>
				<updated>2012-06-21T21:28:12Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.30.92: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Условие задачи==&lt;br /&gt;
В нотации Грэхема задача носит название &amp;lt;tex&amp;gt;J2\mid p_{ij} = 1\mid L_{max}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&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;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(j = 1,\ldots n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если  &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt; операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&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;d_i \ge 0&amp;lt;/tex&amp;gt; необходимо найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\max\{C_i - d_i | i = 1, \ldots, n\}&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;n_i&amp;lt;/tex&amp;gt; и машиной, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \sum_{i=1}^n N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхнюю границу момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два списка &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,\ldots,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \varnothing&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&gt;
&amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; {{---}} время окончания работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в достижимом расписании &amp;lt;tex&amp;gt;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = \max\{t + 1 | A(t)\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
* Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
* Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;\max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующий список (на самом деле это должен быть heap для хорошей асимптотики) &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру списка &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одного списка могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответствующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 '''main()'''&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; &amp;lt; r&lt;br /&gt;
       '''for''' j: 1 '''to''' n_i&lt;br /&gt;
         добавить &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L(d_i - n_i + j)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       добавить работу i в Z&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     LAST(i) = 0;&lt;br /&gt;
   T1 = 0;&lt;br /&gt;
   T2 = 0;&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;L(k) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Выбрать задание &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;L(k)\setminus\{O_{ij}\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) &lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;z \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Выбрать работу i из Z&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;Z \setminus\{i\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' j: 1 '''to''' &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) 	&lt;br /&gt;
&lt;br /&gt;
 '''schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\mu_{ij}&amp;lt;/tex&amp;gt; == A&lt;br /&gt;
     '''if''' T1 &amp;lt; LAST(i) &lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T1;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;A(T_1)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T1 = T1 + 1;&lt;br /&gt;
   '''else'''&lt;br /&gt;
     '''if''' T2 &amp;lt; LAST(i)&lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       B(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T2;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;B(T_2) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T2 = T2 + 1;&lt;br /&gt;
   LAST(i) = t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 180 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>178.178.30.92</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26432</id>
		<title>J2pij1Lmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=J2pij1Lmax&amp;diff=26432"/>
				<updated>2012-06-21T21:25:55Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.30.92: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Условие задачи==&lt;br /&gt;
В нотации Грэхема задача носит название &amp;lt;tex&amp;gt;J2\mid p_{ij} = 1\mid L_{max}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и две машины, обозначенные как &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&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;n_i&amp;lt;/tex&amp;gt; операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(j = 1,\ldots n_i)&amp;lt;/tex&amp;gt;, которые должны быть выполнены последовательно и, при этом, если  &amp;lt;tex&amp;gt;O_{ij} &amp;lt;/tex&amp;gt; операция была совершена на машине &amp;lt;tex&amp;gt;A (B)&amp;lt;/tex&amp;gt;, то операция &amp;lt;tex&amp;gt;O_{i,j-1}&amp;lt;/tex&amp;gt; должна быть совершена на машине &amp;lt;tex&amp;gt;B (A)&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;d_i \ge 0&amp;lt;/tex&amp;gt; необходимо найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\max\{C_i - d_i | i = 1, \ldots, n\}&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;n_i&amp;lt;/tex&amp;gt; и машиной, на которой была совершена первая операция. Пусть &amp;lt;tex&amp;gt;r = \sum_{i=1}^n N_i&amp;lt;/tex&amp;gt; {{---}} общее количество операций.&lt;br /&gt;
&lt;br /&gt;
Допустим, самым ранним моментом, когда операция может начать выполняться, будет момент времени 0, а верхнюю границу момента начала выполнения последней операции обозначим за &amp;lt;tex&amp;gt;t_{max}&amp;lt;/tex&amp;gt;. К примеру, мы можем выбрать &amp;lt;tex&amp;gt;t_{max} = r&amp;lt;/tex&amp;gt;. Тогда расписание можно представить как два списка &amp;lt;tex&amp;gt;A(t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B(t) (t = 0,\ldots,t_{max})&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;, если операция &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; должна выполниться на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в момент времени &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A(t) =&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \varnothing&amp;lt;/tex&amp;gt;, если машина &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; простаивает в этот момент. И для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;, выполняющейся на машине &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; существует &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, для которого &amp;lt;tex&amp;gt;A(t) = O_{ij}&amp;lt;/tex&amp;gt;. Аналогично для &amp;lt;tex&amp;gt;B_i&amp;lt;/tex&amp;gt;. Расписание достижимо тогда и только тогда, когда из &amp;lt;tex&amp;gt;A(t) (B(t)) = O_{ij} , 1 &amp;lt; j \le n_i&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;O_{i,j-1} = B(s) (A(s))&amp;lt;/tex&amp;gt; для некоторого &amp;lt;tex&amp;gt;s &amp;lt; t&amp;lt;/tex&amp;gt;, и первая операция для каждой работы запланирована на нужной машине. Перестановку всех операций будем называть списком. Для данный списка &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; осуществимое расписание может быть создано следующим способом: планируем выполнять операции в порядке, соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, причем каждую операцию стараемся выполнить как можно раньше. Подобное расписание будем называть соответствующим &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписанием.  &lt;br /&gt;
&amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; {{---}} время окончания работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в достижимом расписании &amp;lt;tex&amp;gt;y = (A(t), B(t))&amp;lt;/tex&amp;gt; можно рассчитать как:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;C_i = \max\{t + 1 | A(t)\}&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;B(t)&amp;lt;/tex&amp;gt; {{---}} операция &amp;lt;tex&amp;gt;i&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;d_i \ge 0&amp;lt;/tex&amp;gt; мы хотим найти достижимое расписание с наименьшими максимальным временем опоздания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\max\{C_i - d_i | i = 1, \ldots, n\}&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм решает эту задачу:&lt;br /&gt;
&lt;br /&gt;
* Введём для каждой операции &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt;&lt;br /&gt;
* Создадим список всех операций &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt;, упорядоченный в порядке неубывания значений &amp;lt;tex&amp;gt;l(O_{ij})&amp;lt;/tex&amp;gt; &lt;br /&gt;
* Найдем соответствующее списку &amp;lt;tex&amp;gt;L&amp;lt;/tex&amp;gt; расписание.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм может быть реализованным с асимптотикой &amp;lt;tex&amp;gt;O(r \log r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что &amp;lt;tex&amp;gt;d_i \ge 0&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и хотя бы для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt;. Иначе, вычтем из всех &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; минимальное значение по &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;C_i \ge 1&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;i = 1,\ldots,n&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d_i = 0&amp;lt;/tex&amp;gt; справедливо &amp;lt;tex&amp;gt;L_i = C_i - d_i \ge 1&amp;lt;/tex&amp;gt; как минимум для одной работы &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. К тому же, можно предположить, что &amp;lt;tex&amp;gt;C_i \le r&amp;lt;/tex&amp;gt;. Таким образом, работы с &amp;lt;tex&amp;gt;d_i &amp;gt; r - 1&amp;lt;/tex&amp;gt;, то есть c &amp;lt;tex&amp;gt;L_i = C_i - d_i &amp;lt; 1&amp;lt;/tex&amp;gt; можно смело игнорировать. Они не влияют на значение улучшаемой функции &amp;lt;tex&amp;gt;\max(L_i)&amp;lt;/tex&amp;gt;, так как для некого &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;L_i \ge 1&amp;lt;/tex&amp;gt; Можно выполнять эти работы в любом порядке после всех остальных. Для оставшихся операций &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; мы имеем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;-r + 1 \le l(O_{ij}) = d_i - n_i + j \le r - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждую операцию мы кладём в соответствующий список (на самом деле это должен быть heap для хорошей асимптотики) &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k = l(O_{ij}) = d_i - n_i + j&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(-r + 1 \le k \le r - 1)&amp;lt;/tex&amp;gt;. На втором шаге мы планируем операции соответственно возрастающему по номеру списка &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; порядку, где операции из одного списка могут выполнятся в произвольном порядке.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
Давайте детально рассмотрим алгоритм. &amp;lt;tex&amp;gt;T1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T2&amp;lt;/tex&amp;gt; обозначают первый период времени &amp;lt;tex&amp;gt;t \ge 0&amp;lt;/tex&amp;gt;, когда соответствующие машины &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; бездействуют. &amp;lt;tex&amp;gt;LAST(i)&amp;lt;/tex&amp;gt; обозначает время окончания последней запланированной операции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-той работы. &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; {{---}} множество работ, где &amp;lt;tex&amp;gt;d_i \ge r&amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 '''main()'''&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;\emptyset&amp;lt;/tex&amp;gt;;&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     '''if''' &amp;lt;tex&amp;gt;d_i&amp;lt;/tex&amp;gt; &amp;lt; r&lt;br /&gt;
       '''for''' j: 1 '''to''' n_i&lt;br /&gt;
         добавить &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;L(d_i - n_i + j)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       добавить работу i в Z&lt;br /&gt;
   '''for''' i: 1 '''to''' n&lt;br /&gt;
     LAST(i) = 0;&lt;br /&gt;
   T1 = 0;&lt;br /&gt;
   T2 = 0;&lt;br /&gt;
   '''for''' k: -r + 1 '''to''' r - 1&lt;br /&gt;
     '''while''' &amp;lt;tex&amp;gt;L(k) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Выбрать задание &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;L(k)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;L(k)\setminus\{O_{ij}\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) &lt;br /&gt;
   '''while''' &amp;lt;tex&amp;gt;z \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
     Выбрать работу i из Z&lt;br /&gt;
     Z = &amp;lt;tex&amp;gt;Z \setminus\{i\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
     '''for''' j: 1 '''to''' &amp;lt;tex&amp;gt;n_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
       schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;) 	&lt;br /&gt;
&lt;br /&gt;
 '''schedule(&amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\mu_{ij}&amp;lt;/tex&amp;gt; == A&lt;br /&gt;
     '''if''' T1 &amp;lt; LAST(i) &lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T1;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;A(T_1)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T1 = T1 + 1;&lt;br /&gt;
   '''else'''&lt;br /&gt;
     '''if''' T2 &amp;lt; LAST(i)&lt;br /&gt;
       t = LAST(i)&lt;br /&gt;
       B(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''else'''&lt;br /&gt;
       t = T2;&lt;br /&gt;
       A(t) = &amp;lt;tex&amp;gt;O_{ij}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
       '''while''' &amp;lt;tex&amp;gt;B(T_2) \ne \emptyset&amp;lt;/tex&amp;gt;&lt;br /&gt;
         T2 = T2 + 1;&lt;br /&gt;
   LAST(i) = t + 1&lt;br /&gt;
&lt;br /&gt;
Очевидно, что количество шагов алгоритма ограничено &amp;lt;tex&amp;gt;O(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 180 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>178.178.30.92</name></author>	</entry>

	</feed>