問題描述:
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機器上加工時間短的排在后面,與具體實現的步驟相符