加工生产调度

加工生产调度

Johnson 规则

又名约翰逊规则,是作业排序中的一种排序方法。这种方法适用的条件是:\(n\) 个工件经过二、三台设备(有限台设备)加工,所有工件在有限设备上加工的次序相同。

为了便于阐述约翰逊法的具体做法,下面结合一个例子来进行说明:例:有五个工件在二台设备上加工,加工顺序相同,先在设备 \(1\) 上加工,再在设备 \(2\) 上加工,工时列于下表\(1\)中,用约翰逊法排序。

具体步骤为:

第一步,取出最小工时 \(t_{12}=2\)。如该工时为第一工序的,则最先加工;反之,则放在最后加工。此例是 \(A\) 工件第二工序时间,按规则排在最后加工。

第二步,将该已排序工作划去。

第三步,对余下的工作重复上述排序步骤,直至完毕。此时 \(t_{21}=t_{42}=3\)\(B\) 工件第一工序时间最短,最先加工;\(D\) 工件第二工序时间最短,排在余下的工件中最后加工。

最后得到的排序为:\(B-C-E-D-A\)。整批工件的停留时间为 \(27\) 分钟。

更一般的情况是工件加工顺序不同,称为随机性排序。由杰克逊对约翰逊法稍加改进后得到求解方法,称为杰克逊算法

Johnson 规则的正确性证明

\(S=\{J_1,J_2,\cdots,J_n\}\),为待加工部件的作业排序,若 \(A\) 机器开始加工 \(S\) 中的部件时,\(B\) 机器还在加工其他部件,\(t\) 时刻后 \(B\) 机器可加工 \(A\) 机器加工过的部件。在这样的条件下,加工 \(S\) 中任务所需的最短时间 \(T(S,t)=min\{a_i+T(S-\{J_i\},b_i+max\{t-a_i,0\})\}\),其中,\(J_i\in S\)
从下图可以看出,(a) 为机器 \(B\) 等待作业 \(i\) 在机器 \(A\) 上完成的情形,(b) 为作业 \(i\) 等待机器 \(B\) 的情况。

假设最佳方案中,先加工作业 \(J_i\),然后加工作业 \(J_j\),则有:

\[\begin{aligned} T(S,t) &= a_i+T(S-\{J_i\},b_i+max\{t-a_i,0\}) \\ &= a_i+a_j+T(S-\{J_i,J_j\},b_j+max\{b_i+max\{t-a_i,0\}-a_j,0\})\\ &= a_i+a_j+T(S-\{J_i,J_j\},T_i) \end{aligned} \]

\[\begin{aligned} T_i &=b_j+max\{b_i+max\{t-a_i,0\}-a_j,0\}\\ &= b_j+b_i-a_j+max\{max\{t-a_i,0\},a_j-b_i\} \\ &= b_i+b_j-a_j+max\{t-a_i,a_j-b_i,0\} \\ &= b_i+b_j-a_i-a_j+max\{t,a_i,a_i+a_j-b_i\} \\ &= \left \{ \begin{aligned} &t+b_i+b_j-a_i-a_j, & if\ max\{t,a_i,a_i+a_j-b_i\}=t\\ &b_i+a_j-a_j, & if\ max\{t,a_i,a_i+a_j-b_i\}=a_i \\ &b_j, & if\ max\{t,a_i,a_i+a_j-b_i\}=a_i+a_j-b_i \end{aligned} \right. \end{aligned} \]

若按作业 \(J_i\) 和作业 \(J_j\) 的加工顺序调换,则有:

\(T'(S,t)=a_i+a_j+T(S-\{J_i,J_j\},T_j)\),其中,

\(T_j=b_i+b_j-a_i-a_j+max\{t,a_j,a_i+a_j-b_j\}\)

按假设,因为 \(T\le T'\),所以有:

\[max\{t,a_i+a_j-b_i,a_i\}\le max\{t,a_i+a_j-b_j,a_j\} \]

于是,有:

\(a_i+a_j+max\{-b_i,-a_j\}\le a_i+a_j+max\{-b_j,-a_i\}\),即

\[min\{b_j,a_i\}\le min\{b_i,a_j\} \]

上式便是 \(Johnson\) 规则的数学表达式,也就是说在上式成立的条件下,任务 \(J_i\) 安排在任务 \(J_j\) 之前加工可以得到最优解,即在 \(A\) 机器上加工时间短的任务应优先,而在 \(B\) 机器上加工时间短的任务应排在后面。

但是要注意,当 \(min\{b_j,a_i\}= min\{b_i,a_j\}\) 时,需要按 \(a_i \lt a_j\) 比较。因为这时有如下 4 种情况:

(1)\(a_i\lt b_j,a_j\lt b_i\),此时 \(a_i = a_j\),哪个放前面都无所谓;

(2)\(a_i\lt b_j,b_i\lt a_j\),此时 \(a_i\lt a_j\)\(i\) 应该放在前面;

(3)\(b_j\lt a_i,a_j\lt b_i\),此时 \(a_j\lt a_i\)\(j\) 应该放在前面;

(4)\(b_j\lt a_i,b_i\lt a_j\),此时若 \(a_i\lt a_j\),则 \(i\) 放前面,否则 \(j\) 放前面。

posted @ 2025-03-24 13:37  飞花阁  阅读(55)  评论(0)    收藏  举报
//雪花飘落效果