問題:
n個作業 N={1,2,…,n}要在2台機器M1和M2組成的流水線上完成加工。每個作業須先在M1上加工,然后在M2上加工。M1和M2加工作業 i 所需的時間分別為 ai 和bi,每台機器同一時間最多只能執行一個作業。
流水作業調度問題要求確定這n個作業的最優加工順序,使得所有作業在兩台機器上都加工完成所需最少時間。最優調度應該是:
1. 使M1上的加工是無間斷的。即M1上的加工時間是所有ai之和,但M2上不一定是bi之和。
2. 使作業在兩台機器上的加工次序是完全相同的。
則得結論:僅需考慮在兩台機上加工次序完全相同的調度。
為了得到最優子解結構(比較重要~~~~ 老師說期末考試會考到這個):
—>機器M1開始加工S中作業時,機器M2還在加工其他作業,要等時間 t 后才可利用,則:
1. 則完成S中作業所需的最短時間記為T(S,t)
2. 完成所有作業所需的最短時間為T(N,0)
3. T(N,0)=min{ai + T(N-{i}, bi)}, i∈N。
ai:選一個作業i先加工,在M1的加工時間。
T(N-{i},bi}:剩下的作業要等bi時間后才能在M2上加工。注意這里函數的定義,因為一開始工作i是隨機取的,M1加工完了ai之后,要開始加工bi了,這里M1是空閑的可以開始加工剩下的N-i個作業了,但此時M2開始加工bi,所以要等bi時間之后才能重新利用,對應到上面函數T(s,t)的定義的話,這里就應該表示成T(N-{i},bi), 所以最優解可表示為T(N,0)=min{ai + T(N-{i}, bi)}, i∈N,即我們要枚舉所有的工作i,使這個式子取到最小值。這里順便吐槽一句:算法中會利用很多數學知識,一定要搞清楚函數的意義以及每個數學符號所代表的含義,這樣不至於各種懵比。繼續分析T(S,t)可得:
T(S,t)={ai + T(S-{i}, bi+max{t-ai,0})}, i∈S
其中:T(S-{i}, bi+max{t-ai,0}):剩下的作業等bi+max{t-ai,0}才能在M2加工,至於這里是怎么推導出來的呢?見下面推導:
最優子結構的證明(問題最優解包括子問題最優解):
最優子結構:設π是N的一個最優調度,其加工順序為π1,…, πn,其所需的加工時間為 aπ1+T’(即第一個作業π1在M1上加工的時間和其它的加工時間)。記S=N-{π1},則T’=T(S, bπ1)。
證明:由T的定義知T(S, bπ1)是對S最優的,故T’>=T(S, bπ1)。若T’>T(S, bπ1),設π’是作業集S在機器M2的等待時間為bπ1情況下的一個最優調度。則π1,π’2, …,π’n是N的一個調度,且該調度所需的時間為aπ1+T’ > aπ1+T(S, bπ1)。這與π是N的最優調度矛盾。故T’<=T(S, bπ1), 從而T’=T(S, bπ1)。最優子結構的性質得證。
分析:
這段證明我開始有點雲里霧里的(第二遍過來看還是雲里霧里的,你妹的),簡單來說就是要證明問題的最優解包含子問題的最優解就行了,那么這里的證明思路是先假設一個最優調度,對於他的子調度T’,因為T(S,t)被定義為是完成S中作業所需的最短時間記為T(S,t),所以有T’>=T(S, bπ1),那么如果這個子調度這里不是最優解的話即T’>T(S, bπ1),會得出aπ1+T’ > aπ1+T(S, bπ1)即原來假設的最優調度不符和最優調度的標准,矛盾,從而推出 T’是一定等於T(S, bπ1),即這個子調度也是最優調度。
問題是:雖然滿足最優子結構性質,也在一定程度滿足子問題重疊性質。N的每個非空子集都計算一次,共2n-1次,指數級的。
為了解決這個問題引入Johnson不等式:
這上面的數學推導簡直看得蛋疼。。。。。。, 記住結論就好:先把所有作業的ai和bi放在一起,從這之中選個最小的,如果是bi的話這個作業i就放最后,如果是ai的話這個作業就放最前,把這個已經安排好的作業從作業集中刪除。重復上述步驟即可。