[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]:
- Целевые функции задач совпадают, поэтому из оптимальности [math] S' [/math] следует оптимальность [math] S [/math].
- Покажем, как получить из расписания [math] S' [/math] допустимое расписание для [math]S[/math] (в расписании для [math]S'[/math] допустимость нарушает то, что на одном станке выполняется несколько блоков одной работы):
- Построим двудольный граф, в левую долю которого поместим работы, а в правую — возможные моменты времени. Из вершины, соответствующей работе [math] i [/math] будет идти ребро в вершину, соответствующую временному моменту [math] t[/math], если работа [math] i [/math] в расписании для [math] S' [/math] претендует на выполнение в момент времени [math]t[/math].
- Раскрасим ребра этого графа в [math]m[/math] цветов, из теории графов известно, что это можно сделать.
- Назначим выполнение единичного элемента работы [math]i[/math] в момент времени [math]t[/math] на станке [math]k[/math], если соответствующее ребро раскрашено в цвет [math]k[/math].
- После данного преобразования мы не изменим значение целевой функции (так как мы переставляем только элементы работ, выполняющихся в один и тот же момент времени). Также расписание станет допустимым для [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].
См. также.
Примечания
- ↑ P. Brucker. Scheduling Algorithms (2006), 5th edition, p. 121