Fpij1sumwu — различия между версиями
Строка 7: | Строка 7: | ||
Одним из наиболее известных алгоритмов решения этой задачи является эвристика Наваза, Энскора и Хама (Nawaz, Enscore, Ham) | Одним из наиболее известных алгоритмов решения этой задачи является эвристика Наваза, Энскора и Хама (Nawaz, Enscore, Ham) | ||
+ | |||
Первое что нужно сделать это упорядочить требования по <tex>\sum\limits_{j = 1}^n p_{i j}</tex> и пронумеровать их в соответствии с этим порядком. Затем нужно определить порядок обслуживания двух первых требований так, чтобы минимизировать время их обслуживания. После этого использовать алгоритм | Первое что нужно сделать это упорядочить требования по <tex>\sum\limits_{j = 1}^n p_{i j}</tex> и пронумеровать их в соответствии с этим порядком. Затем нужно определить порядок обслуживания двух первых требований так, чтобы минимизировать время их обслуживания. После этого использовать алгоритм | ||
Строка 17: | Строка 18: | ||
|statement=Существует оптимальное расписание, в котором каждая работа делается непрерывно. | |statement=Существует оптимальное расписание, в котором каждая работа делается непрерывно. | ||
|proof= | |proof= | ||
− | Рассмотрим расписание, в котором есть работы, которые делаются не непрерывно. Рассмотрим самый ранний разрыв: работа <tex>i</tex> делалась в моменты <tex>t(i), t(i)+1, \ldots, t(i)+k</tex>, где <tex>k<m</tex>, но не делалась в момент времени <tex>t(i)+k+1</tex>. Докажем, что в момент времени <tex>t(i)+k+1</tex>, <tex>k+1</tex>-й станок простаивает и можно продолжить делать <tex>i</tex>-ю работу. | + | Рассмотрим расписание, в котором есть работы, которые делаются не непрерывно. Рассмотрим самый ранний разрыв: работа <tex>i</tex> делалась в моменты <tex>t(i), t(i) + 1, \ldots, t(i) + k</tex>, где <tex>k < m</tex>, но не делалась в момент времени <tex>t(i) + k + 1</tex>. Докажем, что в момент времени <tex>t(i) + k + 1</tex>, <tex>k + 1</tex>-й станок простаивает и можно продолжить делать <tex>i</tex>-ю работу. |
− | Пусть в момент времени <tex>t(i)+k+1</tex> на <tex>k+1</tex>-м станке делается работа <tex>j</tex>. | + | Пусть в момент времени <tex>t(i) + k + 1</tex> на <tex>k + 1</tex>-м станке делается работа <tex>j</tex>. |
− | В <tex>t(i)+k</tex>-й момент времени <tex>k</tex>-й станок был занят выполнением <tex>i</tex>-й работы, а значит, не мог выполнять <tex>j</tex>-ю. Значит, разрыв был раньше, что противоречит тому, что был выбран самый ранний разрыв. Значит, в <tex>t(i)+k+1</tex>-й момент <tex>k+1</tex>-й станок свободен и туда можно поставить <tex>i</tex>-ю работу, устранив разрыв. | + | В <tex>t(i) + k</tex>-й момент времени <tex>k</tex>-й станок был занят выполнением <tex>i</tex>-й работы, а значит, не мог выполнять <tex>j</tex>-ю. Значит, разрыв был раньше, что противоречит тому, что был выбран самый ранний разрыв. Значит, в <tex>t(i) + k + 1</tex>-й момент <tex>k + 1</tex>-й станок свободен и туда можно поставить <tex>i</tex>-ю работу, устранив разрыв. |
После устранения каждого разрыва получим расписание без разрывов, в котором каждая работа заканчивает выполняться не позже, чем в изначальном. | После устранения каждого разрыва получим расписание без разрывов, в котором каждая работа заканчивает выполняться не позже, чем в изначальном. | ||
}} | }} | ||
− | По этому утверждению, если работу <tex>i</tex> начали делать в <tex>t(i)</tex>, то закончена она будет в <tex>t(i)+m</tex>. Найдем время <tex>d'_i</tex> такое, что начав выполнять в него работу <tex>i</tex>, мы успеем выполнить ее до <tex>d_i</tex>: <tex>d'_i = d_i - m</tex>. Таким образом, вычтя из всех <tex>d_i</tex> число <tex>m</tex>, мы свели задачу к <tex>1 \mid p_i = 1 \mid \sum w_i U_i</tex>. | + | По этому утверждению, если работу <tex>i</tex> начали делать в <tex>t(i)</tex>, то закончена она будет в <tex>t(i) + m</tex>. Найдем время <tex>d'_i</tex> такое, что начав выполнять в него работу <tex>i</tex>, мы успеем выполнить ее до <tex>d_i</tex>: <tex>d'_i = d_i - m</tex>. Таким образом, вычтя из всех <tex>d_i</tex> число <tex>m</tex>, мы свели задачу к <tex>1 \mid p_i = 1 \mid \sum w_i U_i</tex>. |
Построив оптимальное расписание для <tex>1 \mid p_i = 1 \mid \sum w_i U_i</tex>, мы найдем времена, в которые нужно начинать выполнять работы. По утверждению выше, работы можно выполнять непрерывно. | Построив оптимальное расписание для <tex>1 \mid p_i = 1 \mid \sum w_i U_i</tex>, мы найдем времена, в которые нужно начинать выполнять работы. По утверждению выше, работы можно выполнять непрерывно. | ||
==Сложность алгоритма== | ==Сложность алгоритма== | ||
− | Задача <tex>F \mid p_{ | + | Задача <tex>F \mid p_{i j} = 1 \mid \sum w_iu_i</tex> за <tex>O(n)</tex> сводится к задаче <tex>1 \mid p_i = 1 \mid \sum w_i u_i</tex>. Задача <tex>1 \mid p_i = 1 \mid \sum u_iw_i</tex> решается за <tex>O(n \log n)</tex>. После решения этой задачи, нужно вывести ответ, имеющий размер <tex>O(nm)</tex>. Значит, итоговая сложность алгоритма {{---}} <tex>O(n \log n + nm)</tex>. |
==См. также.== | ==См. также.== |
Версия 14:42, 3 июня 2015
Задача: |
Дано | станков, на которых нужно обработать деталей. Каждую деталь нужно обработать по очереди на всех станках. Любая работа на любом станке выполняется единицу времени. Для каждой работы есть дедлайн — время, до которого она должна быть закончена, и штраф , который нужно будет выплатить в случае, если работа была закончена после . Необходимо минимизировать суммарный штраф, который придется выплатить.
Содержание
Эвристика NEH
Одним из наиболее известных алгоритмов решения этой задачи является эвристика Наваза, Энскора и Хама (Nawaz, Enscore, Ham)
Первое что нужно сделать это упорядочить требования по
и пронумеровать их в соответствии с этим порядком. Затем нужно определить порядок обслуживания двух первых требований так, чтобы минимизировать время их обслуживания. После этого использовать алгоритмforto do Поместить требование на позицию которое минимизирует общее время обслуживания первых требований.
Описание алгоритма
Утверждение: |
Существует оптимальное расписание, в котором каждая работа делается непрерывно. |
Рассмотрим расписание, в котором есть работы, которые делаются не непрерывно. Рассмотрим самый ранний разрыв: работа делалась в моменты , где , но не делалась в момент времени . Докажем, что в момент времени , -й станок простаивает и можно продолжить делать -ю работу.Пусть в момент времени После устранения каждого разрыва получим расписание без разрывов, в котором каждая работа заканчивает выполняться не позже, чем в изначальном. на -м станке делается работа . В -й момент времени -й станок был занят выполнением -й работы, а значит, не мог выполнять -ю. Значит, разрыв был раньше, что противоречит тому, что был выбран самый ранний разрыв. Значит, в -й момент -й станок свободен и туда можно поставить -ю работу, устранив разрыв. |
По этому утверждению, если работу
начали делать в , то закончена она будет в . Найдем время такое, что начав выполнять в него работу , мы успеем выполнить ее до : . Таким образом, вычтя из всех число , мы свели задачу к .Построив оптимальное расписание для
, мы найдем времена, в которые нужно начинать выполнять работы. По утверждению выше, работы можно выполнять непрерывно.Сложность алгоритма
Задача
за сводится к задаче . Задача решается за . После решения этой задачи, нужно вывести ответ, имеющий размер . Значит, итоговая сложность алгоритма — .См. также.
Источники информации
- Лазарев А.А., Мусатова Е.Г., Кварацхелия А.Г., Гафаров Е.Р. Пособие по теории расписаний.
- Vladimír Modrák, R. Sudhakara Pandian. FLOW SHOP SCHEDULING ALGORITHM TO MINIMIZE COMPLETION TIME FOR -JOBS -MACHINES PROBLEM