O2Cmax — различия между версиями
Dimitrova (обсуждение | вклад) (→Доказательство корректности алгоритма) |
Dimitrova (обсуждение | вклад) (→Псевдокод) |
||
Строка 56: | Строка 56: | ||
Найти <tex>x</tex>, где <tex>a_{x} = \max \limits_{i \in I} \{a_{i}\}</tex> | Найти <tex>x</tex>, где <tex>a_{x} = \max \limits_{i \in I} \{a_{i}\}</tex> | ||
Найти <tex>y</tex>, где <tex>b_{y} = \max \limits_{i \in J} \{b_{i}\}</tex> | Найти <tex>y</tex>, где <tex>b_{y} = \max \limits_{i \in J} \{b_{i}\}</tex> | ||
− | if <tex>a_{x} | + | if <tex>a_{x} > b_{y}</tex> |
Поменять местами первый и второй станок | Поменять местами первый и второй станок | ||
Пересчитать <tex>I, J, x</tex> | Пересчитать <tex>I, J, x</tex> | ||
Строка 68: | Строка 68: | ||
sched1[i] <tex>\leftarrow time1</tex> | sched1[i] <tex>\leftarrow time1</tex> | ||
<tex>time1 \leftarrow time1 + a_{i}</tex> | <tex>time1 \leftarrow time1 + a_{i}</tex> | ||
− | |||
sched2[i] <tex>\leftarrow time2</tex> | sched2[i] <tex>\leftarrow time2</tex> | ||
<tex>time2 \leftarrow time2 + b_{i}</tex> | <tex>time2 \leftarrow time2 + b_{i}</tex> | ||
Строка 75: | Строка 74: | ||
sched1[i] <tex>\leftarrow time1</tex> | sched1[i] <tex>\leftarrow time1</tex> | ||
<tex>time1 \leftarrow time1 + a_{i}</tex> | <tex>time1 \leftarrow time1 + a_{i}</tex> | ||
− | |||
sched2[i] <tex>\leftarrow time2</tex> | sched2[i] <tex>\leftarrow time2</tex> | ||
<tex>time2 \leftarrow time2 + b_{i}</tex> | <tex>time2 \leftarrow time2 + b_{i}</tex> | ||
− | |||
sched1[x] <tex>\leftarrow time1</tex> | sched1[x] <tex>\leftarrow time1</tex> | ||
<tex>time1 \leftarrow time1 + a_{x}</tex> | <tex>time1 \leftarrow time1 + a_{x}</tex> | ||
Строка 86: | Строка 83: | ||
if станки меняли местами | if станки меняли местами | ||
поменять их обратно | поменять их обратно | ||
− | |||
==Сложность алгоритма== | ==Сложность алгоритма== | ||
Каждое из множеств в сумме содержит <tex>n</tex> элементов. Следовательно, чтобы найти максимум в каждом из множеств нам потребуется <tex>O(n)</tex> операций, чтобы составить расписание для каждой работы из множества нам потребуется так же <tex>O(n)</tex> операций. Получаем сложность алгоритма <tex>O(n)</tex>. | Каждое из множеств в сумме содержит <tex>n</tex> элементов. Следовательно, чтобы найти максимум в каждом из множеств нам потребуется <tex>O(n)</tex> операций, чтобы составить расписание для каждой работы из множества нам потребуется так же <tex>O(n)</tex> операций. Получаем сложность алгоритма <tex>O(n)</tex>. |
Версия 13:08, 21 июня 2012
Содержание
Постановка задачи
Рассмотрим задачу:
- Дано работ и станка.
- Для каждой работы известно её время выполнения на каждом станке.
Требуется минимизировать время окончания всех работ, если каждую работу необходимо выполнить на обоих станках.
Описание алгоритма
Пусть
- Разобьём все работы на два множества: и
- Найдем и
- Построим целевую функцию: .
- Рассмотрим 2 случая. Первый случай, когда
- Строим расписание слева: выполняем на первом станке все работы из , а на втором выполняем первой работу , затем .
- Теперь, упираясь в левую границу, зная значение , можно построить расписание справа: выполняем на первом станке все работы из , затем , а для второго выполняем работы из
Второй случай рассматривается аналогично: все работы и станки меняются местами.
. Будем строить расписание с двух концов:
Доказательство корректности алгоритма
Теорема: |
Расписание, построенное данным алгоритмом, является корректным и оптимальным. |
Доказательство: |
Чтобы доказать корректность, надо доказать, что на каждом станке никакая из работ не пересекается, и что каждая работа в каждый момент времени выполняется только на одном станке.
Итого мы доказали корректность. |
Псевдокод
for if else Найти , где Найти , где if Поменять местами первый и второй станок Пересчитать Запомнить, что поменяли shed2[x] Для всех sched1[i] sched2[i] Для всех sched1[i] sched2[i] sched1[x] if станки меняли местами поменять их обратно
Сложность алгоритма
Каждое из множеств в сумме содержит
элементов. Следовательно, чтобы найти максимум в каждом из множеств нам потребуется операций, чтобы составить расписание для каждой работы из множества нам потребуется так же операций. Получаем сложность алгоритма .