O2Cmax — различия между версиями
Dimitrova (обсуждение | вклад) (→Псевдокод) |
Dimitrova (обсуждение | вклад) (→Описание алгоритма) |
||
Строка 25: | Строка 25: | ||
</ol> | </ol> | ||
[[Файл:O2Cmax.gif|300px|center]] | [[Файл:O2Cmax.gif|300px|center]] | ||
+ | |||
+ | ==Доказательство корректности алгоритма== | ||
+ | Для доказательства оптимальности полученного расписания рассмотрим только первый случай. Второй доказывается аналогично. | ||
+ | Рассмотрим 3 последовательности выполнения работы, начиная с нулевого времени: все работы на первом станке, все работы на втором станке и первая работа на втором станке плюс последняя - на первом.<br/> | ||
+ | Докажем, что время окончания одной из этих трёх последовательностей максимальное из всех возможных окончаний.<br/> | ||
+ | Пронумеруем работы в порядке выполнения их на первом станке и рассмотрим последовательность<br/> | ||
+ | <ul><tex>0 \rightarrow a_{1} \rightarrow \dots \rightarrow a_{i} \rightarrow b_{i} \rightarrow \dots \rightarrow b_{n-1}</tex></ul> | ||
+ | <ol> | ||
+ | <li>Если <tex>i \in I</tex>, то | ||
+ | <ul><tex>\sum \limits _{j = 1}^{i}a_{j} + \sum\limits_{j = i}^{n -1}b_{j} \le \sum\limits_{j = 1}^{i-1}b_{j} +a_{i}+ \sum\limits_{j = i}^{n -1}b_{j}</tex></ul> | ||
+ | Это неравенство получаем из первого случая и того, что <tex>i \in I \Rightarrow \ \forall j < i, j \in I \Rightarrow \forall j < i, a_{j} \le b_{j}</tex> | ||
+ | <ul><tex>\sum \limits_{j = 1}^{i-1}b_{j} +a_{i}+ \sum\limits_{j = i}^{n -1}b_{j} \le \sum \limits_{j = 1}^{n} b_{j}</tex></ul> | ||
+ | Это неравенство получено из того, что <tex>a_{i} \le a_{n} \le b_{n}</tex>, где <tex>n = x</tex> | ||
+ | </li> | ||
+ | <li> | ||
+ | Если <tex>i \in J</tex>, то | ||
+ | <ul><tex>\sum \limits _{j = 1}^{i}a_{j} + \sum\limits_{j = i}^{n -1}b_{j} \le \sum\limits_{j = 1}^{i}a_{j} +b_{i}+ \sum\limits_{j = i+1}^{n -1}a_{j}</tex></ul> | ||
+ | Это неравенство получаем из первого случая и того, что <tex>i \in J \Rightarrow \ \forall j > i, j \in I \Rightarrow \forall j > i, b_{j} \le a_{j}</tex> | ||
+ | <ul><tex>\sum \limits_{j = 1}^{i}a_{j} +b_{i}+ \sum\limits_{j = i+1}^{n -1}a_{j} \le \sum \limits_{j = 1}^{n} a_{j}</tex></ul> | ||
+ | Это неравенство получено из того, что <tex>b_{i} \le a_{i} \le a_{n}</tex>, где <tex>n = x</tex> | ||
+ | </li> | ||
+ | </ol> | ||
+ | Три последовательности выполнения работ, которые мы рассмотрели вначале, являются нижней оценкой для OpenShop problem, следовательно они и дают оптимальное решение. | ||
==Псевдокод== | ==Псевдокод== |
Версия 12:00, 9 июня 2012
Содержание
Постановка задачи
Рассмотрим задачу:
- Дано работ и станка.
- Для каждой работы известно её время выполнения на каждом станке.
Требуется минимизировать время окончания всех работ, если каждую работу необходимо выполнить на обоих станках.
Описание алгоритма
Пусть
- Разобьём все работы на два множества: и
- Найдем и
- Рассмотрим 2 случая. Первый случай, когда
- Выполняем все работы на первом станке в следующем порядке: сперва все работы из , затем из и последней работу
- На втором станке выполняем первой работу
- Остальные работы выполняем на втором станке в порядке их завершения на первом тогда, когда второй станок свободен, а работа на первом уже выполнена
Второй случай рассматривается аналогично: первый и второй станок меняются местами, и вместо
— работа
, тогда
Доказательство корректности алгоритма
Для доказательства оптимальности полученного расписания рассмотрим только первый случай. Второй доказывается аналогично.
Рассмотрим 3 последовательности выполнения работы, начиная с нулевого времени: все работы на первом станке, все работы на втором станке и первая работа на втором станке плюс последняя - на первом.
Докажем, что время окончания одной из этих трёх последовательностей максимальное из всех возможных окончаний.
Пронумеруем работы в порядке выполнения их на первом станке и рассмотрим последовательность
- Если
Это неравенство получаем из первого случая и того, что
Это неравенство получено из того, что
, где
, то
-
Если
Это неравенство получаем из первого случая и того, что
Это неравенство получено из того, что
, где
, то
Три последовательности выполнения работ, которые мы рассмотрели вначале, являются нижней оценкой для OpenShop problem, следовательно они и дают оптимальное решение.
Псевдокод
for if else Найти , где Найти , где if Поменять местами первый и второй станок Пересчитать Запомнить, что поменяли shed2[x] Для всех sched1[i] sched2[i] Для всех sched1[i] sched2[i] sched1[x] if станки меняли местами поменять их обратно
Сложность алгоритма
Каждое из множеств в сумме содержит
элементов. Следовательно, чтобы найти максимум в каждом из множеств нам потребуется операций, чтобы составить расписание для каждой работы из множества нам потребуется так же операций. Получаем сложность алгоритма .