O2Cmax — различия между версиями
| Dimitrova (обсуждение | вклад)  (→Псевдокод) | Dimitrova (обсуждение | вклад)   (→Доказательство корректности алгоритма) | ||
| Строка 36: | Строка 36: | ||
| <ul><tex>\sum \limits_{i = 1}^k a_{i} \le \sum \limits_{i = 1}^k b_{i} \le \sum \limits_{i = 1}^{k - 1} b_{i} + b_{x}</tex></ul> | <ul><tex>\sum \limits_{i = 1}^k a_{i} \le \sum \limits_{i = 1}^k b_{i} \le \sum \limits_{i = 1}^{k - 1} b_{i} + b_{x}</tex></ul> | ||
| Это неравенство следует из выбора <tex>I</tex> и из того, что <tex>b_{x} \ge a_{x} \ge a_{i}, \forall i \in I</tex>.<br/> | Это неравенство следует из выбора <tex>I</tex> и из того, что <tex>b_{x} \ge a_{x} \ge a_{i}, \forall i \in I</tex>.<br/> | ||
| − | Получили, что каждая работа из этого блока начинает выполняться на втором станке позже, чем она заканчивается .</li> | + | Получили, что каждая работа из этого блока начинает выполняться на втором станке позже, чем она заканчивается на первом.</li> | 
| − | <li> | + | <li>Покажем, что любая работа из <tex>J</tex> начинает выполняться на втором станке позже, чем заканчивает выполняться на первом. Для этого рассмотрим сумму: | 
| <ul><tex>\sum \limits_{i = 1}^k b_{i} \le \sum \limits_{i = 1}^k a_{i} \le \sum \limits_{i = 1}^{k - 1} a_{i} + a_{x}</tex></ul> | <ul><tex>\sum \limits_{i = 1}^k b_{i} \le \sum \limits_{i = 1}^k a_{i} \le \sum \limits_{i = 1}^{k - 1} a_{i} + a_{x}</tex></ul> | ||
| Это неравенство следует из выбора <tex>J</tex> и из того, что <tex>a_{x} \ge a_{i}, \forall i \in I</tex>.<br/> | Это неравенство следует из выбора <tex>J</tex> и из того, что <tex>a_{x} \ge a_{i}, \forall i \in I</tex>.<br/> | ||
| − | Получили, что  | + | Получили, что каждая работа из этого блока начинает выполняться на втором станке позже, чем она заканчивается на первом.</li> | 
| </ol> | </ol> | ||
| Итого мы доказали корректность.<br/> | Итого мы доказали корректность.<br/> | ||
Версия 14:40, 21 июня 2012
Содержание
Постановка задачи
Рассмотрим задачу:
- Дано работ и станка.
- Для каждой работы известно её время выполнения на каждом станке.
Требуется минимизировать время окончания всех работ, если каждую работу необходимо выполнить на обоих станках.
Описание алгоритма
Пусть  — время выполнения -ой работы на первом станке, а  — на втором.
- Разобьём все работы на два множества: и
- Найдем такие и , что и
- Построим оптимальное значение целевой функции: .
-  Рассмотрим два случая. Первый случай, когда . Будем строить расписание с двух концов:
- Строим расписание слева: выполняем на первом станке все работы из , а на втором выполняем первой работу , затем .
- Теперь, упираясь в правую границу, равную , можно построить расписание справа: выполняем на первом станке все работы из , затем , а для второго выполняем работы из
 Второй случай сводится к первому: все работы и станки меняются местами, и решается задача для первого случая. 
Доказательство корректности алгоритма
| Теорема: | 
| Расписание, построенное данным алгоритмом, является корректным и оптимальным. | 
| Доказательство: | 
| Чтобы доказать корректность, надо доказать, что на каждом станке в любой момент времени выполняется не более одной работы, и что каждая работа в каждый момент времени выполняется не более, чем на одном станке. 
 Итого мы доказали корректность. | 
Псевдокод
for if else Найти , где Найти , где if Поменять местами первый и второй станок Пересчитать Запомнить, что поменяли Начиная с на первом станке расставляем расписание для Начиная с на втором станке расставляем расписание для , затем для
От правой границы — на первом станке расставляем расписание для , затем для От правой границы — на втором станке расставляем расписание для
if станки меняли местами поменять их обратно
Сложность алгоритма
Каждое из множеств в сумме содержит элементов. Следовательно, чтобы найти максимум в каждом из множеств нам потребуется операций, чтобы составить расписание для каждой работы из множества нам потребуется так же операций. Получаем сложность алгоритма .

