<?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=5.18.60.212&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=5.18.60.212&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/5.18.60.212"/>
		<updated>2026-04-06T21:38:11Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=R2Cmax&amp;diff=54149</id>
		<title>R2Cmax</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=R2Cmax&amp;diff=54149"/>
				<updated>2016-05-22T01:03:16Z</updated>
		
		<summary type="html">&lt;p&gt;5.18.60.212: &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;
&amp;lt;tex dpi=200&amp;gt;R2 \mid\mid C_{max} &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; работ, время выполнения которых на первом &lt;br /&gt;
и втором станке различное. Нужно минимизировать время завершения всех работ.}}&lt;br /&gt;
&lt;br /&gt;
==Сложность задачи==&lt;br /&gt;
Задача &amp;lt;tex&amp;gt;R2 \mid \mid C_{max}&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\mathrm{NP}&amp;lt;/tex&amp;gt;-полной задачей.&lt;br /&gt;
&lt;br /&gt;
==Неэффективное решение==&lt;br /&gt;
Переберём все битовые последовательности из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов. Для каждой перестановки вычислим завершение последней работы. Работы будем выполнять следующим образом, если на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;&amp;amp;nbsp;-й позиции стоит &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;&amp;amp;nbsp;-ая работа будет выполняться на первом станке, иначе на втором. Среди всех перестановок выберем ту перестановку, у которой &amp;lt;tex&amp;gt;C_{max}&amp;lt;/tex&amp;gt; минимальный.&lt;br /&gt;
&lt;br /&gt;
Время работы алгоритма &amp;lt;tex&amp;gt;O(n \cdot 2^n)&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;dp[i][j]&amp;lt;/tex&amp;gt;, в котором будем хранить минимально время выполнения работ на втором станке, где &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; означает, что мы рассмотрели &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; работ, а &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; с каким временем выполнения работ на первом станке. Тогда &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; не превосходит суммы выполнения работ на первом станке.&lt;br /&gt;
&lt;br /&gt;
Изначальное значение &amp;lt;tex&amp;gt;dp[0][0] = 0&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;(i + 1)&amp;lt;/tex&amp;gt;-ой работы. Переберём время выполнения работ на первом станке и посчитаем какое минимально время выполнения мы можем получить при на втором станке при фиксированном первом времени. Так как &amp;lt;tex&amp;gt;(i + 1)&amp;lt;/tex&amp;gt;-ю работу мы можем выполнить либо на первом станке, либо на втором, то &amp;lt;tex&amp;gt; dp[i + 1][j + p_1[i + 1]]&amp;lt;/tex&amp;gt; надо прорелаксировать значением &amp;lt;tex&amp;gt;dp[i][j] &amp;lt;/tex&amp;gt;, что соответсвует выполнению работы на первом станке. А &amp;lt;tex&amp;gt;dp[i + 1][j] &amp;lt;/tex&amp;gt; релаксируем значением &amp;lt;tex&amp;gt; dp[i][j]+p_2[i + 1]&amp;lt;/tex&amp;gt; (выполнение на втором станке).&lt;br /&gt;
&lt;br /&gt;
Тогда ответом на задачу будет минимум среди всех максимумов из &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;dp[n][j]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же можно заметить, что во время каждой итерации алгоритма используется только два столбца массива &amp;lt;tex&amp;gt; dp &amp;lt;/tex&amp;gt;. Это позволяет уменьшить использование памяти до &amp;lt;tex dpi=130&amp;gt; \sum{p_{1}[i]}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   &amp;lt;tex&amp;gt;maxTime = 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''for''' &amp;lt;tex&amp;gt;i = 0 \dots n - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;maxTime += p_1[i]&amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;dp[][] = INF&amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;dp[0][0] = 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''for''' &amp;lt;tex&amp;gt;i = 0 \dots n - 1 &amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''for''' &amp;lt;tex&amp;gt;j = 0 \dots maxTime &amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''if''' &amp;lt;tex&amp;gt; (dp[i + 1][j + p_{1}[i]] &amp;gt; dp[i][j]) &amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
            &amp;lt;tex&amp;gt; dp[i + 1][j + p_{1}[i]] = dp[i][j] &amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''if''' &amp;lt;tex&amp;gt;(dp[i + 1][j] &amp;gt; dp[i][j] + p_{2}[i]) &amp;lt;/tex&amp;gt; '''then'''&lt;br /&gt;
            &amp;lt;tex&amp;gt; dp[i + 1][j] = dp[i][j] + p_{2}[i] &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;answer = INF&amp;lt;/tex&amp;gt;&lt;br /&gt;
   for &amp;lt;tex&amp;gt; j = 0 \dots maxTime &amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;answer = \min (answer, \max(j, dp[n][j]))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Время работы==&lt;br /&gt;
Время работы &amp;lt;tex&amp;gt;O(n \cdot maxTime)&amp;lt;/tex&amp;gt; {{---}} псевдополиномиальный алгоритм. Кроме того, если время выполнения работ, будет вещественные числа, то придется приводить их до целых, либо считать приблежённое значения.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
J.K. Lenstra, A.H.G. Rinnooy Kan, and P. Brucker. Complexity&lt;br /&gt;
of machine scheduling problems. Annals of Discrete Mathematics,&lt;br /&gt;
1:343–362, 1977.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Теория расписаний]]&lt;/div&gt;</summary>
		<author><name>5.18.60.212</name></author>	</entry>

	</feed>