O2Cmax — различия между версиями
Zemskovk (обсуждение | вклад) (→Псевдокод) |
Zemskovk (обсуждение | вклад) |
||
Строка 2: | Строка 2: | ||
{{Задача | {{Задача | ||
|definition=Рассмотрим задачу: | |definition=Рассмотрим задачу: | ||
− | * | + | *дано <tex>n</tex> работ и <tex>2</tex> станка, |
− | * | + | *для каждой работы известно её время выполнения на каждом станке. |
Требуется минимизировать время окончания всех работ, если каждую работу необходимо выполнить на обоих станках.}} | Требуется минимизировать время окончания всех работ, если каждую работу необходимо выполнить на обоих станках.}} | ||
Строка 9: | Строка 9: | ||
Пусть <tex>a_{i}</tex> {{---}} время выполнения <tex>i</tex>-ой работы на первом станке, а <tex>b_{i}</tex> {{---}} на втором.<br/> | Пусть <tex>a_{i}</tex> {{---}} время выполнения <tex>i</tex>-ой работы на первом станке, а <tex>b_{i}</tex> {{---}} на втором.<br/> | ||
#Разобьём все работы на два множества: <tex>I = \{i \mid a_{i} \leqslant b_{i}; i = 1, \dots, n\}</tex> и <tex>J = \{i \mid a_{i} > b_{i}; i = 1, \dots, n\}</tex>. | #Разобьём все работы на два множества: <tex>I = \{i \mid a_{i} \leqslant b_{i}; i = 1, \dots, n\}</tex> и <tex>J = \{i \mid a_{i} > b_{i}; i = 1, \dots, n\}</tex>. | ||
− | #Найдем такие <tex> x </tex> и <tex> y </tex>, что <tex>a_{x} = \max \{a_{i} | + | #Найдем такие <tex> x </tex> и <tex> y </tex>, что <tex>a_{x} = \max \limits_{i \in I} \{a_{i}\}</tex> и <tex>b_{y} = \max \limits_{i \in J} \{b_{i}\}</tex>. |
− | #Построим оптимальное значение целевой функции: <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>. | + | #Построим оптимальное значение целевой функции: <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>. |
# Рассмотрим два случая. Первый случай, когда <tex>a_{x} > b_{y}</tex> (он показан на рисунке ниже). Будем строить расписание с двух концов: | # Рассмотрим два случая. Первый случай, когда <tex>a_{x} > b_{y}</tex> (он показан на рисунке ниже). Будем строить расписание с двух концов: | ||
#*Строим расписание слева: выполняем на первом станке все работы из <tex>I \setminus \{x\}</tex>, а на втором выполняем первой работу <tex>x</tex>, затем <tex>I \setminus \{x\}</tex>. | #*Строим расписание слева: выполняем на первом станке все работы из <tex>I \setminus \{x\}</tex>, а на втором выполняем первой работу <tex>x</tex>, затем <tex>I \setminus \{x\}</tex>. | ||
Строка 33: | Строка 33: | ||
Итого мы доказали корректность.<br/> | Итого мы доказали корректность.<br/> | ||
− | Оптимальность вытекает из того, что <tex>C_{max}</tex> не может быть меньше <tex>\sum \limits_{i = 1}^{n} a_i, \sum \limits_{i = 1}^{n} b_i, \max \limits_{i = 1}^{n}\{a_i + b_{i}\}</tex>, а из построения оно равно максимуму из этих значений. | + | Оптимальность вытекает из того, что <tex>C_{max}</tex> не может быть меньше <tex>\sum \limits_{i = 1}^{n} a_i,\ \sum \limits_{i = 1}^{n} b_i, \ \max \limits_{i = 1}^{n}\{a_i + b_{i}\}</tex>, а из построения оно равно максимуму из этих значений. |
}} | }} | ||
Строка 39: | Строка 39: | ||
<tex>I = \varnothing </tex> | <tex>I = \varnothing </tex> | ||
<tex>J = \varnothing </tex> | <tex>J = \varnothing </tex> | ||
− | <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> | + | <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</tex> '''to''' <tex>n</tex> | '''for''' <tex>i = 1</tex> '''to''' <tex>n</tex> | ||
− | '''if''' <tex>a_{i} \leqslant | + | '''if''' <tex>a_{i} \leqslant b_{i}</tex> |
<tex> I = I \cup \{i\} </tex> | <tex> I = I \cup \{i\} </tex> | ||
'''else''' | '''else''' | ||
Строка 62: | Строка 62: | ||
Каждое из множеств в сумме содержит <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>. | ||
− | [[Категория: | + | ==См. также== |
+ | * [[P2precpi1Lmax|<tex>P2 \mid prec, p_i = 1 \mid L_{\max}</tex>]] | ||
+ | * [[R2Cmax|<tex>R2 \mid \mid C_{max}</tex>]] | ||
+ | * [[F2Cmax|<tex>F2 \mid \mid C_{max}</tex>]] | ||
+ | * [[O2Cmax|<tex>O2 \mid \mid C_{max}</tex>]] | ||
+ | * [[J2ni2Cmax|<tex>J2 \mid n_{i} \leqslant 2 \mid C_{max}</tex>]] | ||
+ | * [[J2pij1Lmax| <tex>J2\mid p_{ij} = 1\mid L_{max}</tex>]] | ||
+ | |||
+ | == Источники информации == | ||
+ | * Peter Brucker «Scheduling Algorithms», fifth edition, Springer {{---}} с. 158-160 ISBN 978-3-540-69515-8 | ||
+ | |||
+ | [[Категория: Алгоритмы и структуры данных]] | ||
[[Категория: Теория расписаний]] | [[Категория: Теория расписаний]] |
Версия 01:59, 16 мая 2016
Задача: |
Рассмотрим задачу:
|
Содержание
Описание алгоритма
Пусть
- Разобьём все работы на два множества: и .
- Найдем такие и , что и .
- Построим оптимальное значение целевой функции: .
- Рассмотрим два случая. Первый случай, когда
- Строим расписание слева: выполняем на первом станке все работы из , а на втором выполняем первой работу , затем .
- Теперь, упираясь в правую границу, равную , можно построить расписание справа: выполняем на первом станке все работы из , затем , а для второго выполняем работы из .
(он показан на рисунке ниже). Будем строить расписание с двух концов:
- Второй случай сводится к первому: все работы и станки меняются местами, и решается задача для первого случая.
Доказательство корректности алгоритма
Теорема: |
Расписание, построенное данным алгоритмом, является корректным и оптимальным. |
Доказательство: |
Чтобы доказать корректность, надо доказать, что на каждом станке в любой момент времени выполняется не более одной работы, и что каждая работа в каждый момент времени выполняется не более, чем на одном станке.
Это неравенство следует из выбора и из того, что . Получили, что каждая работа из этого блока начинает выполняться на втором станке позже, чем она заканчивается на первом.Итого мы доказали корректность. |
Псевдокод
for to if else Найти , где Найти , где if Поменять местами первый и второй станок Пересчитать Запомнить, что поменяли Начиная с на первом станке расставляем расписание для Начиная с на втором станке расставляем расписание для , затем для
От правой границы — на первом станке расставляем расписание для , затем для От правой границы — на втором станке расставляем расписание для
if станки меняли местами поменять их обратно
Сложность алгоритма
Каждое из множеств в сумме содержит
элементов. Следовательно, чтобы найти максимум в каждом из множеств нам потребуется операций, чтобы составить расписание для каждой работы из множества нам потребуется так же операций. Получаем сложность алгоритма .См. также
Источники информации
- Peter Brucker «Scheduling Algorithms», fifth edition, Springer — с. 158-160 ISBN 978-3-540-69515-8