1ripi1sumwc — различия между версиями
Строка 9: | Строка 9: | ||
Перед решением основной задачи рассмотрим более простые. | Перед решением основной задачи рассмотрим более простые. | ||
− | ==Задача 1== | + | ==Задача <tex>1 \mid r_i,p_i = 1 \mid \sum f_i</tex>== |
<tex dpi = "200"> 1 \mid r_i,p_i = 1 \mid \sum f_i</tex> | <tex dpi = "200"> 1 \mid r_i,p_i = 1 \mid \sum f_i</tex> | ||
{{Задача | {{Задача | ||
Строка 16: | Строка 16: | ||
}} | }} | ||
− | ==Описание алгоритма | + | ==Описание алгоритма задачи <tex>1 \mid r_i,p_i = 1 \mid \sum f_i</tex>== |
Нам нужно распределить <tex>n</tex> работ в разное время. Если мы назначим время <tex>t</tex> для работы <tex>i</tex> то цена будет <tex>f_i(t + 1)</tex>. Так как нужно рассмотреть <tex>n</tex> временных промежутков, задача может быть решена за <tex>O(n^3)</tex>. Функция <tex>f_i</tex> монотонно неубывающая, тогда работы в расписании надо располагать как можно раньше для получения верного решения. <tex>n</tex> временных интервалов <tex>t_i</tex> для <tex>n</tex> работ могут быть получены с помощью следующего алгоритма, где предполагается что работы нумеруются так: | Нам нужно распределить <tex>n</tex> работ в разное время. Если мы назначим время <tex>t</tex> для работы <tex>i</tex> то цена будет <tex>f_i(t + 1)</tex>. Так как нужно рассмотреть <tex>n</tex> временных промежутков, задача может быть решена за <tex>O(n^3)</tex>. Функция <tex>f_i</tex> монотонно неубывающая, тогда работы в расписании надо располагать как можно раньше для получения верного решения. <tex>n</tex> временных интервалов <tex>t_i</tex> для <tex>n</tex> работ могут быть получены с помощью следующего алгоритма, где предполагается что работы нумеруются так: | ||
<tex> r_1 \leqslant r_2 \leqslant \ldots \leqslant r_n</tex> | <tex> r_1 \leqslant r_2 \leqslant \ldots \leqslant r_n</tex> | ||
− | ==Псевдокод | + | ==Псевдокод задачи <tex>1 \mid r_i,p_i = 1 \mid \sum f_i</tex>== |
<tex>t_1 \leftarrow r_1 </tex> | <tex>t_1 \leftarrow r_1 </tex> | ||
'''for''' <tex> i \leftarrow 2</tex> '''to''' <tex>n</tex> '''do''' | '''for''' <tex> i \leftarrow 2</tex> '''to''' <tex>n</tex> '''do''' | ||
Строка 27: | Строка 27: | ||
==Задача 2== | ==Задача 2== | ||
<tex dpi = "200"> 1 \mid \mid \sum w_i C_i</tex> | <tex dpi = "200"> 1 \mid \mid \sum w_i C_i</tex> | ||
− | ==Описание алгоритма | + | ==Описание алгоритма задачи <tex>1 \mid \mid \sum w_i C_i</tex>== |
Входные данные для этой задачи: число работ <tex>n</tex> и два вектора <tex>p_i</tex>, <tex>w_i</tex> размера <tex>n</tex>. | Входные данные для этой задачи: число работ <tex>n</tex> и два вектора <tex>p_i</tex>, <tex>w_i</tex> размера <tex>n</tex>. | ||
Пусть в алгоритме задания перечислены так: | Пусть в алгоритме задания перечислены так: | ||
<tex>w_1/p_1 \geqslant w_2/p_2 \geqslant \ldots w_n/p_n</tex> | <tex>w_1/p_1 \geqslant w_2/p_2 \geqslant \ldots w_n/p_n</tex> | ||
− | ==Псевдокод | + | ==Псевдокод задачи <tex>1 \mid \mid \sum w_i C_i</tex>== |
+ | <tex> C_0 \leftarrow 0</tex> | ||
+ | '''for''' <tex> i \leftarrow 1</tex> '''to''' <tex>n</tex> '''do''' | ||
+ | <tex>C_i \leftarrow C_{i-1} + p_i</tex> | ||
+ | |||
+ | ==Задача 3== | ||
+ | <tex dpi = "200"> 1 \mid r_j,p_j = 1 \mid \sum f_j</tex> | ||
+ | |||
+ | Вес всех работ <tex>w_i \geqslant 0</tex> | ||
+ | Для всех функций <tex>f_1, f_2, \ldots, f_n</tex> выполняются следующие свойства: | ||
+ | <tex>f_j</tex> неубывающая функция для <tex>j = 1, 2, \ldots, n</tex> | ||
+ | <tex>f_i - f_j</tex> неубывающая функция для <tex>i, j = 1, 2, \ldots, n</tex> при <tex>i < j </tex> | ||
+ | |||
+ | <tex>\sum w_i C_i</tex> являются функцией <tex>f_j(C_j)</tex>, так что по факту решаем задачу <tex>1 \mid r_j,p_j = 1 \mid \sum w_i C_i </tex> | ||
+ | ==Описание алгоритма задачи <tex>1 \mid r_j,p_j = 1 \mid \sum f_j</tex>== | ||
+ | Входные данные для этой задачи: число работ <tex>n</tex> и два вектора <tex>p_i</tex>, <tex>w_i</tex> размера <tex>n</tex>. | ||
+ | Пусть в алгоритме задания перечислены так: | ||
+ | |||
+ | <tex>w_1/p_1 \geqslant w_2/p_2 \geqslant \ldots w_n/p_n</tex> | ||
+ | ==Псевдокод задачи <tex>1 \mid r_j,p_j = 1 \mid \sum f_j</tex>== | ||
<tex> C_0 \leftarrow 0</tex> | <tex> C_0 \leftarrow 0</tex> | ||
'''for''' <tex> i \leftarrow 1</tex> '''to''' <tex>n</tex> '''do''' | '''for''' <tex> i \leftarrow 1</tex> '''to''' <tex>n</tex> '''do''' |
Версия 20:25, 2 июня 2015
Задача: |
Дано | работ и один станок. Для каждой работы известно её время появления и вес . Время выполнения всех работ равно . Требуется выполнить все работы, чтобы значение было минимальным, где — время окончания работы.
Содержание
- 1 Простая задача
- 1.1 Задача [math]1 \mid r_i,p_i = 1 \mid \sum f_i[/math]
- 1.2 Описание алгоритма задачи [math]1 \mid r_i,p_i = 1 \mid \sum f_i[/math]
- 1.3 Псевдокод задачи [math]1 \mid r_i,p_i = 1 \mid \sum f_i[/math]
- 1.4 Задача 2
- 1.5 Описание алгоритма задачи [math]1 \mid \mid \sum w_i C_i[/math]
- 1.6 Псевдокод задачи [math]1 \mid \mid \sum w_i C_i[/math]
- 1.7 Задача 3
- 1.8 Описание алгоритма задачи [math]1 \mid r_j,p_j = 1 \mid \sum f_j[/math]
- 1.9 Псевдокод задачи [math]1 \mid r_j,p_j = 1 \mid \sum f_j[/math]
- 2 Основная задача
Простая задача
Перед решением основной задачи рассмотрим более простые.
Задача
Задача: |
Дано | работ и один станок. Для каждой работы известно её время появления . Время выполнения всех работ равно . Требуется выполнить все работы, чтобы значение было минимальным, где — монотонная функция времени окончания работы для работ .
Описание алгоритма задачи
Нам нужно распределить
работ в разное время. Если мы назначим время для работы то цена будет . Так как нужно рассмотреть временных промежутков, задача может быть решена за . Функция монотонно неубывающая, тогда работы в расписании надо располагать как можно раньше для получения верного решения. временных интервалов для работ могут быть получены с помощью следующего алгоритма, где предполагается что работы нумеруются так:
Псевдокод задачи
for to do max
Задача 2
Описание алгоритма задачи
Входные данные для этой задачи: число работ
и два вектора , размера . Пусть в алгоритме задания перечислены так:
Псевдокод задачи
for to do
Задача 3
Вес всех работ
Для всех функций выполняются следующие свойства: неубывающая функция для неубывающая функция для приявляются функцией , так что по факту решаем задачу
Описание алгоритма задачи
Входные данные для этой задачи: число работ
и два вектора , размера . Пусть в алгоритме задания перечислены так:
Псевдокод задачи
for to do
Основная задача
Описание алгоритма основной задачи
Пусть
Для каждого очередного значения , которое изменяется от до времени окончания последней работы, будем:
- Выбирать работу из множества невыполненных работ, у которой , а значение максимально.
- Если мы смогли найти работу , то выполняем её в момент времени и удаляем из множества невыполненных работ.
- Увеличиваем на один.
Доказательство корректности алгоритма основной задачи
Теорема: |
Расписание, построенное данным алгоритмом, является корректным и оптимальным. |
Доказательство: |
Доказательство будем вести от противного. Первая скобка отрицательная: |
Псевдокод основной задачи
while if and and if
Сложность алгоритма
Множество
станет пустым не позже, чем через шагов цикла. Определить максимум в множестве можно за время , используя , например, очередь с приоритетами. Значит общее время работы алгоритма
Источники информации
- P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 19 - 20
- P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 84 - 85