1ripi1sumwc — различия между версиями
Строка 7: | Строка 7: | ||
=Простая задача = | =Простая задача = | ||
− | Перед решением | + | Перед решением основной задачи рассмотрим более простые. |
+ | ==Задача 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> | ||
{{Задача | {{Задача | ||
Строка 15: | Строка 16: | ||
}} | }} | ||
− | ==Описание алгоритма простой задачи== | + | ==Описание алгоритма простой задачи 1== |
Нам нужно распределить <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> | ||
− | ==Псевдокод простой задачи== | + | ==Псевдокод простой задачи 1== |
<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''' | ||
<tex> t_i \leftarrow </tex> '''max'''<tex>(r_i, \ t_{i-1} - 1)</tex> | <tex> t_i \leftarrow </tex> '''max'''<tex>(r_i, \ t_{i-1} - 1)</tex> | ||
+ | ==Задача 2== | ||
+ | <tex dpi = "200"> 1 \mid \mid \sum w_i C_i</tex> | ||
+ | ==Описание алгоритма простой задачи 2== | ||
+ | Входные данные для этой задачи: число работ <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> | ||
+ | ==Псевдокод простой задачи 2== | ||
+ | <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> | ||
=Основная задача= | =Основная задача= | ||
==Описание алгоритма основной задачи== | ==Описание алгоритма основной задачи== |
Версия 19:42, 2 июня 2015
Задача: |
Дано | работ и один станок. Для каждой работы известно её время появления и вес . Время выполнения всех работ равно . Требуется выполнить все работы, чтобы значение было минимальным, где — время окончания работы.
Содержание
Простая задача
Перед решением основной задачи рассмотрим более простые.
Задача 1
Задача: |
Дано | работ и один станок. Для каждой работы известно её время появления . Время выполнения всех работ равно . Требуется выполнить все работы, чтобы значение было минимальным, где — монотонная функция времени окончания работы для работ .
Описание алгоритма простой задачи 1
Нам нужно распределить
работ в разное время. Если мы назначим время для работы то цена будет . Так как нужно рассмотреть временных промежутков, задача может быть решена за . Функция монотонно неубывающая, тогда работы в расписании надо располагать как можно раньше для получения верного решения. временных интервалов для работ могут быть получены с помощью следующего алгоритма, где предполагается что работы нумеруются так:
Псевдокод простой задачи 1
for to do max
Задача 2
Описание алгоритма простой задачи 2
Входные данные для этой задачи: число работ
и два вектора , размера . Пусть в алгоритме задания перечислены так:
Псевдокод простой задачи 2
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