问题描述:

N个作业1,2,…,n要在由2台机器A和B组成的流水线上完成加工。每个作业加工的顺序都是先在A上加工,然后在B上加工。A和B加工作业i所需的时间分别为a[i]和b[i]。你可以安排每个作业的执行顺序,使得从第一个作业在机器A上开始加工,到最后一个作业在机器B上加工完成所需的时间最少。求这个最少的时间。

大概思路:求一个加工顺序使得加工时间最短,就是让机器空闲时间最短,当A开始工作便会一直运作,关键是B会等待A,很明显A加工第一个作业时B得等待,同理B加工最后一个作业A得等待

Johnson算法

此算法是一种贪心策略:把在A机器上加工最快的作业先加工,把B机器上加工最快的作业放在最后

具体实现:

设\(M_i=min\{a_i,b_i \}\)

将数组M由小到大排序,然后从第一个开始处理,若\(M_i=a_i\)则按顺序排在作业加工顺序的前面,若\(M_i=b_i\)则按顺序排在后面

最后排出来的顺序就是最优解



算法证明

设\(S=\{ J_1,J_2,J_3····J_n \}\)为待加工作业排序,

\(T(S,t)\)为A开始加工S中作业,B需t时刻后才能加工A加工完的作业,这种情况下加工完S中作业所需最小的时间

\(T(S,t)=min \{ a_i+T ( S- \{ J_i \}, b_i+max\{t-a_i,0\} ) \}\), \(J_i\in S\)

假设最佳方案是先加工\(J_i\),然后加工\(J_j\),则有

\(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_i+bj+T_{ij})\)

\(T_{ij}=b_j+max \{b_i+max \{ t-a_i,0 \}-a_j,0\},0\} = b_i+b_j-a_i-a_j+max\{t,a_i,a_i+a_j-b_i\}\)

若\(J_i\)和\(J_j\)调换顺序则:

\(T'(S,t)=a_i+a_j+T(S-\{J_i,J_j\}, T_{ji})\)

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

所以\(T(S,t)<=T'(S,t)\),所以有

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

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

(其实2步转化我不太清楚,只是意会了一下,如有理解的麻烦告诉我,感谢)

\(min\{b_j,a_i\}<= min\{b_i,a_j\}\)

也就是说\(J_i\)在\(J_j\)之前加工最优得满足上式条件,

则\(a_i<=b_i,a_j\)或者 \(b_j<=b_i,a_j\)

即在A机器上加工时间短的任务优先,而在B机器上加工时间短的排在后面,与具体实现的步骤相符