O2Cmax — различия между версиями
AVasilyev (обсуждение | вклад) м (→Описание алгоритма) |
AVasilyev (обсуждение | вклад) м (→Доказательство корректности алгоритма) |
||
Строка 28: | Строка 28: | ||
Расписание, построенное данным алгоритмом, является корректным и оптимальным. | Расписание, построенное данным алгоритмом, является корректным и оптимальным. | ||
|proof= | |proof= | ||
− | Чтобы доказать корректность, надо доказать, что на каждом станке | + | Чтобы доказать корректность, надо доказать, что на каждом станке в любой момент времени выполняется не более одной работы, и что каждая работа в каждый момент времени выполняется не более, чем на одном станке.<br/> |
− | Первое утверждение вытекает из того, что мы строили расписание, опираясь на <tex>C_{max}</tex>. Из построения <tex>C_{max} \ge \sum \limits_{i = 1}^{n}a_{i}, \sum \limits_{i = 1}^{n}b_{i}</tex>, следовательно на каждом станке | + | Первое утверждение вытекает из того, что мы строили расписание, опираясь на <tex>C_{max}</tex>. Из построения <tex>C_{max} \ge \sum \limits_{i = 1}^{n}a_{i}, \sum \limits_{i = 1}^{n}b_{i}</tex>, следовательно на каждом станке в любой момент времени выполняется не более одной работы.<br/> |
− | Докажем теперь второе утверждение. У нас имеется 3 блока: <tex> I \setminus \{x\}, \{x\}, J</tex>. | + | Докажем теперь второе утверждение. У нас имеется 3 блока работ: <tex> I \setminus \{x\}, \{x\}, J</tex>. |
<ol> | <ol> | ||
− | <li>Для блока <tex> \{x\}</tex> пересечения отсутствуют из того, что <tex> C_{max} \ge a_{x}+b_{x}</tex>, а этот блок выполняется с разных концов станков, | + | <li>Для блока <tex> \{x\}</tex> пересечения отсутствуют из того, что <tex> C_{max} \ge a_{x}+b_{x}</tex>, а этот блок выполняется с разных концов станков, выполнения работы <tex> x </tex> на разных станках не пересекаются.</li> |
− | <li>Для блока <tex> I \setminus \{x\}</tex> | + | <li>Для блока <tex> I \setminus \{x\}</tex> рассмотрим сумму: |
<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/> |
Версия 13:58, 21 июня 2012
Содержание
Постановка задачи
Рассмотрим задачу:
- Дано работ и станка.
- Для каждой работы известно её время выполнения на каждом станке.
Требуется минимизировать время окончания всех работ, если каждую работу необходимо выполнить на обоих станках.
Описание алгоритма
Пусть
- Разобьём все работы на два множества: и
- Найдем такие и , что и
- Построим оптимальное значение целевой функции: .
- Рассмотрим два случая. Первый случай, когда
- Строим расписание слева: выполняем на первом станке все работы из , а на втором выполняем первой работу , затем .
- Теперь, упираясь в правую границу, равную , можно построить расписание справа: выполняем на первом станке все работы из , затем , а для второго выполняем работы из
Второй случай сводится к первому: все работы и станки меняются местами, и решается задача для первого случая.
. Будем строить расписание с двух концов:
Доказательство корректности алгоритма
Теорема: |
Расписание, построенное данным алгоритмом, является корректным и оптимальным. |
Доказательство: |
Чтобы доказать корректность, надо доказать, что на каждом станке в любой момент времени выполняется не более одной работы, и что каждая работа в каждый момент времени выполняется не более, чем на одном станке.
Итого мы доказали корректность. |
Псевдокод
for if else Найти , где Найти , где if Поменять местами первый и второй станок Пересчитать Запомнить, что поменяли shed2[x] Для всех sched1[i] sched2[i] Для всех sched1[i] sched2[i] sched1[x] if станки меняли местами поменять их обратно
Сложность алгоритма
Каждое из множеств в сумме содержит
элементов. Следовательно, чтобы найти максимум в каждом из множеств нам потребуется операций, чтобы составить расписание для каждой работы из множества нам потребуется так же операций. Получаем сложность алгоритма .