R2Cmax
| НЕТ ВОЙНЕ |
|
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. Антивоенный комитет России |
| Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. |
| meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки. |
| Задача: |
| Дано два разных неоднородных станка, которые работают параллельно. Есть работ, время выполнения которых на первом и втором станке различное. Нужно минимизировать время завершения всех работ. |
Задача является -полной задачей[1].
Содержание
Неэффективное решение
Переберём все битовые маски длины . Для каждой маски вычислим завершение последней работы. Работы будем выполнять следующим образом, если на -й позиции стоит , то -ая работа будет выполняться на первом станке, иначе на втором. Среди всех масок выберем ту, у которой минимальный.
Время работы алгоритма
Эффективное решение
Применим для решения данной задачи динамическое программирование.
Будем считать массив , в котором будем хранить минимально время выполнения работ на втором станке, где означает, что мы рассмотрели работ, а — с каким временем выполнения работ на первом станке. Тогда не превосходит суммы выполнения работ на первом станке. Назовем эту сумму .
Изначальное значение , а всё остальную таблицу проинициализируем бесконечностью.
Допустим мы посчитали динамику для работ. Теперь надо пересчитать её для -ой работы. Переберём время выполнения работ на первом станке и посчитаем какое минимально время выполнения мы можем получить на втором станке при фиксированном времени на первом. Так как -ю работу мы можем выполнить либо на первом станке, либо на втором, то надо прорелаксировать значением , что соответсвует выполнению работы на первом станке, и значением (выполнение на втором станке).
Таким образом:
Тогда ответом на задачу будет . Другими словами мы перебираем время работы на первом станке и смотрим сколько ещё потребуется работать на втором станке. Время выполнения всех работ — это максимум из этих двух величин. И в конце из всех времен выбираем минимальное.
Также можно заметить, что во время каждой итерации алгоритма используется только два столбца массива . Это позволяет уменьшить использование памяти с до .
Доказательство корректности алгоритма
| Теорема: |
Расписание, построенное данным алгоритмом, является корректным и оптимальным. |
| Доказательство: |
|
Корректность расписания, составленного алгоритмом очевидна. Надо доказать его оптимальность. Пусть расписание, составленное этим алгоритмом не оптимальное и в конце работы алгоритма минимум достигается в . Рассмотрим оптимальное решение . Рассмотрим произвольную работу, выполненную на первом станке в оптимальном расписании, но на втором в расписании, составленном алгоритмом. Пусть у этой работы номер . Если её выполнить на первом станке, то время окончания всех работ будет . Однако Рассмотрим произвольную работу, выполненную в оптимальном расписании на втором станке, но на первом в расписании, составленном алгоритмом. Пусть номер этой работы . Если выполнять эту работу на втором станке, то время выполнения всех работ будет . Но . В итоге если превратить решение в решение эквивалентное , то ответ не будет превосходить ответ . Тогда расписание оптимальное. |
Псевдокод
// Функция принимает количество работ n, список времён выполнения работ на первом станке p1 и времён выполнения на втором станке p2.
// Функция возвращает минимальное время выполнения всех работ на двух станках. function getCmax(p1 : int[n], p2 : int[n]): int int maxTime = 0 for i = 0 .. n - 1 maxTime += p1[i] int[][] dp fill(dp, ) dp[0][0] = 0 for i = 0 .. n - 1 for j = 0 .. maxTime dp[i + 1][j] = min(dp[i][j - p1[i + 1]], dp[i][j] + p2[i + 1]) int answer = for j = 0 .. maxTime answer = min(answer, max(j, dp[n][j])) return answer
Время работы
Время работы — псевдополиномиальный алгоритм. Кроме того, если время выполнения работ, будет вещественные числа, то придется приводить их до целых, либо считать приблежённое значения.
См. также
Примечания
- ↑ J.K. Lenstra, A.H.G. Rinnooy Kan, and P. Brucker. Complexity of machine scheduling problems. Annals of Discrete Mathematics, 1:343–362, 1977.
Источники информации
- J.K. Lenstra, A.H.G. Rinnooy Kan, and P. Brucker. Complexity of machine scheduling problems. Annals of Discrete Mathematics, стр. 358–360, 1977.