Opij1Sumwc

Материал из Викиконспекты
Перейти к: навигация, поиск
НЕТ ВОЙНЕ

24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.

Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием.

Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей.

Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить.

Антивоенный комитет России

Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.
meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки.

[math]O \mid p_{ij}=1 \mid \sum w_i C_i[/math]

Задача:
Дано [math]m[/math] одинаковых станков, которые работают параллельно и [math]n[/math] работ, котороые необходимо выполнить в произвольном порядке на всех станках. Время выполнения каждой работы на любом станке одинаково и равно 1. Необходимо минимизировать взвешенную сумму времен завершения работ.

Алгоритм

Описание алгоритма

Утверждение:
Оптимальный ответ для [math]S = O \mid p_{ij}=1 \mid \sum w_i C_i[/math] равен оптимальному ответу к задаче [math]S' = P \mid p_i=m, pmtn \mid \sum w_i C_i[/math]
[math]\triangleright[/math]

Для доказательства этого утверждения необходимо показать то, что из оптимальности [math] S' [/math] следует оптимальность [math] S [/math], и предоставить способ построения допустимого расписания для [math] S [/math] из расписания для [math] S' [/math]:

  1. Целевые функции задач совпадают, поэтому из оптимальности [math] S' [/math] следует оптимальность [math] S [/math].
  2. Покажем, как получить из расписания [math] S' [/math] допустимое расписание для [math]S[/math] (в расписании для [math]S'[/math] допустимость нарушает то, что на одном станке выполняется несколько блоков одной работы):
    1. Построим двудольный граф, в левую долю которого поместим работы, а в правую — возможные моменты времени. Из вершины, соответствующей работе [math] i [/math] будет идти ребро в вершину, соответствующую временному моменту [math] t[/math], если работа [math] i [/math] в расписании для [math] S' [/math] претендует на выполнение в момент времени [math]t[/math].
    2. Раскрасим ребра этого графа в [math]m[/math] цветов, из теории графов известно, что это можно сделать.
    3. Назначим выполнение единичного элемента работы [math]i[/math] в момент времени [math]t[/math] на станке [math]k[/math], если соответствующее ребро раскрашено в цвет [math]k[/math].
    4. После данного преобразования мы не изменим значение целевой функции (так как мы переставляем только элементы работ, выполняющихся в один и тот же момент времени). Также расписание станет допустимым для [math] S [/math], так как по определению реберной раскраски, не будет ни одной работы, два единичных блока которых выполняется на одном станке и во все моменты времени не окажется того, что на один станок назначено две работы.
[math]\triangleleft[/math]

Чтобы непосредственно решить эту задачу, воспользуемся теоремой о том, что для задачи [math] P \mid p_i=m, pmtn \mid \sum w_i C_i [/math] существует оптимальное расписание без прерываний[1]. Известно, что для того, чтобы получить оптимальное расписание для такой задачи без прерываний, надо помещать работы по очереди на станки [math]1 \dots m [/math] в порядке убывания весов. Длительности у всех работ совпадают, поэтому расписание будет состоять из [math] \left\lfloor \dfrac{n}{m} \right\rfloor [/math] блоков по [math] m [/math] работ и, возможно, одного неполного блока из [math] n \bmod m [/math] работ. Таким образом, аналогично задаче [math] O \mid p_{ij}=1 \mid C_{max}[/math], чтобы получить допустимое расписание, можно не строить раскраску графа, а просто циклически сдвигать последовательности работ внутри каждого блока.

Время работы

Чтобы построить циклические сдвиги внутри одного блока требуется [math] \mathcal{O} \left( m^2 \right) [/math] времени. Всего блоков [math] \mathcal{O} \left( \dfrac{n}{m} \right) [/math]. Значит, итоговая ассимптотика равна [math] \mathcal{O}(n \cdot m) [/math].

См. также.

Примечания

  1. P. Brucker. Scheduling Algorithms (2006), 5th edition, p. 121