O2Cmax — различия между версиями
| Zemskovk (обсуждение | вклад)  (→Описание алгоритма) | Zemskovk (обсуждение | вклад)  м (→Описание алгоритма) | ||
| Строка 15: | Строка 15: | ||
| ##*Строим расписание слева: выполняем на первом станке все работы из <tex>I \setminus \{x\}</tex>, а на втором выполняем первой работу <tex>x</tex>, затем <tex>I \setminus \{x\}</tex>. | ##*Строим расписание слева: выполняем на первом станке все работы из <tex>I \setminus \{x\}</tex>, а на втором выполняем первой работу <tex>x</tex>, затем <tex>I \setminus \{x\}</tex>. | ||
| ##*Теперь, упираясь в правую границу, равную <tex> C_{max} </tex>, можно построить расписание справа: выполняем на первом станке все работы из <tex>J</tex>, затем <tex>x</tex>, а для второго выполняем работы из <tex>J</tex>.[[Файл:Picture2.gif|500px|center]] | ##*Теперь, упираясь в правую границу, равную <tex> C_{max} </tex>, можно построить расписание справа: выполняем на первом станке все работы из <tex>J</tex>, затем <tex>x</tex>, а для второго выполняем работы из <tex>J</tex>.[[Файл:Picture2.gif|500px|center]] | ||
| − | ## <tex>a_{x} \leqslant b_{y}</tex>. Сводится к первому, если поменять местами станки,при этом надо заново выполнить пункты 1 | + | ## <tex>a_{x} \leqslant b_{y}</tex>. Сводится к первому, если поменять местами станки, при этом надо заново выполнить пункты 1,2 и 3. При выдаче ответа меняем станки обратно местами. | 
| ==Доказательство корректности алгоритма== | ==Доказательство корректности алгоритма== | ||
Версия 23:46, 16 мая 2016
| Задача: | 
| Рассмотрим задачу: 
 | 
Содержание
Описание алгоритма
Пусть  — время выполнения -ой работы на первом станке, а  — на втором.
- Разобьём все работы на два множества: и .
- Найдем такие и , что и .
- Построим оптимальное значение целевой функции: .
-  Рассмотрим два случая:
-  . Будем строить расписание с двух концов:
- Строим расписание слева: выполняем на первом станке все работы из , а на втором выполняем первой работу , затем .
- Теперь, упираясь в правую границу, равную , можно построить расписание справа: выполняем на первом станке все работы из , затем , а для второго выполняем работы из .
 
- . Сводится к первому, если поменять местами станки, при этом надо заново выполнить пункты 1,2 и 3. При выдаче ответа меняем станки обратно местами.
 
-  . Будем строить расписание с двух концов:
Доказательство корректности алгоритма
| Теорема: | 
| Расписание, построенное данным алгоритмом, является корректным и оптимальным. | 
| Доказательство: | 
| Чтобы доказать корректность, надо доказать, что на каждом станке в любой момент времени выполняется не более одной работы, и что каждая работа в каждый момент времени выполняется не более, чем на одном станке. 
 Это неравенство следует из выбора и из того, что . Получили, что каждая работа из этого блока начинает выполняться на втором станке позже, чем она заканчивается на первом. Итого мы доказали корректность. | 
Псевдокод
//Функция принимает список из времён выполнения на первом станке 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

