O2Cmax — различия между версиями
Zemskovk (обсуждение | вклад) |
Zemskovk (обсуждение | вклад) (→Псевдокод) |
||
Строка 37: | Строка 37: | ||
==Псевдокод== | ==Псевдокод== | ||
+ | <font color=green>//Функция принимает список из времён выполнения на первом станке a и времён выполнения на втором станке b.<br>//Функция возвращает пару из расписания для первого станка и расписания для второго станка.</font> | ||
'''function''' scheduling(a: '''int'''[n], b: '''int[n]'''): '''pair<int[n], int[n]>''' | '''function''' scheduling(a: '''int'''[n], b: '''int[n]'''): '''pair<int[n], int[n]>''' | ||
<tex>I = \varnothing </tex> | <tex>I = \varnothing </tex> | ||
Строка 54: | Строка 55: | ||
От правой границы {{---}} <tex>C_{max}</tex> на первом станке расставляем расписание для <tex>\{x\}</tex>, затем для <tex>J</tex> | От правой границы {{---}} <tex>C_{max}</tex> на первом станке расставляем расписание для <tex>\{x\}</tex>, затем для <tex>J</tex> | ||
От правой границы {{---}} <tex>C_{max}</tex> на втором станке расставляем расписание для <tex>J</tex><br/> | От правой границы {{---}} <tex>C_{max}</tex> на втором станке расставляем расписание для <tex>J</tex><br/> | ||
− | ans = пара из расписания для первого станка и расписания для | + | ans = пара из расписания для первого станка и расписания для второго станка |
'''return''' ans | '''return''' ans | ||
'''else''' | '''else''' | ||
ans = scheduling(b, a) | ans = scheduling(b, a) | ||
Меняем местами расписания для станков в ans | Меняем местами расписания для станков в ans | ||
− | '''return''' ans | + | '''return''' ans |
==Сложность алгоритма== | ==Сложность алгоритма== |
Версия 23:20, 16 мая 2016
Задача: |
Рассмотрим задачу:
|
Содержание
Описание алгоритма
Пусть
- Разобьём все работы на два множества: и .
- Найдем такие и , что и .
- Построим оптимальное значение целевой функции: .
- Рассмотрим два случая. Первый случай, когда
- Строим расписание слева: выполняем на первом станке все работы из , а на втором выполняем первой работу , затем .
- Теперь, упираясь в правую границу, равную , можно построить расписание справа: выполняем на первом станке все работы из , затем , а для второго выполняем работы из .
(он показан на рисунке ниже). Будем строить расписание с двух концов:
- Второй случай сводится к первому: все работы и станки меняются местами, и решается задача для первого случая.
Доказательство корректности алгоритма
Теорема: |
Расписание, построенное данным алгоритмом, является корректным и оптимальным. |
Доказательство: |
Чтобы доказать корректность, надо доказать, что на каждом станке в любой момент времени выполняется не более одной работы, и что каждая работа в каждый момент времени выполняется не более, чем на одном станке.
Это неравенство следует из выбора и из того, что . Получили, что каждая работа из этого блока начинает выполняться на втором станке позже, чем она заканчивается на первом.Итого мы доказали корректность. |
Псевдокод
//Функция принимает список из времён выполнения на первом станке a и времён выполнения на втором станке b.
//Функция возвращает пару из расписания для первого станка и расписания для второго станка. function scheduling(a: int[n], b: int[n]): pair<int[n], int[n]> pair<int[n], int[n]> ans for to if else Найти , где Найти , где if Начиная с на первом станке расставляем расписание для Начиная с на втором станке расставляем расписание для , затем для
От правой границы — на первом станке расставляем расписание для , затем для От правой границы — на втором станке расставляем расписание для
ans = пара из расписания для первого станка и расписания для второго станка return ans else ans = scheduling(b, a) Меняем местами расписания для станков в ans return ans
Сложность алгоритма
Каждое из множеств в сумме содержит
элементов. Следовательно, чтобы найти максимум в каждом из множеств нам потребуется операций, чтобы составить расписание для каждой работы из множества нам потребуется так же операций. Получаем сложность алгоритма .См. также
Источники информации
- Peter Brucker «Scheduling Algorithms», fifth edition, Springer — с. 158-160 ISBN 978-3-540-69515-8