<?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=94.25.229.60&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=94.25.229.60&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/94.25.229.60"/>
		<updated>2026-06-13T09:47:21Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31750</id>
		<title>F2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=F2Cmax&amp;diff=31750"/>
				<updated>2013-06-11T09:58:59Z</updated>
		
		<summary type="html">&lt;p&gt;94.25.229.60: /* Доказательство корректности алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
Рассмотрим задачу:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Дано &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; работ и &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; станка.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для каждой работы известно её время выполнения на каждом станке.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Требуется минимизировать время окончания всех работ.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p_{i1}&amp;lt;/tex&amp;gt; {{---}} время выполнения &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой работы на первом станке, а &amp;lt;tex&amp;gt;p_{i2}&amp;lt;/tex&amp;gt; {{---}} на втором.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Будем в ходе нашего алгоритма строить два списка &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt;. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;  R &amp;lt;/tex&amp;gt; работ &amp;lt;tex&amp;gt;X = \{i \mid  i = 1, \dots, n\}&amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Пока множество &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; непусто будем распределять работы по спискам следующим образом:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Находим такие индексы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;, что  &amp;lt;tex&amp;gt;p_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Если минимум достигается на первом станке (иными словами &amp;lt;tex&amp;gt; j = 1 &amp;lt;/tex&amp;gt;), то поставим работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в конец  листа &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt;, иначе ставим в начало листа &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Удаляем работу &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; из множества &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Рассмотрим лист &amp;lt;tex&amp;gt; T = L \circ R&amp;lt;/tex&amp;gt;. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы. &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Доказательство корректности алгоритма==&lt;br /&gt;
TODO Доказательство равенства перестановок на первом и втором станках&lt;br /&gt;
&lt;br /&gt;
Докажем, что полученный нашим алгоритмом лист является отпимальной перестановкой работ. &lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|about=1&lt;br /&gt;
|statement= Если для каких работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; из листа &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; верно неравенство &amp;lt;tex&amp;gt; \min(p_{i1}, p_{j2}) &amp;lt;   \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; встречается в листе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; раньше, чем &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j2} &amp;lt;/tex&amp;gt;. Случай &amp;lt;tex&amp;gt; p_{i1} &amp;gt; p_{j2} &amp;lt;/tex&amp;gt; рассматривается аналогично. &lt;br /&gt;
&lt;br /&gt;
То есть имеем, что &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; p_{i1} &amp;lt; \min(p_{j1}, p_{i2}) \leq p_{i2} &amp;lt;/tex&amp;gt;, то работа &amp;lt;tex&amp;gt; i \in L &amp;lt;/tex&amp;gt;. Работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; либо стоит в &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;, либо она стоит в &amp;lt;tex&amp;gt; L &amp;lt;/tex&amp;gt; и при этом &amp;lt;tex&amp;gt; p_{i1} &amp;lt; p_{j1} &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;
|id=lemma2&lt;br /&gt;
|about=2&lt;br /&gt;
|statement= Пусть имеет случайное расписание, в котором работа &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; идет сразу же после работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Тогда если &amp;lt;tex&amp;gt; \min(p_{j1}, p_{i2}) \leq   \min(p_{i1}, p_{j2}) &amp;lt;/tex&amp;gt;, то можем поменять местами эти работы без ухудшение целевой функций. &lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; w_{ij} &amp;lt;/tex&amp;gt; {{---}} время, прошедшее с начала выполнения работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; на первом станке до окончания работы &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; на втором станке. &lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + p_{j1} + p_{j2}, p_{i1} + p_{i2} + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;. Иначе говоря   &amp;lt;tex&amp;gt; w_{ij} = \max (p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2}, delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично имеем, что &amp;lt;tex&amp;gt; w_{ji} = \max (p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2},  delta + p_{i2} + p_{j2}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; \min(a, b) = - \max(-a, -b)&amp;lt;/tex&amp;gt;, то из условию леммы имеем &amp;lt;tex&amp;gt; \max(-p_{i1}, -p_{j2}) \leq   \max(-p_{j1}, -p_{i2}) &amp;lt;/tex&amp;gt;, то добавим &amp;lt;tex&amp;gt; p_{i1} + p_{i2} + p_{j1} + p_{j2} &amp;lt;/tex&amp;gt; к обеим частям. То получим, что &amp;lt;tex&amp;gt; p_{j1} + \max(p_{i1}, p_{j2}) + p_{i2} \leq p_{i1} + \max(p_{j1}, p_{i2}) + p_{j2} &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt; w_{ji} \leq w_{ij} &amp;lt;/tex&amp;gt;, то при смене местами работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; ответ не ухудшается. &lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{&lt;br /&gt;
Теорема|statement=&lt;br /&gt;
Построенная перестановка &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; является оптимальной. &lt;br /&gt;
&lt;br /&gt;
|proof=&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; и &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; имеют общий префикс длины &amp;lt;tex&amp;gt; l-1 &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; i = T_{l} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j = S_{l} &amp;lt;/tex&amp;gt;. Рассмотрим множество работ &amp;lt;tex&amp;gt;M = \{T_{r} \mid  r = l, \dots, n\}&amp;lt;/tex&amp;gt;. Заметим, что для любой работы &amp;lt;tex&amp;gt; k \in M &amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) \geq \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, так как если было бы верно обратное, то есть &amp;lt;tex&amp;gt; \min(p_{k1}, p_{i2}) &amp;lt; \min(p_{i1}, p_{k2}) &amp;lt;/tex&amp;gt;, то по Лемме 1 было бы верно, что &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;
Очевидно, что в перестановке &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; работа &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; будет стоять после &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; (иначе общий префикс был бы короче), то заметим, что в этой перестановке для работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и для предыдущей работы &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; верно &amp;lt;tex&amp;gt; \min(p_{w1}, p_{i2}) \geq \min(p_{i1}, p_{w2}) &amp;lt;/tex&amp;gt; (так как &amp;lt;tex&amp;gt; w \in M &amp;lt;/tex&amp;gt;), то по Лемме 2 можем поменять местами работы &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; без ухудшения ответа. То такими операциями сможем дойти до пары работ &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;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;
Таким образом любая перестановка сводится к нашей без ухудшения ответа такими операциями, что подтверждает оптимальность перестановки &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;L \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;R \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;X \leftarrow \{1, \dots, n\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   while &amp;lt;tex&amp;gt; X \neq \varnothing&amp;lt;/tex&amp;gt;&lt;br /&gt;
      Найти &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;p_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      if j = 1&lt;br /&gt;
         &amp;lt;tex&amp;gt;L \leftarrow L \circ i &amp;lt;/tex&amp;gt;&lt;br /&gt;
      else &lt;br /&gt;
         &amp;lt;tex&amp;gt;R \leftarrow i \circ R &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;X \leftarrow X \setminus \{i\} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;T \leftarrow L \circ R&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   Расставляем работы на первом станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
   Расставляем работы на втором станке согласно перестановке &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;&lt;br /&gt;
   и времени начала соответсвующей работы на первом станке.&lt;br /&gt;
&lt;br /&gt;
==Сложность алгоритма==&lt;br /&gt;
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;). И делаем мы это &amp;lt;tex&amp;gt; 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 г. {{---}} 175 стр. {{---}} ISBN 978-3-540-69515-8&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>94.25.229.60</name></author>	</entry>

	</feed>