§3. Задача двух станков.
Постановка задачи. Имеется n деталей и два станка. Каждая деталь сначала обрабатывается на первом станке (станок 1), а затем – на втором (станок 2). Станки включаются одновременно. Для каждой детали известно время обработки как на станке 1, так и на станке 2. В какой последовательности надо запустить детали на обработку, чтобы общее время обработки всех деталей было минимальным?
Решение задачи. Введем обозначения. Пронумеруем детали, множество номеров обозначим через I = {1, 2,…, n}. Момент включения обоих станков – через t = 0. Время обработки детали на станках 1 и 2 – через ai и bi соответственно.
Задачу решим методом динамического программирования. Первый этап метода – погружение задачи в семейство аналогичных задач.
Для построения семейства будем рассуждать следующим образом. Из партии I удалим k любых деталей с номерами i1, i2,…, ik. Рассмотрим остальные деталей. Пусть Ik = I \ {i1, i2,…, ik} – множество номеров оставшихся деталей. Каждая деталь i с номером из Ik обрабатывается сначала на станке 1, а затем на станке 2. Станок 1 включается в момент времени t = 0, а станок 2 – через y ед. времени после станка 1.
Если Ik = I и y = 0, то получим исходную задачу.
Введем функцию Беллмана – оптимальное (минимальное) время обработки (n - k) деталей с номерами из Ik, если станок 2 включается через y ед. времени после станка 1. Обозначим ее
Bn-k(i1, i2,…, ik y) (3.1)
Перейдем ко второму этапу метода динамического программирования – составлению уравнения Беллмана. Используем при этом принцип оптимальности. Рассуждаем следующим образом. Из множества деталей с номерами из Ik возьмем произвольную деталь i и первой запустим на обработку.
Станок 1 включился в момент t = 0, а значит, в момент t = ai он закончит обработку детали i и освободится. Деталь i уйдет на обработку на станок 2.
Станок 2 включился в момент t = y, а значит, время окончания обработки детали i на этом станке зависит от соотношения между ai и y:
если y ai (станок 2 включился, а станок 1 еще обрабатывает деталь i), то в момент t = ai деталь i начнет обрабатываться на станке 2, а в момент t = ai + bi обработка детали i на обоих станках закончится;
если y > ai (станок 1 освободился, а станок 2 еще не включен, деталь i ждет момента включения), то деталь i начнет обрабатываться на станке 2 в момент t = y, а в момент t = y + bi обработка детали i на обоих станках закончится.
Итак, момент освобождения станка 2 равен
(3.2)
Далее будут обрабатываться детали с номерами из множества . Для них станок 1 включается в момент t = ai, станок 2 – в момент, который определяется согласно (3.2), т.е. через bi ед. времени после станка 1, если y ai , или через ((y ai) + bi) ед. времени, если y > ai. Обозначим через ti промежуток времени между моментами включения станка 1 и станка 2 для обработки деталей с номерами из множества Ik \ {i}. Тогда
ti = bi + max {0; y ai} (3.3)
Следуя принципу оптимальности, будем считать, что детали с номерами из множества Ik \ {i} обработаны за минимальное время. Это время согласно определения функции Беллмана (3.1) равно Bn-k-1(i1, i2,…, ik, i ti ).
Таким образом, время обработки всех деталей с номерами из Ik, если первой на обработку деталь i, равно
ai + Bn-k-1(i1, i2,…, ik, i ti ). (3.4)
Деталь i для обработки первой была взята произвольно. Поэтому необходимо подсчитать число вида (3.4) для каждой детали из Ik . Минимальное из этих чисел и будет число (3.1), т.е.
Bn-k(i1, i2,…, ik y) = min ;\s\do9(i ( Ik { ai + Bn-k-1(i1, i2,…, ik, i ti )} (3.5)
Уравнение Беллмана получено. Оно является рекуррентным относительно аргумента k. Начальные условия для его решения получим, если в (3.5) положим . Другими словами, из партии I удалим все детали, кроме одной: . Тогда имеем:
B1(1,…, i 1 , i + 1,…, n y) = (3.6)
Третий этап метода динамического программирования – решение уравнения (5) с начальными условиями (3.6).
Оказалось, что для данной задачи хороший алгоритм решения получается после анализа уравнения (3.5). Рассмотрим оптимальное время обработки всех деталей с номерами из I, если станок 2 включается после станка 1 через y ед. времени, т.е. { i1, i2,…, ik } = , Ik = I. Согласно введенной функции Беллмана (3.1) это оптимальное время обозначается как Bn( y). Впредь знак пустого множества будем опускать. Итак, Bn(y) – минимальное время обработки всех n деталей, если станок 2 включается через y ед. времени после станка 1. Из уравнения (3.5) при k = 0 получаем
Bn(y) = min ;\s\do9(i ( I{ai + Bn-1(i ti) }, (3.7)
где ti определено согласно (3.3).
Определим Bn-1(i ti). В этом случае k = 1, I1 = I \ {i}. Из уравнения (3.5) при k = 1, y = ti получаем
Bn-1(i ti) = min ;\s\do9(j ( I1))\b\bc\{( aj + Bn-2(i (3.8)
где tij, определенное согласно (3.3), равно
tij = bj + (3.9)
Подставим (3.8) в (3.7):
(3.10)
Число
ai + aj + Bn-2(i, j y) – (3.11)
есть время обработки всех деталей, если первой обрабатывается деталь i, затем деталь j, а остальные n 2 деталей обрабатываются в оптимальной последовательности.
Поменяем порядок обработки деталей i и j. Рассуждая аналогично, получим значение
Bn(y) = min;\s\do9(j ( I)) \b\bc\{( \o(min;\s\do9(i ( I1))\b\bc\{(aj + ai + Bn-2 (j, (3.12)
где I1 = I \ {j}, и число
aj + ai + Bn-2 (j, i tji) (3.13)
есть время обработки всех деталей, если первой обрабатывается деталь j, затем деталь i, а остальные (n 2) деталей обрабатываются в оптимальной последовательности. Здесь число tji и промежуточное число tj согласно (3.3) равны
tj = , .
Сравнение (3.10) и (3.12) приводит к сравнению (3.11) и (3.13). Соотношение между последними зависит от значений функции для различных значений аргумента y, когда I2 = I \ {i, j}. Очевидно, что минимальное время обработки при заданном множестве I2 не может быть уменьшено за счет увеличения переменной y, т.е. функция по переменной y является неубывающей. Таким образом,
если tij tji, то ,
если tij tji, то .
Теперь можно сделать вывод относительно значений функции :
если tij tji, то . (3.14)
Итак, если tij tji, то в оптимальной последовательности запуска деталей на обработку деталь i предшествует детали j, в противном случае сначала нужно обработать деталь j, а затем деталь i.
Определим деталь, с которой надо начать оптимальную последовательность, и деталь, которой она заканчивается. Положим y = 0 в (3.10) и (3.12) (станки включаются одновременно). Найдем соответствующие ti , tj , tij , tji :
ti = = bi,
== (3.15)
tj = = bj,
== (3.16)
Значение зависит от чисел tij и tji , определенных согласно (3.15) и (3.16), при этом надо найти из них наименьшее.
Рассмотрим два следующих случая.
Пусть – минимальное число из всех чисел ai, bi, i = 1. Положим в соотношениях (3.15) i = . Найдем и для всех j = 1, j , и сравним их. Так как , то согласно (3.16) имеем
= = bj .
Согласно (3.15)
= =
а) если , то = bj .
б) если , то = = .
В любом случае для всех j = 1, j . Следовательно, , что означает, что деталь с номером должна обрабатываться первой среди всех.
2) Пусть – минимальное число из всех чисел ai, bi, i = 1. Положим в соотношениях (3.15) j = . Найдем и для всех i = 1, i , и сравним их. Так как , то согласно (3.16) имеем
= bi .
Согласно (3.15)
=
а) если , то = bi = ,
б) если , то = = bi = .
В любом случае для всех i = 1, i . Следовательно, , что означает, что деталь с номером должна обрабатываться последней из всех.
Алгоритм решения. Исходные данные занесем в таблицу 3.1:
Таблица 3.1.
Номер детали |
1 |
2 |
… |
n |
Время обработки на станке 1 |
а1 |
а2 |
… |
an |
Время обработки на станке 2 |
b1 |
b2 |
… |
|
Среди всех чисел а1, а2,…, an, b1, b2,…, bn найдем наименьшее.
Если минимум равен , то деталь с номером в искомой последовательности будет первой. Из таблицы удаляем столбец .
Если минимум равен , то деталь с номером в искомой последовательности будет последней. Из таблицы удаляем столбец .
На усеченной таблице повторяем пункты 1-3.
Замечание. Если в ходе реализации алгоритма минимум определяется неоднозначно, причем = , то безразлично первой или последней пойдет на обработку деталь . Будем для определенности считать, что первой.
Пример. Пусть имеется 8 деталей, исходные данные для которых приведены в таблице 2.
Таблица 3.2.
Номер детали |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
Время обработки на станке 1 |
5 |
6 |
3 |
4 |
3 |
1 |
2 |
4 |
Время обработки на станке 2 |
5 |
8 |
5 |
3 |
2 |
2 |
4 |
5 |
0. Искомую последовательность запишем в виде (х, х, х, х, х, х, х, х)
1. Первый минимум равен a6 = 1. Первой на обработку пойдет деталь №6: (№6, х, х, х, х, х, х, х). Вычеркиваем столбец 6.
2. Среди оставшихся чисел минимальным являются a7 = b5 = 2. Следовательно, второй (после детали №6) на обработку пойдет деталь №7, а последней в оптимальной последовательности будет деталь №5: (№6, №7, х, х, х, х, х, №5). Вычеркиваем столбцы 5 и 7.
3. Третий минимум равен 3 = a3 = b4 . Значит, третьей на обработку пойдет деталь №3, а предпоследней – деталь №4: (№6, №7, №3, х, х, х, №4, №5). Вычеркиваем столбцы 3 и 4.
4. В оставшейся таблице из трех столбцов минимальным числом является a8 = 4, поэтому деталь №8 будет первой среди оставшихся: (№6, №7, №3, №8, х, х, №4, №5). Вычеркиваем столбец 8.
5. Остались не вычеркнутыми столбцы 1 и 2. Минимум равен a1 = b1 = 5. Согласно замечанию деталь №1 отправим на обработку перед деталью №2: (№6, №7, №3, №8, №1, №2, №4, №5).
Оптимальное время обработки всех деталей не изменится, если деталь №2 пойдет на обработку раньше детали №1: (№6, №7, №3, №8, №2, №1, №4, №5)
Найдем оптимальное время. Построим диаграмму, соответствующую процессу обработки деталей в указанной последовательности. Из диаграммы видно, что детали будут обработаны за 33 единицы времени.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
станок1 |
6 |
7 |
|
|
3 |
|
|
8 |
|
|
|
|
2 |
|
|
|
|
1 |
|
|
|
|
4 |
|
|
|
5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
станок2 |
|
6 |
|
|
7 |
|
|
|
|
3 |
|
|
|
|
8 |
|
|
|
|
2 |
|
|
|
|
1 |
|
|
|
|
4 |
|
|
5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
время |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |