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