<?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.122.160.191&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.122.160.191&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.122.160.191"/>
		<updated>2026-06-11T14:26:21Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Qtr/1&amp;diff=54896</id>
		<title>Участник:Qtr/1</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Qtr/1&amp;diff=54896"/>
				<updated>2016-06-07T20:25:14Z</updated>
		
		<summary type="html">&lt;p&gt;91.122.160.191: /* Более простой случай */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tex dpi = &amp;quot;200&amp;quot;&amp;gt; 1 \mid p_{i}=1 \mid \sum\nolimits w_iU_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Дано &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt; станок. Для каждой работы известны её дедлайн &amp;lt;tex&amp;gt; d_{i} &amp;lt;/tex&amp;gt; и вес &amp;lt;tex&amp;gt; w_{i} &amp;lt;/tex&amp;gt;. Время выполнения всех работ &amp;lt;tex&amp;gt; p_i &amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;. Требуется минимизировать &amp;lt;tex&amp;gt;\sum w_{i} U_{i}&amp;lt;/tex&amp;gt;, то есть суммарный вес всех просроченных работ.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
Идея алгоритма состоит в том, чтобы на шаге &amp;lt;tex&amp;gt; k &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; k &amp;lt;/tex&amp;gt; работ, тогда множество &amp;lt;tex&amp;gt; S_{k} &amp;lt;/tex&amp;gt; содержит только те работы, которые мы успеваем выполнить в порядке неуменьшения их дедлайнов при оптимальном составлении расписания . Рассмотрим работу &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;. Если мы успеваем выполнить данную работу до ее дедлайна, то добавим ее во множество &amp;lt;tex&amp;gt; S_{k} &amp;lt;/tex&amp;gt;, тем самым получив &amp;lt;tex&amp;gt; S_{k + 1} &amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt; работу выполнить до дедлайна мы не успеваем, то найдем в &amp;lt;tex&amp;gt; S_{k} &amp;lt;/tex&amp;gt; работу &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; с наименьшим весом &amp;lt;tex&amp;gt; w_{l} &amp;lt;/tex&amp;gt; и заменим ее на работу &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, рассмотрев все работы, мы получим &amp;lt;tex&amp;gt; S_{n} &amp;lt;/tex&amp;gt; {{---}} множество работ, которые мы успеваем выполнить до наступления их дедлайнов, причем вес просроченных работ будет наименьшим. От порядка выполнения просроченных работ ничего не зависит, поэтому расположить в расписании их можно произвольным образом.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
Предполагаем, что перед началом выполнения алгоритма выполняется, что &amp;lt;tex&amp;gt; 1 \leqslant d_{1} \leqslant d_{2} \leqslant ... \leqslant d_{n} &amp;lt;/tex&amp;gt;. Все работы, дедлайн которых равен &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, мы в любом случае выполнить без штрафа не успеем, поэтому их изначально можно отнести к просроченным.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; {{---}} множество непросроченных работ, &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; {{---}} текущее время.&lt;br /&gt;
&lt;br /&gt;
 '''Set'''&amp;lt;'''int'''&amp;gt; p1sumwu('''int''' &amp;lt;tex&amp;gt;w[n]&amp;lt;/tex&amp;gt;, '''int''' &amp;lt;tex&amp;gt;d[n]&amp;lt;/tex&amp;gt;):&lt;br /&gt;
   '''int''' &amp;lt;tex&amp;gt; t = 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''Set'''&amp;lt;'''int'''&amp;gt; &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\{\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''for''' &amp;lt;tex&amp;gt; i = 1 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt; s = s \cup \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''if''' &amp;lt;tex&amp;gt; d_{i}  \geqslant t &amp;lt;/tex&amp;gt;     &lt;br /&gt;
         &amp;lt;tex&amp;gt; t = t + 1 &amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''else'''&lt;br /&gt;
         найти такое &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt; w_{k} = \min \{ w_{j} \mid j \in s\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt; s = s \setminus \{k\} &amp;lt;/tex&amp;gt;    &lt;br /&gt;
   '''return''' &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Доказательство корректности ==&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Алгоритм строит корректное расписание.&lt;br /&gt;
|proof=Если мы успеваем выполнить очередную работу, то, очевидно, от ее добавления, расписание не может стать некорректным. В противном случае мы пытаемся заменить одну работу из множества &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; на текущую. Но это так же не может сделать наше расписание некорректным. Это следует из того, что мы рассматриваем работы в порядке неуменьшениях их дедлайнов. Пусть мы заменяем работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Но &amp;lt;tex&amp;gt; d_{k} \leqslant d_{i} &amp;lt;/tex&amp;gt;, следовательно, если мы успевали выполнить работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, то успеем выполнить и работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Построенное данным алгоритмом расписание оптимально.&lt;br /&gt;
|proof=Пусть &amp;lt;tex&amp;gt; S^* &amp;lt;/tex&amp;gt; множество непросроченных работ в оптимальном расписании. Также пусть &amp;lt;tex&amp;gt; l &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; k &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; S^* &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; S^* \subseteq S &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; должно быть тоже оптимальным, и правильность алгоритма доказана.&lt;br /&gt;
&lt;br /&gt;
Для доказательства покажем, что мы можем заменить работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; в оптимальном расписании, не увеличивая минимизируемую функцию.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим два случая:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt; l &amp;lt; k &amp;lt;/tex&amp;gt;&lt;br /&gt;
Так как работа &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; не содержится в &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;, то либо она не была добавлена при ее рассмотрении, либо была заменена работой, рассмотренной позднее. В любом случае это означает, что &amp;lt;tex&amp;gt; w_{k} \leqslant w_{l} &amp;lt;/tex&amp;gt;. Так же по определению &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; все работы &amp;lt;tex&amp;gt; i \in S^* : i &amp;lt; k &amp;lt;/tex&amp;gt; должны содержаться и в &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Но тогда заменив в оптимальном расписании &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;, мы сохраним корректность расписания и не увеличим минимизируемую функцию.&lt;br /&gt;
*&amp;lt;tex&amp;gt; k &amp;lt; l &amp;lt;/tex&amp;gt;&lt;br /&gt;
Так как мы рассматриваем работы в порядке неубывания их дедлайнов, то, следовательно, &amp;lt;tex&amp;gt; d_{k} \leqslant d_{l} &amp;lt;/tex&amp;gt;, и замена работы &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; в оптимальном расписании &amp;lt;tex&amp;gt; S^* &amp;lt;/tex&amp;gt; не может сделать его некорректным. Тогда для доказательства нам осталось показать, что &amp;lt;tex&amp;gt; w_{k} \leqslant w_{l} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; k_{i_{0}} = k &amp;lt;/tex&amp;gt; {{---}} работа, замененная работой &amp;lt;tex&amp;gt; i_{0} &amp;lt;/tex&amp;gt; в процессе построения &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;, и пусть &amp;lt;tex&amp;gt; k_{i_{1}}, ..., k_{i_{r}} &amp;lt;/tex&amp;gt; {{---}} последовательность работ, которые были исключены из &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; после замены &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, причем работа &amp;lt;tex&amp;gt; k_{i_{v}} &amp;lt;/tex&amp;gt; была заменена работой &amp;lt;tex&amp;gt; i_{v} &amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt; i_{0} &amp;lt; i_{1} &amp;lt; ... &amp;lt; i_{r} &amp;lt;/tex&amp;gt;. Будем говорить, что &amp;quot;работа &amp;lt;tex&amp;gt; i_{v} &amp;lt;/tex&amp;gt; подавляет &amp;lt;tex&amp;gt; i_{m} &amp;lt;/tex&amp;gt;&amp;quot;, где &amp;lt;tex&amp;gt; m &amp;lt; v &amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt; k_{i_{v}} \leqslant i_{m} &amp;lt;/tex&amp;gt;. В таком случае получаем, что &amp;lt;tex&amp;gt; w_{k_{i_{v}}} \geqslant w_{k_{i_{m}}}&amp;lt;/tex&amp;gt;, потому что в противном случае работа &amp;lt;tex&amp;gt; k_{i_{v}} &amp;lt;/tex&amp;gt; была бы исключена из &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; раньше чем &amp;lt;tex&amp;gt; k_{i_{m}} &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если в последовательности &amp;lt;tex&amp;gt; i_{0} &amp;lt; i_{1} &amp;lt; ... &amp;lt; i_{r} &amp;lt;/tex&amp;gt; существует подпоследовательность &amp;lt;tex&amp;gt; j_{0} = i_{0} &amp;lt; j_{1} &amp;lt; ... &amp;lt; j_{s} &amp;lt;/tex&amp;gt; такая, что &amp;lt;tex&amp;gt; j_{v + 1} &amp;lt;/tex&amp;gt; подавляет &amp;lt;tex&amp;gt; j_{v} &amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt; v = 0,1, ..., s - 1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j_{s - 1} &amp;lt; l \leqslant j_{s} &amp;lt;/tex&amp;gt;, то получаем, что &amp;lt;tex&amp;gt; w_{l} \geqslant w_{k_{j_{s}}} \geqslant ... \geqslant w_{k_{j_{0}}} = w_{k} &amp;lt;/tex&amp;gt;, что доказывает оптимальность расписания &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что отсутствие такой подпоследовательности приведет нас к противоречию, из чего будет следовать ее существование.&lt;br /&gt;
&lt;br /&gt;
Предположим, что такой подпоследовательности не существует. Тогда найдем наименьшее &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; такое, что не существует работы &amp;lt;tex&amp;gt; i_{v} : v &amp;gt; t &amp;lt;/tex&amp;gt;, которая бы подавляла работу &amp;lt;tex&amp;gt; i_{t} &amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt; i_{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; i_{t} &amp;lt;/tex&amp;gt; и из факта, что &amp;lt;tex&amp;gt; i_{t} &amp;lt; l &amp;lt;/tex&amp;gt;, получаем, что после добавления во множество &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; работы &amp;lt;tex&amp;gt; i_{t} &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; i_t &amp;lt; l &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; S_t &amp;lt;/tex&amp;gt; это множество &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; после замены работы &amp;lt;tex&amp;gt; k_{i_t} &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; i_t &amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt; k_{i_t} &amp;gt; k &amp;lt;/tex&amp;gt;, то в оптимальном расписании &amp;lt;tex&amp;gt; S^* &amp;lt;/tex&amp;gt; мы можем заменить работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; k_{i_t} &amp;lt;/tex&amp;gt;, поскольку &amp;lt;tex&amp;gt; d_{k_{i_t}} \geqslant d_k &amp;lt;/tex&amp;gt;. Но так как &amp;lt;tex&amp;gt; S_t \subset S^* &amp;lt;/tex&amp;gt;, то все работы из множества &amp;lt;tex&amp;gt; S_t \cup \{k_{i_t}\} &amp;lt;/tex&amp;gt; могут быть выполнены до их дедлайнов, что противоречит построению &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Следовательно, &amp;lt;tex&amp;gt; k_{i_t} &amp;lt; k &amp;lt;/tex&amp;gt;. Тогда аналогично предыдущему случаю получаем, что все работы из множества &amp;lt;tex&amp;gt; S_t \cup \{k\} &amp;lt;/tex&amp;gt; могут быть выполнены вовремя. Кроме того, все работы из &amp;lt;tex&amp;gt; \{ j \in S_t | j &amp;lt; k \} \cup \{k_{i_t}\} &amp;lt;/tex&amp;gt; так же могут быть выполнены вовремя, что следует из построения &amp;lt;tex&amp;gt; S_t &amp;lt;/tex&amp;gt;. Но тогда получается, что все работы и из множества &amp;lt;tex&amp;gt; S_t \cup \{k_{i_t}\} &amp;lt;/tex&amp;gt; так же могут быть выполнены вовремя, что опять приводит нас к противоречию с построением &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Время работы ==&lt;br /&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; O(\log n) &amp;lt;/tex&amp;gt;, то время работы всего алгоритма будет составлять &amp;lt;tex&amp;gt; O(n\log n) &amp;lt;/tex&amp;gt;. Например, такими структурами данных являются [[Двоичная куча | двоичная куча]] и [[Красно-черное дерево | красно-черное дерево]].&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 96 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>91.122.160.191</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Qtr/1&amp;diff=54895</id>
		<title>Участник:Qtr/1</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Qtr/1&amp;diff=54895"/>
				<updated>2016-06-07T20:25:02Z</updated>
		
		<summary type="html">&lt;p&gt;91.122.160.191: /* Время работы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tex dpi = &amp;quot;200&amp;quot;&amp;gt; 1 \mid p_{i}=1 \mid \sum\nolimits w_iU_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Дано &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt; станок. Для каждой работы известны её дедлайн &amp;lt;tex&amp;gt; d_{i} &amp;lt;/tex&amp;gt; и вес &amp;lt;tex&amp;gt; w_{i} &amp;lt;/tex&amp;gt;. Время выполнения всех работ &amp;lt;tex&amp;gt; p_i &amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;. Требуется минимизировать &amp;lt;tex&amp;gt;\sum w_{i} U_{i}&amp;lt;/tex&amp;gt;, то есть суммарный вес всех просроченных работ.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
Идея алгоритма состоит в том, чтобы на шаге &amp;lt;tex&amp;gt; k &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; k &amp;lt;/tex&amp;gt; работ, тогда множество &amp;lt;tex&amp;gt; S_{k} &amp;lt;/tex&amp;gt; содержит только те работы, которые мы успеваем выполнить в порядке неуменьшения их дедлайнов при оптимальном составлении расписания . Рассмотрим работу &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;. Если мы успеваем выполнить данную работу до ее дедлайна, то добавим ее во множество &amp;lt;tex&amp;gt; S_{k} &amp;lt;/tex&amp;gt;, тем самым получив &amp;lt;tex&amp;gt; S_{k + 1} &amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt; работу выполнить до дедлайна мы не успеваем, то найдем в &amp;lt;tex&amp;gt; S_{k} &amp;lt;/tex&amp;gt; работу &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; с наименьшим весом &amp;lt;tex&amp;gt; w_{l} &amp;lt;/tex&amp;gt; и заменим ее на работу &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, рассмотрев все работы, мы получим &amp;lt;tex&amp;gt; S_{n} &amp;lt;/tex&amp;gt; {{---}} множество работ, которые мы успеваем выполнить до наступления их дедлайнов, причем вес просроченных работ будет наименьшим. От порядка выполнения просроченных работ ничего не зависит, поэтому расположить в расписании их можно произвольным образом.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
Предполагаем, что перед началом выполнения алгоритма выполняется, что &amp;lt;tex&amp;gt; 1 \leqslant d_{1} \leqslant d_{2} \leqslant ... \leqslant d_{n} &amp;lt;/tex&amp;gt;. Все работы, дедлайн которых равен &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, мы в любом случае выполнить без штрафа не успеем, поэтому их изначально можно отнести к просроченным.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; {{---}} множество непросроченных работ, &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; {{---}} текущее время.&lt;br /&gt;
&lt;br /&gt;
 '''Set'''&amp;lt;'''int'''&amp;gt; p1sumwu('''int''' &amp;lt;tex&amp;gt;w[n]&amp;lt;/tex&amp;gt;, '''int''' &amp;lt;tex&amp;gt;d[n]&amp;lt;/tex&amp;gt;):&lt;br /&gt;
   '''int''' &amp;lt;tex&amp;gt; t = 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''Set'''&amp;lt;'''int'''&amp;gt; &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\{\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''for''' &amp;lt;tex&amp;gt; i = 1 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt; s = s \cup \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''if''' &amp;lt;tex&amp;gt; d_{i}  \geqslant t &amp;lt;/tex&amp;gt;     &lt;br /&gt;
         &amp;lt;tex&amp;gt; t = t + 1 &amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''else'''&lt;br /&gt;
         найти такое &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt; w_{k} = \min \{ w_{j} \mid j \in s\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt; s = s \setminus \{k\} &amp;lt;/tex&amp;gt;    &lt;br /&gt;
   '''return''' &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Доказательство корректности ==&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Алгоритм строит корректное расписание.&lt;br /&gt;
|proof=Если мы успеваем выполнить очередную работу, то, очевидно, от ее добавления, расписание не может стать некорректным. В противном случае мы пытаемся заменить одну работу из множества &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; на текущую. Но это так же не может сделать наше расписание некорректным. Это следует из того, что мы рассматриваем работы в порядке неуменьшениях их дедлайнов. Пусть мы заменяем работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Но &amp;lt;tex&amp;gt; d_{k} \leqslant d_{i} &amp;lt;/tex&amp;gt;, следовательно, если мы успевали выполнить работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, то успеем выполнить и работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Построенное данным алгоритмом расписание оптимально.&lt;br /&gt;
|proof=Пусть &amp;lt;tex&amp;gt; S^* &amp;lt;/tex&amp;gt; множество непросроченных работ в оптимальном расписании. Также пусть &amp;lt;tex&amp;gt; l &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; k &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; S^* &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; S^* \subseteq S &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; должно быть тоже оптимальным, и правильность алгоритма доказана.&lt;br /&gt;
&lt;br /&gt;
Для доказательства покажем, что мы можем заменить работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; в оптимальном расписании, не увеличивая минимизируемую функцию.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим два случая:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt; l &amp;lt; k &amp;lt;/tex&amp;gt;&lt;br /&gt;
Так как работа &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; не содержится в &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;, то либо она не была добавлена при ее рассмотрении, либо была заменена работой, рассмотренной позднее. В любом случае это означает, что &amp;lt;tex&amp;gt; w_{k} \leqslant w_{l} &amp;lt;/tex&amp;gt;. Так же по определению &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; все работы &amp;lt;tex&amp;gt; i \in S^* : i &amp;lt; k &amp;lt;/tex&amp;gt; должны содержаться и в &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Но тогда заменив в оптимальном расписании &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;, мы сохраним корректность расписания и не увеличим минимизируемую функцию.&lt;br /&gt;
*&amp;lt;tex&amp;gt; k &amp;lt; l &amp;lt;/tex&amp;gt;&lt;br /&gt;
Так как мы рассматриваем работы в порядке неубывания их дедлайнов, то, следовательно, &amp;lt;tex&amp;gt; d_{k} \leqslant d_{l} &amp;lt;/tex&amp;gt;, и замена работы &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; в оптимальном расписании &amp;lt;tex&amp;gt; S^* &amp;lt;/tex&amp;gt; не может сделать его некорректным. Тогда для доказательства нам осталось показать, что &amp;lt;tex&amp;gt; w_{k} \leqslant w_{l} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; k_{i_{0}} = k &amp;lt;/tex&amp;gt; {{---}} работа, замененная работой &amp;lt;tex&amp;gt; i_{0} &amp;lt;/tex&amp;gt; в процессе построения &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;, и пусть &amp;lt;tex&amp;gt; k_{i_{1}}, ..., k_{i_{r}} &amp;lt;/tex&amp;gt; {{---}} последовательность работ, которые были исключены из &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; после замены &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, причем работа &amp;lt;tex&amp;gt; k_{i_{v}} &amp;lt;/tex&amp;gt; была заменена работой &amp;lt;tex&amp;gt; i_{v} &amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt; i_{0} &amp;lt; i_{1} &amp;lt; ... &amp;lt; i_{r} &amp;lt;/tex&amp;gt;. Будем говорить, что &amp;quot;работа &amp;lt;tex&amp;gt; i_{v} &amp;lt;/tex&amp;gt; подавляет &amp;lt;tex&amp;gt; i_{m} &amp;lt;/tex&amp;gt;&amp;quot;, где &amp;lt;tex&amp;gt; m &amp;lt; v &amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt; k_{i_{v}} \leqslant i_{m} &amp;lt;/tex&amp;gt;. В таком случае получаем, что &amp;lt;tex&amp;gt; w_{k_{i_{v}}} \geqslant w_{k_{i_{m}}}&amp;lt;/tex&amp;gt;, потому что в противном случае работа &amp;lt;tex&amp;gt; k_{i_{v}} &amp;lt;/tex&amp;gt; была бы исключена из &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; раньше чем &amp;lt;tex&amp;gt; k_{i_{m}} &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если в последовательности &amp;lt;tex&amp;gt; i_{0} &amp;lt; i_{1} &amp;lt; ... &amp;lt; i_{r} &amp;lt;/tex&amp;gt; существует подпоследовательность &amp;lt;tex&amp;gt; j_{0} = i_{0} &amp;lt; j_{1} &amp;lt; ... &amp;lt; j_{s} &amp;lt;/tex&amp;gt; такая, что &amp;lt;tex&amp;gt; j_{v + 1} &amp;lt;/tex&amp;gt; подавляет &amp;lt;tex&amp;gt; j_{v} &amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt; v = 0,1, ..., s - 1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j_{s - 1} &amp;lt; l \leqslant j_{s} &amp;lt;/tex&amp;gt;, то получаем, что &amp;lt;tex&amp;gt; w_{l} \geqslant w_{k_{j_{s}}} \geqslant ... \geqslant w_{k_{j_{0}}} = w_{k} &amp;lt;/tex&amp;gt;, что доказывает оптимальность расписания &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что отсутствие такой подпоследовательности приведет нас к противоречию, из чего будет следовать ее существование.&lt;br /&gt;
&lt;br /&gt;
Предположим, что такой подпоследовательности не существует. Тогда найдем наименьшее &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; такое, что не существует работы &amp;lt;tex&amp;gt; i_{v} : v &amp;gt; t &amp;lt;/tex&amp;gt;, которая бы подавляла работу &amp;lt;tex&amp;gt; i_{t} &amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt; i_{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; i_{t} &amp;lt;/tex&amp;gt; и из факта, что &amp;lt;tex&amp;gt; i_{t} &amp;lt; l &amp;lt;/tex&amp;gt;, получаем, что после добавления во множество &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; работы &amp;lt;tex&amp;gt; i_{t} &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; i_t &amp;lt; l &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; S_t &amp;lt;/tex&amp;gt; это множество &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; после замены работы &amp;lt;tex&amp;gt; k_{i_t} &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; i_t &amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt; k_{i_t} &amp;gt; k &amp;lt;/tex&amp;gt;, то в оптимальном расписании &amp;lt;tex&amp;gt; S^* &amp;lt;/tex&amp;gt; мы можем заменить работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; k_{i_t} &amp;lt;/tex&amp;gt;, поскольку &amp;lt;tex&amp;gt; d_{k_{i_t}} \geqslant d_k &amp;lt;/tex&amp;gt;. Но так как &amp;lt;tex&amp;gt; S_t \subset S^* &amp;lt;/tex&amp;gt;, то все работы из множества &amp;lt;tex&amp;gt; S_t \cup \{k_{i_t}\} &amp;lt;/tex&amp;gt; могут быть выполнены до их дедлайнов, что противоречит построению &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Следовательно, &amp;lt;tex&amp;gt; k_{i_t} &amp;lt; k &amp;lt;/tex&amp;gt;. Тогда аналогично предыдущему случаю получаем, что все работы из множества &amp;lt;tex&amp;gt; S_t \cup \{k\} &amp;lt;/tex&amp;gt; могут быть выполнены вовремя. Кроме того, все работы из &amp;lt;tex&amp;gt; \{ j \in S_t | j &amp;lt; k \} \cup \{k_{i_t}\} &amp;lt;/tex&amp;gt; так же могут быть выполнены вовремя, что следует из построения &amp;lt;tex&amp;gt; S_t &amp;lt;/tex&amp;gt;. Но тогда получается, что все работы и из множества &amp;lt;tex&amp;gt; S_t \cup \{k_{i_t}\} &amp;lt;/tex&amp;gt; так же могут быть выполнены вовремя, что опять приводит нас к противоречию с построением &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Время работы ==&lt;br /&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; O(\log n) &amp;lt;/tex&amp;gt;, то время работы всего алгоритма будет составлять &amp;lt;tex&amp;gt; O(n\log n) &amp;lt;/tex&amp;gt;. Например, такими структурами данных являются [[Двоичная куча | двоичная куча]] и [[Красно-черное дерево | красно-черное дерево]].&lt;br /&gt;
&lt;br /&gt;
== Более простой случай  ==&lt;br /&gt;
Задачу &amp;lt;tex&amp;gt; 1 \mid p_{i}=1 \mid \sum\nolimits U_i&amp;lt;/tex&amp;gt; можно решить за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;. Рассмотрим следующий алгоритм. Работы, значение &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; у которых больше либо равно &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, поместим в конец расписания. Для остальных работ заведём &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; множество &amp;lt;tex&amp;gt;S_{1}, S_{2} \dots S_{n-1}&amp;lt;/tex&amp;gt;. В множестве &amp;lt;tex&amp;gt;S_{i}&amp;lt;/tex&amp;gt; будем хранить номера работ, у которых &amp;lt;tex&amp;gt;d = i&amp;lt;/tex&amp;gt;. Далее для каждого множества будем по очереди добавлять работы, которые успеваем сделать, в расписание (как в строчках 3-6 предыдущего алгоритма). Те работы, которые не успеваем сделать, добавим в конец расписания. Всего будет выполнено O(n) операций и время работы алгоритма, таким образом, составляет &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 96 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>91.122.160.191</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Qtr/1&amp;diff=54894</id>
		<title>Участник:Qtr/1</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Qtr/1&amp;diff=54894"/>
				<updated>2016-06-07T20:24:10Z</updated>
		
		<summary type="html">&lt;p&gt;91.122.160.191: /* Источники информации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tex dpi = &amp;quot;200&amp;quot;&amp;gt; 1 \mid p_{i}=1 \mid \sum\nolimits w_iU_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Дано &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt; станок. Для каждой работы известны её дедлайн &amp;lt;tex&amp;gt; d_{i} &amp;lt;/tex&amp;gt; и вес &amp;lt;tex&amp;gt; w_{i} &amp;lt;/tex&amp;gt;. Время выполнения всех работ &amp;lt;tex&amp;gt; p_i &amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;. Требуется минимизировать &amp;lt;tex&amp;gt;\sum w_{i} U_{i}&amp;lt;/tex&amp;gt;, то есть суммарный вес всех просроченных работ.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
Идея алгоритма состоит в том, чтобы на шаге &amp;lt;tex&amp;gt; k &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; k &amp;lt;/tex&amp;gt; работ, тогда множество &amp;lt;tex&amp;gt; S_{k} &amp;lt;/tex&amp;gt; содержит только те работы, которые мы успеваем выполнить в порядке неуменьшения их дедлайнов при оптимальном составлении расписания . Рассмотрим работу &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;. Если мы успеваем выполнить данную работу до ее дедлайна, то добавим ее во множество &amp;lt;tex&amp;gt; S_{k} &amp;lt;/tex&amp;gt;, тем самым получив &amp;lt;tex&amp;gt; S_{k + 1} &amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt; работу выполнить до дедлайна мы не успеваем, то найдем в &amp;lt;tex&amp;gt; S_{k} &amp;lt;/tex&amp;gt; работу &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; с наименьшим весом &amp;lt;tex&amp;gt; w_{l} &amp;lt;/tex&amp;gt; и заменим ее на работу &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, рассмотрев все работы, мы получим &amp;lt;tex&amp;gt; S_{n} &amp;lt;/tex&amp;gt; {{---}} множество работ, которые мы успеваем выполнить до наступления их дедлайнов, причем вес просроченных работ будет наименьшим. От порядка выполнения просроченных работ ничего не зависит, поэтому расположить в расписании их можно произвольным образом.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
Предполагаем, что перед началом выполнения алгоритма выполняется, что &amp;lt;tex&amp;gt; 1 \leqslant d_{1} \leqslant d_{2} \leqslant ... \leqslant d_{n} &amp;lt;/tex&amp;gt;. Все работы, дедлайн которых равен &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, мы в любом случае выполнить без штрафа не успеем, поэтому их изначально можно отнести к просроченным.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; {{---}} множество непросроченных работ, &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; {{---}} текущее время.&lt;br /&gt;
&lt;br /&gt;
 '''Set'''&amp;lt;'''int'''&amp;gt; p1sumwu('''int''' &amp;lt;tex&amp;gt;w[n]&amp;lt;/tex&amp;gt;, '''int''' &amp;lt;tex&amp;gt;d[n]&amp;lt;/tex&amp;gt;):&lt;br /&gt;
   '''int''' &amp;lt;tex&amp;gt; t = 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''Set'''&amp;lt;'''int'''&amp;gt; &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\{\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''for''' &amp;lt;tex&amp;gt; i = 1 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt; s = s \cup \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''if''' &amp;lt;tex&amp;gt; d_{i}  \geqslant t &amp;lt;/tex&amp;gt;     &lt;br /&gt;
         &amp;lt;tex&amp;gt; t = t + 1 &amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''else'''&lt;br /&gt;
         найти такое &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt; w_{k} = \min \{ w_{j} \mid j \in s\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt; s = s \setminus \{k\} &amp;lt;/tex&amp;gt;    &lt;br /&gt;
   '''return''' &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Доказательство корректности ==&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Алгоритм строит корректное расписание.&lt;br /&gt;
|proof=Если мы успеваем выполнить очередную работу, то, очевидно, от ее добавления, расписание не может стать некорректным. В противном случае мы пытаемся заменить одну работу из множества &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; на текущую. Но это так же не может сделать наше расписание некорректным. Это следует из того, что мы рассматриваем работы в порядке неуменьшениях их дедлайнов. Пусть мы заменяем работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Но &amp;lt;tex&amp;gt; d_{k} \leqslant d_{i} &amp;lt;/tex&amp;gt;, следовательно, если мы успевали выполнить работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, то успеем выполнить и работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Построенное данным алгоритмом расписание оптимально.&lt;br /&gt;
|proof=Пусть &amp;lt;tex&amp;gt; S^* &amp;lt;/tex&amp;gt; множество непросроченных работ в оптимальном расписании. Также пусть &amp;lt;tex&amp;gt; l &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; k &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; S^* &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; S^* \subseteq S &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; должно быть тоже оптимальным, и правильность алгоритма доказана.&lt;br /&gt;
&lt;br /&gt;
Для доказательства покажем, что мы можем заменить работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; в оптимальном расписании, не увеличивая минимизируемую функцию.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим два случая:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt; l &amp;lt; k &amp;lt;/tex&amp;gt;&lt;br /&gt;
Так как работа &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; не содержится в &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;, то либо она не была добавлена при ее рассмотрении, либо была заменена работой, рассмотренной позднее. В любом случае это означает, что &amp;lt;tex&amp;gt; w_{k} \leqslant w_{l} &amp;lt;/tex&amp;gt;. Так же по определению &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; все работы &amp;lt;tex&amp;gt; i \in S^* : i &amp;lt; k &amp;lt;/tex&amp;gt; должны содержаться и в &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Но тогда заменив в оптимальном расписании &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;, мы сохраним корректность расписания и не увеличим минимизируемую функцию.&lt;br /&gt;
*&amp;lt;tex&amp;gt; k &amp;lt; l &amp;lt;/tex&amp;gt;&lt;br /&gt;
Так как мы рассматриваем работы в порядке неубывания их дедлайнов, то, следовательно, &amp;lt;tex&amp;gt; d_{k} \leqslant d_{l} &amp;lt;/tex&amp;gt;, и замена работы &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; в оптимальном расписании &amp;lt;tex&amp;gt; S^* &amp;lt;/tex&amp;gt; не может сделать его некорректным. Тогда для доказательства нам осталось показать, что &amp;lt;tex&amp;gt; w_{k} \leqslant w_{l} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; k_{i_{0}} = k &amp;lt;/tex&amp;gt; {{---}} работа, замененная работой &amp;lt;tex&amp;gt; i_{0} &amp;lt;/tex&amp;gt; в процессе построения &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;, и пусть &amp;lt;tex&amp;gt; k_{i_{1}}, ..., k_{i_{r}} &amp;lt;/tex&amp;gt; {{---}} последовательность работ, которые были исключены из &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; после замены &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, причем работа &amp;lt;tex&amp;gt; k_{i_{v}} &amp;lt;/tex&amp;gt; была заменена работой &amp;lt;tex&amp;gt; i_{v} &amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt; i_{0} &amp;lt; i_{1} &amp;lt; ... &amp;lt; i_{r} &amp;lt;/tex&amp;gt;. Будем говорить, что &amp;quot;работа &amp;lt;tex&amp;gt; i_{v} &amp;lt;/tex&amp;gt; подавляет &amp;lt;tex&amp;gt; i_{m} &amp;lt;/tex&amp;gt;&amp;quot;, где &amp;lt;tex&amp;gt; m &amp;lt; v &amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt; k_{i_{v}} \leqslant i_{m} &amp;lt;/tex&amp;gt;. В таком случае получаем, что &amp;lt;tex&amp;gt; w_{k_{i_{v}}} \geqslant w_{k_{i_{m}}}&amp;lt;/tex&amp;gt;, потому что в противном случае работа &amp;lt;tex&amp;gt; k_{i_{v}} &amp;lt;/tex&amp;gt; была бы исключена из &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; раньше чем &amp;lt;tex&amp;gt; k_{i_{m}} &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если в последовательности &amp;lt;tex&amp;gt; i_{0} &amp;lt; i_{1} &amp;lt; ... &amp;lt; i_{r} &amp;lt;/tex&amp;gt; существует подпоследовательность &amp;lt;tex&amp;gt; j_{0} = i_{0} &amp;lt; j_{1} &amp;lt; ... &amp;lt; j_{s} &amp;lt;/tex&amp;gt; такая, что &amp;lt;tex&amp;gt; j_{v + 1} &amp;lt;/tex&amp;gt; подавляет &amp;lt;tex&amp;gt; j_{v} &amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt; v = 0,1, ..., s - 1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j_{s - 1} &amp;lt; l \leqslant j_{s} &amp;lt;/tex&amp;gt;, то получаем, что &amp;lt;tex&amp;gt; w_{l} \geqslant w_{k_{j_{s}}} \geqslant ... \geqslant w_{k_{j_{0}}} = w_{k} &amp;lt;/tex&amp;gt;, что доказывает оптимальность расписания &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что отсутствие такой подпоследовательности приведет нас к противоречию, из чего будет следовать ее существование.&lt;br /&gt;
&lt;br /&gt;
Предположим, что такой подпоследовательности не существует. Тогда найдем наименьшее &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; такое, что не существует работы &amp;lt;tex&amp;gt; i_{v} : v &amp;gt; t &amp;lt;/tex&amp;gt;, которая бы подавляла работу &amp;lt;tex&amp;gt; i_{t} &amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt; i_{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; i_{t} &amp;lt;/tex&amp;gt; и из факта, что &amp;lt;tex&amp;gt; i_{t} &amp;lt; l &amp;lt;/tex&amp;gt;, получаем, что после добавления во множество &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; работы &amp;lt;tex&amp;gt; i_{t} &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; i_t &amp;lt; l &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; S_t &amp;lt;/tex&amp;gt; это множество &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; после замены работы &amp;lt;tex&amp;gt; k_{i_t} &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; i_t &amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt; k_{i_t} &amp;gt; k &amp;lt;/tex&amp;gt;, то в оптимальном расписании &amp;lt;tex&amp;gt; S^* &amp;lt;/tex&amp;gt; мы можем заменить работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; k_{i_t} &amp;lt;/tex&amp;gt;, поскольку &amp;lt;tex&amp;gt; d_{k_{i_t}} \geqslant d_k &amp;lt;/tex&amp;gt;. Но так как &amp;lt;tex&amp;gt; S_t \subset S^* &amp;lt;/tex&amp;gt;, то все работы из множества &amp;lt;tex&amp;gt; S_t \cup \{k_{i_t}\} &amp;lt;/tex&amp;gt; могут быть выполнены до их дедлайнов, что противоречит построению &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Следовательно, &amp;lt;tex&amp;gt; k_{i_t} &amp;lt; k &amp;lt;/tex&amp;gt;. Тогда аналогично предыдущему случаю получаем, что все работы из множества &amp;lt;tex&amp;gt; S_t \cup \{k\} &amp;lt;/tex&amp;gt; могут быть выполнены вовремя. Кроме того, все работы из &amp;lt;tex&amp;gt; \{ j \in S_t | j &amp;lt; k \} \cup \{k_{i_t}\} &amp;lt;/tex&amp;gt; так же могут быть выполнены вовремя, что следует из построения &amp;lt;tex&amp;gt; S_t &amp;lt;/tex&amp;gt;. Но тогда получается, что все работы и из множества &amp;lt;tex&amp;gt; S_t \cup \{k_{i_t}\} &amp;lt;/tex&amp;gt; так же могут быть выполнены вовремя, что опять приводит нас к противоречию с построением &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Время работы ==&lt;br /&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; O(\log n) &amp;lt;/tex&amp;gt;, то время работы всего алгоритма будет составлять &amp;lt;tex&amp;gt; O(n\log n) &amp;lt;/tex&amp;gt;. Например, такими структурами данных являются [[Двоичная куча | двоичная куча]] и [[Красно-черное дерево | красно-черное дерево]].&lt;br /&gt;
в&lt;br /&gt;
&lt;br /&gt;
== Более простой случай  ==&lt;br /&gt;
Задачу &amp;lt;tex&amp;gt; 1 \mid p_{i}=1 \mid \sum\nolimits U_i&amp;lt;/tex&amp;gt; можно решить за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;. Рассмотрим следующий алгоритм. Работы, значение &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; у которых больше либо равно &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, поместим в конец расписания. Для остальных работ заведём &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; множество &amp;lt;tex&amp;gt;S_{1}, S_{2} \dots S_{n-1}&amp;lt;/tex&amp;gt;. В множестве &amp;lt;tex&amp;gt;S_{i}&amp;lt;/tex&amp;gt; будем хранить номера работ, у которых &amp;lt;tex&amp;gt;d = i&amp;lt;/tex&amp;gt;. Далее для каждого множества будем по очереди добавлять работы, которые успеваем сделать, в расписание (как в строчках 3-6 предыдущего алгоритма). Те работы, которые не успеваем сделать, добавим в конец расписания. Всего будет выполнено O(n) операций и время работы алгоритма, таким образом, составляет &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 96 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>91.122.160.191</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Qtr/1&amp;diff=54891</id>
		<title>Участник:Qtr/1</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Qtr/1&amp;diff=54891"/>
				<updated>2016-06-07T20:21:26Z</updated>
		
		<summary type="html">&lt;p&gt;91.122.160.191: /* Псевдокод */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tex dpi = &amp;quot;200&amp;quot;&amp;gt; 1 \mid p_{i}=1 \mid \sum\nolimits w_iU_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Дано &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt; станок. Для каждой работы известны её дедлайн &amp;lt;tex&amp;gt; d_{i} &amp;lt;/tex&amp;gt; и вес &amp;lt;tex&amp;gt; w_{i} &amp;lt;/tex&amp;gt;. Время выполнения всех работ &amp;lt;tex&amp;gt; p_i &amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;. Требуется минимизировать &amp;lt;tex&amp;gt;\sum w_{i} U_{i}&amp;lt;/tex&amp;gt;, то есть суммарный вес всех просроченных работ.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
Идея алгоритма состоит в том, чтобы на шаге &amp;lt;tex&amp;gt; k &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; k &amp;lt;/tex&amp;gt; работ, тогда множество &amp;lt;tex&amp;gt; S_{k} &amp;lt;/tex&amp;gt; содержит только те работы, которые мы успеваем выполнить в порядке неуменьшения их дедлайнов при оптимальном составлении расписания . Рассмотрим работу &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;. Если мы успеваем выполнить данную работу до ее дедлайна, то добавим ее во множество &amp;lt;tex&amp;gt; S_{k} &amp;lt;/tex&amp;gt;, тем самым получив &amp;lt;tex&amp;gt; S_{k + 1} &amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt; работу выполнить до дедлайна мы не успеваем, то найдем в &amp;lt;tex&amp;gt; S_{k} &amp;lt;/tex&amp;gt; работу &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; с наименьшим весом &amp;lt;tex&amp;gt; w_{l} &amp;lt;/tex&amp;gt; и заменим ее на работу &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, рассмотрев все работы, мы получим &amp;lt;tex&amp;gt; S_{n} &amp;lt;/tex&amp;gt; {{---}} множество работ, которые мы успеваем выполнить до наступления их дедлайнов, причем вес просроченных работ будет наименьшим. От порядка выполнения просроченных работ ничего не зависит, поэтому расположить в расписании их можно произвольным образом.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
Предполагаем, что перед началом выполнения алгоритма выполняется, что &amp;lt;tex&amp;gt; 1 \leqslant d_{1} \leqslant d_{2} \leqslant ... \leqslant d_{n} &amp;lt;/tex&amp;gt;. Все работы, дедлайн которых равен &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, мы в любом случае выполнить без штрафа не успеем, поэтому их изначально можно отнести к просроченным.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; {{---}} множество непросроченных работ, &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; {{---}} текущее время.&lt;br /&gt;
&lt;br /&gt;
 '''Set'''&amp;lt;'''int'''&amp;gt; p1sumwu('''int''' &amp;lt;tex&amp;gt;w[n]&amp;lt;/tex&amp;gt;, '''int''' &amp;lt;tex&amp;gt;d[n]&amp;lt;/tex&amp;gt;):&lt;br /&gt;
   '''int''' &amp;lt;tex&amp;gt; t = 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''Set'''&amp;lt;'''int'''&amp;gt; &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;\{\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''for''' &amp;lt;tex&amp;gt; i = 1 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt; s = s \cup \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''if''' &amp;lt;tex&amp;gt; d_{i}  \geqslant t &amp;lt;/tex&amp;gt;     &lt;br /&gt;
         &amp;lt;tex&amp;gt; t = t + 1 &amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''else'''&lt;br /&gt;
         найти такое &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt; w_{k} = \min \{ w_{j} \mid j \in s\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt; s = s \setminus \{k\} &amp;lt;/tex&amp;gt;    &lt;br /&gt;
   '''return''' &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Доказательство корректности ==&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Алгоритм строит корректное расписание.&lt;br /&gt;
|proof=Если мы успеваем выполнить очередную работу, то, очевидно, от ее добавления, расписание не может стать некорректным. В противном случае мы пытаемся заменить одну работу из множества &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; на текущую. Но это так же не может сделать наше расписание некорректным. Это следует из того, что мы рассматриваем работы в порядке неуменьшениях их дедлайнов. Пусть мы заменяем работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Но &amp;lt;tex&amp;gt; d_{k} \leqslant d_{i} &amp;lt;/tex&amp;gt;, следовательно, если мы успевали выполнить работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, то успеем выполнить и работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Построенное данным алгоритмом расписание оптимально.&lt;br /&gt;
|proof=Пусть &amp;lt;tex&amp;gt; S^* &amp;lt;/tex&amp;gt; множество непросроченных работ в оптимальном расписании. Также пусть &amp;lt;tex&amp;gt; l &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; k &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; S^* &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; S^* \subseteq S &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; должно быть тоже оптимальным, и правильность алгоритма доказана.&lt;br /&gt;
&lt;br /&gt;
Для доказательства покажем, что мы можем заменить работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; в оптимальном расписании, не увеличивая минимизируемую функцию.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим два случая:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt; l &amp;lt; k &amp;lt;/tex&amp;gt;&lt;br /&gt;
Так как работа &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; не содержится в &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;, то либо она не была добавлена при ее рассмотрении, либо была заменена работой, рассмотренной позднее. В любом случае это означает, что &amp;lt;tex&amp;gt; w_{k} \leqslant w_{l} &amp;lt;/tex&amp;gt;. Так же по определению &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; все работы &amp;lt;tex&amp;gt; i \in S^* : i &amp;lt; k &amp;lt;/tex&amp;gt; должны содержаться и в &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Но тогда заменив в оптимальном расписании &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;, мы сохраним корректность расписания и не увеличим минимизируемую функцию.&lt;br /&gt;
*&amp;lt;tex&amp;gt; k &amp;lt; l &amp;lt;/tex&amp;gt;&lt;br /&gt;
Так как мы рассматриваем работы в порядке неубывания их дедлайнов, то, следовательно, &amp;lt;tex&amp;gt; d_{k} \leqslant d_{l} &amp;lt;/tex&amp;gt;, и замена работы &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; в оптимальном расписании &amp;lt;tex&amp;gt; S^* &amp;lt;/tex&amp;gt; не может сделать его некорректным. Тогда для доказательства нам осталось показать, что &amp;lt;tex&amp;gt; w_{k} \leqslant w_{l} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; k_{i_{0}} = k &amp;lt;/tex&amp;gt; {{---}} работа, замененная работой &amp;lt;tex&amp;gt; i_{0} &amp;lt;/tex&amp;gt; в процессе построения &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;, и пусть &amp;lt;tex&amp;gt; k_{i_{1}}, ..., k_{i_{r}} &amp;lt;/tex&amp;gt; {{---}} последовательность работ, которые были исключены из &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; после замены &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, причем работа &amp;lt;tex&amp;gt; k_{i_{v}} &amp;lt;/tex&amp;gt; была заменена работой &amp;lt;tex&amp;gt; i_{v} &amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt; i_{0} &amp;lt; i_{1} &amp;lt; ... &amp;lt; i_{r} &amp;lt;/tex&amp;gt;. Будем говорить, что &amp;quot;работа &amp;lt;tex&amp;gt; i_{v} &amp;lt;/tex&amp;gt; подавляет &amp;lt;tex&amp;gt; i_{m} &amp;lt;/tex&amp;gt;&amp;quot;, где &amp;lt;tex&amp;gt; m &amp;lt; v &amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt; k_{i_{v}} \leqslant i_{m} &amp;lt;/tex&amp;gt;. В таком случае получаем, что &amp;lt;tex&amp;gt; w_{k_{i_{v}}} \geqslant w_{k_{i_{m}}}&amp;lt;/tex&amp;gt;, потому что в противном случае работа &amp;lt;tex&amp;gt; k_{i_{v}} &amp;lt;/tex&amp;gt; была бы исключена из &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; раньше чем &amp;lt;tex&amp;gt; k_{i_{m}} &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если в последовательности &amp;lt;tex&amp;gt; i_{0} &amp;lt; i_{1} &amp;lt; ... &amp;lt; i_{r} &amp;lt;/tex&amp;gt; существует подпоследовательность &amp;lt;tex&amp;gt; j_{0} = i_{0} &amp;lt; j_{1} &amp;lt; ... &amp;lt; j_{s} &amp;lt;/tex&amp;gt; такая, что &amp;lt;tex&amp;gt; j_{v + 1} &amp;lt;/tex&amp;gt; подавляет &amp;lt;tex&amp;gt; j_{v} &amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt; v = 0,1, ..., s - 1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j_{s - 1} &amp;lt; l \leqslant j_{s} &amp;lt;/tex&amp;gt;, то получаем, что &amp;lt;tex&amp;gt; w_{l} \geqslant w_{k_{j_{s}}} \geqslant ... \geqslant w_{k_{j_{0}}} = w_{k} &amp;lt;/tex&amp;gt;, что доказывает оптимальность расписания &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что отсутствие такой подпоследовательности приведет нас к противоречию, из чего будет следовать ее существование.&lt;br /&gt;
&lt;br /&gt;
Предположим, что такой подпоследовательности не существует. Тогда найдем наименьшее &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; такое, что не существует работы &amp;lt;tex&amp;gt; i_{v} : v &amp;gt; t &amp;lt;/tex&amp;gt;, которая бы подавляла работу &amp;lt;tex&amp;gt; i_{t} &amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt; i_{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; i_{t} &amp;lt;/tex&amp;gt; и из факта, что &amp;lt;tex&amp;gt; i_{t} &amp;lt; l &amp;lt;/tex&amp;gt;, получаем, что после добавления во множество &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; работы &amp;lt;tex&amp;gt; i_{t} &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; i_t &amp;lt; l &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; S_t &amp;lt;/tex&amp;gt; это множество &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; после замены работы &amp;lt;tex&amp;gt; k_{i_t} &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; i_t &amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt; k_{i_t} &amp;gt; k &amp;lt;/tex&amp;gt;, то в оптимальном расписании &amp;lt;tex&amp;gt; S^* &amp;lt;/tex&amp;gt; мы можем заменить работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; k_{i_t} &amp;lt;/tex&amp;gt;, поскольку &amp;lt;tex&amp;gt; d_{k_{i_t}} \geqslant d_k &amp;lt;/tex&amp;gt;. Но так как &amp;lt;tex&amp;gt; S_t \subset S^* &amp;lt;/tex&amp;gt;, то все работы из множества &amp;lt;tex&amp;gt; S_t \cup \{k_{i_t}\} &amp;lt;/tex&amp;gt; могут быть выполнены до их дедлайнов, что противоречит построению &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Следовательно, &amp;lt;tex&amp;gt; k_{i_t} &amp;lt; k &amp;lt;/tex&amp;gt;. Тогда аналогично предыдущему случаю получаем, что все работы из множества &amp;lt;tex&amp;gt; S_t \cup \{k\} &amp;lt;/tex&amp;gt; могут быть выполнены вовремя. Кроме того, все работы из &amp;lt;tex&amp;gt; \{ j \in S_t | j &amp;lt; k \} \cup \{k_{i_t}\} &amp;lt;/tex&amp;gt; так же могут быть выполнены вовремя, что следует из построения &amp;lt;tex&amp;gt; S_t &amp;lt;/tex&amp;gt;. Но тогда получается, что все работы и из множества &amp;lt;tex&amp;gt; S_t \cup \{k_{i_t}\} &amp;lt;/tex&amp;gt; так же могут быть выполнены вовремя, что опять приводит нас к противоречию с построением &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Время работы ==&lt;br /&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; O(\log n) &amp;lt;/tex&amp;gt;, то время работы всего алгоритма будет составлять &amp;lt;tex&amp;gt; O(n\log n) &amp;lt;/tex&amp;gt;. Например, такими структурами данных являются [[Двоичная куча | двоичная куча]] и [[Красно-черное дерево | красно-черное дерево]].&lt;br /&gt;
в&lt;br /&gt;
&lt;br /&gt;
== Более простой случай  ==&lt;br /&gt;
Задачу &amp;lt;tex&amp;gt; 1 \mid p_{i}=1 \mid \sum\nolimits U_i&amp;lt;/tex&amp;gt; можно решить за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;. Рассмотрим следующий алгоритм. Работы, значение &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; у которых больше либо равно &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, поместим в конец расписания. Для остальных работ заведём &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; множество &amp;lt;tex&amp;gt;S_{1}, S_{2} \dots S_{n-1}&amp;lt;/tex&amp;gt;. В множестве &amp;lt;tex&amp;gt;S_{i}&amp;lt;/tex&amp;gt; будем хранить номера работ, у которых &amp;lt;tex&amp;gt;d = i&amp;lt;/tex&amp;gt;. Далее для каждого множества будем по очереди добавлять работы, которые успеваем сделать, в расписание (как в строчках 3-6 предыдущего алгоритма). Те работы, которые не успеваем сделать, добавим в конец расписания. Всего будет выполнено O(n) операций и время работы алгоритма, таким образом, составляет &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 96 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>91.122.160.191</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Qtr/1&amp;diff=54876</id>
		<title>Участник:Qtr/1</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Qtr/1&amp;diff=54876"/>
				<updated>2016-06-07T19:42:55Z</updated>
		
		<summary type="html">&lt;p&gt;91.122.160.191: Новая страница: «&amp;lt;tex dpi = &amp;quot;200&amp;quot;&amp;gt; 1 \mid p_{i}=1 \mid \sum\nolimits w_iU_i&amp;lt;/tex&amp;gt;  {{Задача |definition = Дано &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt; станок. ...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tex dpi = &amp;quot;200&amp;quot;&amp;gt; 1 \mid p_{i}=1 \mid \sum\nolimits w_iU_i&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Дано &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt; станок. Для каждой работы известны её дедлайн &amp;lt;tex&amp;gt; d_{i} &amp;lt;/tex&amp;gt; и вес &amp;lt;tex&amp;gt; w_{i} &amp;lt;/tex&amp;gt;. Время выполнения всех работ &amp;lt;tex&amp;gt; p_i &amp;lt;/tex&amp;gt; равно &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;. Требуется минимизировать &amp;lt;tex&amp;gt;\sum w_{i} U_{i}&amp;lt;/tex&amp;gt;, то есть суммарный вес всех просроченных работ.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
Идея алгоритма состоит в том, чтобы на шаге &amp;lt;tex&amp;gt; k &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; k &amp;lt;/tex&amp;gt; работ, тогда множество &amp;lt;tex&amp;gt; S_{k} &amp;lt;/tex&amp;gt; содержит только те работы, которые мы успеваем выполнить в порядке неуменьшения их дедлайнов при оптимальном составлении расписания . Рассмотрим работу &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;. Если мы успеваем выполнить данную работу до ее дедлайна, то добавим ее во множество &amp;lt;tex&amp;gt; S_{k} &amp;lt;/tex&amp;gt;, тем самым получив &amp;lt;tex&amp;gt; S_{k + 1} &amp;lt;/tex&amp;gt;. Если же &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt; работу выполнить до дедлайна мы не успеваем, то найдем в &amp;lt;tex&amp;gt; S_{k} &amp;lt;/tex&amp;gt; работу &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; с наименьшим весом &amp;lt;tex&amp;gt; w_{l} &amp;lt;/tex&amp;gt; и заменим ее на работу &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, рассмотрев все работы, мы получим &amp;lt;tex&amp;gt; S_{n} &amp;lt;/tex&amp;gt; {{---}} множество работ, которые мы успеваем выполнить до наступления их дедлайнов, причем вес просроченных работ будет наименьшим. От порядка выполнения просроченных работ ничего не зависит, поэтому расположить в расписании их можно произвольным образом.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
Предполагаем, что перед началом выполнения алгоритма выполняется, что &amp;lt;tex&amp;gt; 1 \leqslant d_{1} \leqslant d_{2} \leqslant ... \leqslant d_{n} &amp;lt;/tex&amp;gt;. Все работы, дедлайн которых равен &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, мы в любом случае выполнить без штрафа не успеем, поэтому их изначально можно отнести к просроченным.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; {{---}} множество непросроченных работ, &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; {{---}} текущее время.&lt;br /&gt;
&lt;br /&gt;
 '''Set''' p1sumwu('''int''' &amp;lt;tex&amp;gt;w[i]&amp;lt;/tex&amp;gt;, '''int''' &amp;lt;tex&amp;gt;d[i]&amp;lt;/tex&amp;gt;):&lt;br /&gt;
   '''int''' &amp;lt;tex&amp;gt; t = 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''set''' &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''for''' &amp;lt;tex&amp;gt; i = 1 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt; s = s \cup \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''if''' &amp;lt;tex&amp;gt; d_{i}  \geqslant t &amp;lt;/tex&amp;gt;     &lt;br /&gt;
         &amp;lt;tex&amp;gt; t = t + 1 &amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''else'''&lt;br /&gt;
         найти такое &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt; w_{k} = \min \{ w_{j} \mid j \in s\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt; s = s \setminus \{k\} &amp;lt;/tex&amp;gt;    &lt;br /&gt;
   '''return''' &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Доказательство корректности ==&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Алгоритм строит корректное расписание.&lt;br /&gt;
|proof=Если мы успеваем выполнить очередную работу, то, очевидно, от ее добавления, расписание не может стать некорректным. В противном случае мы пытаемся заменить одну работу из множества &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; на текущую. Но это так же не может сделать наше расписание некорректным. Это следует из того, что мы рассматриваем работы в порядке неуменьшениях их дедлайнов. Пусть мы заменяем работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Но &amp;lt;tex&amp;gt; d_{k} \leqslant d_{i} &amp;lt;/tex&amp;gt;, следовательно, если мы успевали выполнить работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, то успеем выполнить и работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Построенное данным алгоритмом расписание оптимально.&lt;br /&gt;
|proof=Пусть &amp;lt;tex&amp;gt; S^* &amp;lt;/tex&amp;gt; множество непросроченных работ в оптимальном расписании. Также пусть &amp;lt;tex&amp;gt; l &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; k &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; S^* &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; S^* \subseteq S &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; должно быть тоже оптимальным, и правильность алгоритма доказана.&lt;br /&gt;
&lt;br /&gt;
Для доказательства покажем, что мы можем заменить работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на работу &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; в оптимальном расписании, не увеличивая минимизируемую функцию.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим два случая:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tex&amp;gt; l &amp;lt; k &amp;lt;/tex&amp;gt;&lt;br /&gt;
Так как работа &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; не содержится в &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;, то либо она не была добавлена при ее рассмотрении, либо была заменена работой, рассмотренной позднее. В любом случае это означает, что &amp;lt;tex&amp;gt; w_{k} \leqslant w_{l} &amp;lt;/tex&amp;gt;. Так же по определению &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; все работы &amp;lt;tex&amp;gt; i \in S^* : i &amp;lt; k &amp;lt;/tex&amp;gt; должны содержаться и в &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Но тогда заменив в оптимальном расписании &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;, мы сохраним корректность расписания и не увеличим минимизируемую функцию.&lt;br /&gt;
*&amp;lt;tex&amp;gt; k &amp;lt; l &amp;lt;/tex&amp;gt;&lt;br /&gt;
Так как мы рассматриваем работы в порядке неубывания их дедлайнов, то, следовательно, &amp;lt;tex&amp;gt; d_{k} \leqslant d_{l} &amp;lt;/tex&amp;gt;, и замена работы &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; в оптимальном расписании &amp;lt;tex&amp;gt; S^* &amp;lt;/tex&amp;gt; не может сделать его некорректным. Тогда для доказательства нам осталось показать, что &amp;lt;tex&amp;gt; w_{k} \leqslant w_{l} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; k_{i_{0}} = k &amp;lt;/tex&amp;gt; {{---}} работа, замененная работой &amp;lt;tex&amp;gt; i_{0} &amp;lt;/tex&amp;gt; в процессе построения &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;, и пусть &amp;lt;tex&amp;gt; k_{i_{1}}, ..., k_{i_{r}} &amp;lt;/tex&amp;gt; {{---}} последовательность работ, которые были исключены из &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; после замены &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, причем работа &amp;lt;tex&amp;gt; k_{i_{v}} &amp;lt;/tex&amp;gt; была заменена работой &amp;lt;tex&amp;gt; i_{v} &amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt; i_{0} &amp;lt; i_{1} &amp;lt; ... &amp;lt; i_{r} &amp;lt;/tex&amp;gt;. Будем говорить, что &amp;quot;работа &amp;lt;tex&amp;gt; i_{v} &amp;lt;/tex&amp;gt; подавляет &amp;lt;tex&amp;gt; i_{m} &amp;lt;/tex&amp;gt;&amp;quot;, где &amp;lt;tex&amp;gt; m &amp;lt; v &amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt; k_{i_{v}} \leqslant i_{m} &amp;lt;/tex&amp;gt;. В таком случае получаем, что &amp;lt;tex&amp;gt; w_{k_{i_{v}}} \geqslant w_{k_{i_{m}}}&amp;lt;/tex&amp;gt;, потому что в противном случае работа &amp;lt;tex&amp;gt; k_{i_{v}} &amp;lt;/tex&amp;gt; была бы исключена из &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; раньше чем &amp;lt;tex&amp;gt; k_{i_{m}} &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если в последовательности &amp;lt;tex&amp;gt; i_{0} &amp;lt; i_{1} &amp;lt; ... &amp;lt; i_{r} &amp;lt;/tex&amp;gt; существует подпоследовательность &amp;lt;tex&amp;gt; j_{0} = i_{0} &amp;lt; j_{1} &amp;lt; ... &amp;lt; j_{s} &amp;lt;/tex&amp;gt; такая, что &amp;lt;tex&amp;gt; j_{v + 1} &amp;lt;/tex&amp;gt; подавляет &amp;lt;tex&amp;gt; j_{v} &amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt; v = 0,1, ..., s - 1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j_{s - 1} &amp;lt; l \leqslant j_{s} &amp;lt;/tex&amp;gt;, то получаем, что &amp;lt;tex&amp;gt; w_{l} \geqslant w_{k_{j_{s}}} \geqslant ... \geqslant w_{k_{j_{0}}} = w_{k} &amp;lt;/tex&amp;gt;, что доказывает оптимальность расписания &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что отсутствие такой подпоследовательности приведет нас к противоречию, из чего будет следовать ее существование.&lt;br /&gt;
&lt;br /&gt;
Предположим, что такой подпоследовательности не существует. Тогда найдем наименьшее &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; такое, что не существует работы &amp;lt;tex&amp;gt; i_{v} : v &amp;gt; t &amp;lt;/tex&amp;gt;, которая бы подавляла работу &amp;lt;tex&amp;gt; i_{t} &amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt; i_{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; i_{t} &amp;lt;/tex&amp;gt; и из факта, что &amp;lt;tex&amp;gt; i_{t} &amp;lt; l &amp;lt;/tex&amp;gt;, получаем, что после добавления во множество &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; работы &amp;lt;tex&amp;gt; i_{t} &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; i_t &amp;lt; l &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; S_t &amp;lt;/tex&amp;gt; это множество &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; после замены работы &amp;lt;tex&amp;gt; k_{i_t} &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; i_t &amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt; k_{i_t} &amp;gt; k &amp;lt;/tex&amp;gt;, то в оптимальном расписании &amp;lt;tex&amp;gt; S^* &amp;lt;/tex&amp;gt; мы можем заменить работу &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; k_{i_t} &amp;lt;/tex&amp;gt;, поскольку &amp;lt;tex&amp;gt; d_{k_{i_t}} \geqslant d_k &amp;lt;/tex&amp;gt;. Но так как &amp;lt;tex&amp;gt; S_t \subset S^* &amp;lt;/tex&amp;gt;, то все работы из множества &amp;lt;tex&amp;gt; S_t \cup \{k_{i_t}\} &amp;lt;/tex&amp;gt; могут быть выполнены до их дедлайнов, что противоречит построению &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;. Следовательно, &amp;lt;tex&amp;gt; k_{i_t} &amp;lt; k &amp;lt;/tex&amp;gt;. Тогда аналогично предыдущему случаю получаем, что все работы из множества &amp;lt;tex&amp;gt; S_t \cup \{k\} &amp;lt;/tex&amp;gt; могут быть выполнены вовремя. Кроме того, все работы из &amp;lt;tex&amp;gt; \{ j \in S_t | j &amp;lt; k \} \cup \{k_{i_t}\} &amp;lt;/tex&amp;gt; так же могут быть выполнены вовремя, что следует из построения &amp;lt;tex&amp;gt; S_t &amp;lt;/tex&amp;gt;. Но тогда получается, что все работы и из множества &amp;lt;tex&amp;gt; S_t \cup \{k_{i_t}\} &amp;lt;/tex&amp;gt; так же могут быть выполнены вовремя, что опять приводит нас к противоречию с построением &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Время работы ==&lt;br /&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; O(\log n) &amp;lt;/tex&amp;gt;, то время работы всего алгоритма будет составлять &amp;lt;tex&amp;gt; O(n\log n) &amp;lt;/tex&amp;gt;. Например, такими структурами данных являются [[Двоичная куча | двоичная куча]] и [[Красно-черное дерево | красно-черное дерево]].&lt;br /&gt;
в&lt;br /&gt;
&lt;br /&gt;
== Более простой случай  ==&lt;br /&gt;
Задачу &amp;lt;tex&amp;gt; 1 \mid p_{i}=1 \mid \sum\nolimits U_i&amp;lt;/tex&amp;gt; можно решить за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;. Рассмотрим следующий алгоритм. Работы, значение &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; у которых больше либо равно &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, поместим в конец расписания. Для остальных работ заведём &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; множество &amp;lt;tex&amp;gt;S_{1}, S_{2} \dots S_{n-1}&amp;lt;/tex&amp;gt;. В множестве &amp;lt;tex&amp;gt;S_{i}&amp;lt;/tex&amp;gt; будем хранить номера работ, у которых &amp;lt;tex&amp;gt;d = i&amp;lt;/tex&amp;gt;. Далее для каждого множества будем по очереди добавлять работы, которые успеваем сделать, в расписание (как в строчках 3-6 предыдущего алгоритма). Те работы, которые не успеваем сделать, добавим в конец расписания. Всего будет выполнено O(n) операций и время работы алгоритма, таким образом, составляет &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Peter Brucker. «Scheduling Algorithms» {{---}} «Springer», 2006 г. {{---}} 96 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>91.122.160.191</name></author>	</entry>

	</feed>