流水作业调度问题———Johnson算法

问题描述:

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_iin 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机器上加工时间短的排在后面,与具体实现的步骤相符

原文地址:https://www.cnblogs.com/hh--boke/p/15339870.html