1ripi1sumwc — различия между версиями
Строка 9: | Строка 9: | ||
Перед решением основной задачи рассмотрим более простые. | Перед решением основной задачи рассмотрим более простые. | ||
− | ==Задача | + | ==Задача 1== |
<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> | ||
{{Задача | {{Задача | ||
Строка 42: | Строка 42: | ||
Вес всех работ <tex>w_i \geqslant 0</tex> | Вес всех работ <tex>w_i \geqslant 0</tex> | ||
Для всех функций <tex>f_1, f_2, \ldots, f_n</tex> выполняются следующие свойства: | Для всех функций <tex>f_1, f_2, \ldots, f_n</tex> выполняются следующие свойства: | ||
+ | |||
<tex>f_j</tex> неубывающая функция для <tex>j = 1, 2, \ldots, 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>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>\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>1 \mid r_j,p_j = 1 \mid \sum f_j</tex>== | ||
− | + | Пусть перед началом алгоритма работы пронумерованы в соответствии с свойствами для функций <tex>f_1, f_2, \ldots, f_n</tex> | |
− | + | ||
+ | Пояснение для псевдокода: | ||
+ | |||
+ | <tex>T</tex> это множество {<tex>r_j + lp \mid j = 1, 2, \ldots, n; l = 0, 1, \ldots, n-1 </tex>} | ||
+ | |||
+ | '''Calculate''' <tex>F_n</tex> просто вычисляет функцию для поданных значений. | ||
− | <tex> | + | <tex>F_k'(s,e)</tex> это <tex>min(F_{k-1}(s,t_k)+F_{k-1}(t_k + p, e)+f_k(t_k + p) \mid t_k \in T, max(s, r_k) \leqslant t_k \leqslant e-p)</tex> |
==Псевдокод задачи <tex>1 \mid r_j,p_j = 1 \mid \sum f_j</tex>== | ==Псевдокод задачи <tex>1 \mid r_j,p_j = 1 \mid \sum f_j</tex>== | ||
− | <tex> | + | '''for all''' <tex>s, e \in T \ with \ s \leqslant e</tex> '''do''' |
− | '''for''' | + | <tex>F_0(s,e) \leftarrow 0</tex> |
− | <tex> | + | '''for''' <tex>k \leftarrow 1</tex> '''to''' <tex>n</tex> '''do''' |
+ | '''for all''' <tex>s, e \in T \ with \ s \leqslant e</tex> '''do''' | ||
+ | <tex> | ||
+ | F_k(s,e) \leftarrow | ||
+ | \begin{cases} | ||
+ | F_{k-1}(s,e) \ if \ r_k \notin [s - p,e);\\ | ||
+ | F_k'(s,e) \ otherwise; | ||
+ | \end{cases} | ||
+ | </tex> | ||
+ | '''Calculate''' <tex>F_n($$ \min_{i=1}^n (r_i) $$, max_{t \in T}(t+p) )</tex> | ||
=Основная задача= | =Основная задача= | ||
==Описание алгоритма основной задачи== | ==Описание алгоритма основной задачи== | ||
Строка 100: | Строка 116: | ||
== Источники информации == | == Источники информации == | ||
* P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 19 - 20 | * P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 19 - 20 | ||
+ | * P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 38 - 39 | ||
* P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 84 - 85 | * P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 84 - 85 | ||
+ | * P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 101 - 102 | ||
[[Категория: Дискретная математика и алгоритмы]] | [[Категория: Дискретная математика и алгоритмы]] | ||
[[Категория: Теория расписаний]] | [[Категория: Теория расписаний]] |
Версия 21:06, 2 июня 2015
Задача: |
Дано | работ и один станок. Для каждой работы известно её время появления и вес . Время выполнения всех работ равно . Требуется выполнить все работы, чтобы значение было минимальным, где — время окончания работы.
Содержание
- 1 Простая задача
- 1.1 Задача 1
- 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 Основная задача
Простая задача
Перед решением основной задачи рассмотрим более простые.
Задача 1
Задача: |
Дано | работ и один станок. Для каждой работы известно её время появления . Время выполнения всех работ равно . Требуется выполнить все работы, чтобы значение было минимальным, где — монотонная функция времени окончания работы для работ .
Описание алгоритма задачи
Нам нужно распределить
работ в разное время. Если мы назначим время для работы то цена будет . Так как нужно рассмотреть временных промежутков, задача может быть решена за . Функция монотонно неубывающая, тогда работы в расписании надо располагать как можно раньше для получения верного решения. временных интервалов для работ могут быть получены с помощью следующего алгоритма, где предполагается что работы нумеруются так:
Псевдокод задачи
for to do max
Задача 2
Описание алгоритма задачи
Входные данные для этой задачи: число работ
и два вектора , размера . Пусть в алгоритме задания перечислены так:
Псевдокод задачи
for to do
Задача 3
Вес всех работ
Для всех функций выполняются следующие свойства:неубывающая функция для
неубывающая функция для при
являются функцией , так что по факту решаем задачу
Описание алгоритма задачи
Пусть перед началом алгоритма работы пронумерованы в соответствии с свойствами для функций
Пояснение для псевдокода:
это множество { }
Calculate
просто вычисляет функцию для поданных значений.это
Псевдокод задачи
for alldo for to do for all do Calculate
Основная задача
Описание алгоритма основной задачи
Пусть
Для каждого очередного значения , которое изменяется от до времени окончания последней работы, будем:
- Выбирать работу из множества невыполненных работ, у которой , а значение максимально.
- Если мы смогли найти работу , то выполняем её в момент времени и удаляем из множества невыполненных работ.
- Увеличиваем на один.
Доказательство корректности алгоритма основной задачи
Теорема: |
Расписание, построенное данным алгоритмом, является корректным и оптимальным. |
Доказательство: |
Доказательство будем вести от противного. Первая скобка отрицательная: |
Псевдокод основной задачи
while if and and if
Сложность алгоритма
Множество
станет пустым не позже, чем через шагов цикла. Определить максимум в множестве можно за время , используя , например, очередь с приоритетами. Значит общее время работы алгоритма
Источники информации
- P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 19 - 20
- P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 38 - 39
- P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 84 - 85
- P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 101 - 102