O2Cmax — различия между версиями
Zemskovk (обсуждение | вклад) |
Zemskovk (обсуждение | вклад) (→Псевдокод) |
||
Строка 37: | Строка 37: | ||
==Псевдокод== | ==Псевдокод== | ||
− | <tex>I | + | <tex>I = \varnothing </tex> |
− | <tex>J | + | <tex>J = \varnothing </tex> |
− | <tex>C_{max} | + | <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> |
− | for <tex>i = 1 | + | '''for''' <tex>i = 1</tex> '''to''' <tex>n</tex> |
− | if <tex>a_{i} \leqslant b{i}</tex> | + | '''if''' <tex>a_{i} \leqslant b{i}</tex> |
− | <tex> I | + | <tex> I = I \cup \{i\} </tex> |
− | else | + | '''else''' |
− | <tex> J | + | <tex> J = J \cup \{i\} </tex> |
Найти <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} < b_{y}</tex> | + | '''if''' <tex>a_{x} < b_{y}</tex> |
Поменять местами первый и второй станок | Поменять местами первый и второй станок | ||
Пересчитать <tex>I, J, x</tex> | Пересчитать <tex>I, J, x</tex> | ||
Строка 56: | Строка 56: | ||
От правой границы {{---}} <tex>C_{max}</tex> на первом станке расставляем расписание для <tex>\{x\}</tex>, затем для <tex>J</tex> | От правой границы {{---}} <tex>C_{max}</tex> на первом станке расставляем расписание для <tex>\{x\}</tex>, затем для <tex>J</tex> | ||
От правой границы {{---}} <tex>C_{max}</tex> на втором станке расставляем расписание для <tex>J</tex><br/> | От правой границы {{---}} <tex>C_{max}</tex> на втором станке расставляем расписание для <tex>J</tex><br/> | ||
− | if станки меняли местами | + | '''if''' станки меняли местами |
поменять их обратно | поменять их обратно | ||
Версия 20:54, 15 мая 2016
Задача: |
Рассмотрим задачу:
|
Содержание
Описание алгоритма
Пусть
- Разобьём все работы на два множества: и .
- Найдем такие и , что и .
- Построим оптимальное значение целевой функции: .
- Рассмотрим два случая. Первый случай, когда
- Строим расписание слева: выполняем на первом станке все работы из , а на втором выполняем первой работу , затем .
- Теперь, упираясь в правую границу, равную , можно построить расписание справа: выполняем на первом станке все работы из , затем , а для второго выполняем работы из .
(он показан на рисунке ниже). Будем строить расписание с двух концов:
- Второй случай сводится к первому: все работы и станки меняются местами, и решается задача для первого случая.
Доказательство корректности алгоритма
Теорема: |
Расписание, построенное данным алгоритмом, является корректным и оптимальным. |
Доказательство: |
Чтобы доказать корректность, надо доказать, что на каждом станке в любой момент времени выполняется не более одной работы, и что каждая работа в каждый момент времени выполняется не более, чем на одном станке.
Это неравенство следует из выбора и из того, что . Получили, что каждая работа из этого блока начинает выполняться на втором станке позже, чем она заканчивается на первом.Итого мы доказали корректность. |
Псевдокод
for to if else Найти , где Найти , где if Поменять местами первый и второй станок Пересчитать Запомнить, что поменяли Начиная с на первом станке расставляем расписание для Начиная с на втором станке расставляем расписание для , затем для
От правой границы — на первом станке расставляем расписание для , затем для От правой границы — на втором станке расставляем расписание для
if станки меняли местами поменять их обратно
Сложность алгоритма
Каждое из множеств в сумме содержит
элементов. Следовательно, чтобы найти максимум в каждом из множеств нам потребуется операций, чтобы составить расписание для каждой работы из множества нам потребуется так же операций. Получаем сложность алгоритма .