排程演算法(二)
目錄
- 線性規劃
- 使用鬆弛法設計近似演算法
- \(R||C_{max}\)問題
- \(1|r_j|\sum C_j\)問題
- \(1|r_j,prec|\sum w_jC_j\)問題
續排程演算法(一)
線性規劃
現在我們介紹線性規劃演算法在排程問題中的應用。一個線性規劃問題通常以如下形式出現:
尋找長度為\(n\)的解向量\(x=(x_1,...,x_n)\),滿足\(m\)個線性約束\(a_{i1}x1+a_{i2}x_2+...+a_{in}x_n\le b_i\),其中\(1\le i\le n\),並使得\(c_1x_1+c_2x_2+...+c_nx_n\)最小化,其中\(c=(c_1,...c_n)\)為成本向量。
有的時候,上面的一些約束可能是等式而非不等式,也有的時候甚至不存在需要最小化的目標函式,也就是說目標函式是任意的,我們只需要尋找到滿足約束條件的解\(x\)即可。這些都算是線性規劃問題的不同形式。許多優化問題都可以轉化為線性規劃求解,而線性規劃問題存在多項式時間演算法。本節主要考慮\(R|pmtn|C_{max}\)問題的線性規劃模型。
\(R|pmtn|C_{max}\)問題
在不相關並行環境下進行搶佔式排程,優化最終完成時間,不熟悉問題定義的建議回顧一下前面章節。搶佔式排程下,單個任務可能在任何機器上執行一部分,為了形式化這個問題,我們使用\(nm\)個變數\(x_{ij}\),代表任務\(j\)的總任務量在機器\(i\)上執行的比例。例如,如果\(x_{1j}=x_{2j}=1/2\),則說明任務\(j\)在機器1和機器2上各完成了一半的任務量。
現在我們考慮怎樣的線性約束能夠使\(x_{ij}\)的解符合\(R|pmtn|C_{max}\)問題的定義。顯然,每部分任務的比例必須是非負的,從而有:
\[
x_{ij}\ge 0, \ 1\le i\le m,\ 1\le j\le n.
\]
同時,任意有效排程下,每個任務都必須被完成,這意味著:
\[
\sum_{i=1}^m x_{ij}=1,\ 1\le j\le n.
\]
我們的設計目標是最小化排程的最終完成時間\(D\),顯然任何機器上的總處理時間不超過\(D\),根據之前的定義,不相關並行環境下,任務\(j\)在機器\(i\)上的處理時間記為\(p_{ij}\):
\[
\sum_{j=1}^n p_{ij}x_{ij}\le D,\ 1\le i\le m.
\]
最後,我們還需要保證,所有任務的總處理時間都不超過\(D\):
\[
\sum_{i=1}^m x_{ij}p_{ij}\le D,\ 1\le j\le n.
\]
我們需要在滿足上述約束條件下最小化\(D\)。顯然,任何一個有效排程下的\(x_{ij}\)必然滿足這樣的約束,但是有一事不明:一個滿足約束條件的解並沒有確切指定具體的排程策略——\(x_{ij}\)僅能指定任務在不同機器上執行的比例,而不能保證排程時同一時刻只能在一個機器上執行(這一條件無法寫成線性約束)。
有趣的是,這個問題可以通過定義一個開放車間問題\(O\)來解決。我們為每個\(x_{ij}\)建立一個任務\(j\)在機器\(i\)上的操作,操作的處理時間為\(o_{ij}=x_{ij}p_{ij}\),現在對於已經通過線性規劃求出的最優的\(x_{ij}\),我們構造了一個搶佔式的開放車間問題,優化目標仍是\(C_{max}\),此問題概括為\(O|pmtn|C_{max}\),此問題已在上一節通過一個二分圖匹配的形式化問題解決了,同時由於有\(D\)約束了任務的最長處理時間和機器的最長負載時間,也就是說\(P_{max},\Pi_{max} \le D\),新問題的解就是原問題的最優排程。
線性規劃問題不止這點應用,它還能用於設計\(NP\)難問題的近似演算法,這將在下一節介紹。
使用鬆弛法設計近似演算法
現在我們轉向設計一些\(NP\)難的排程難題的近似演算法。近似演算法的設計通常基於相應的\(NP\)難問題的鬆弛版本。問題的鬆弛指的是從原問題中去除一些約束形成的新問題。例如\(1|r_j,pmtn|\sum C_j\)就是\(1|r_j|\sum C_j\)的鬆弛版本,因為實際上搶佔式排程比非搶佔式排程簡單多了,更容易計算最優解。另一種鬆弛的思路是移除“一個機器只能同時處理一個任務”的條件,讓一個機器可以在同一時間執行多個任務。
顯然,原問題的解一定是鬆弛問題的解,反之不一定。我們在上面章節提到的所有非搶佔式排程演算法都能用於解決搶佔式排程,其解雖然可能不最優,但合法。同樣地,鬆弛問題的最優解即使是合法的,也不一定達到原問題的最優解。
在這一課題上一個有效的想法是:設計一個可以在多項式時間內解決的鬆弛問題,然後再設計一個將鬆弛問題的解轉化為原問題可行解的演算法,並保證解儘量接近最優解。問題的關鍵是設計的鬆弛問題儘可能包含原問題較多的資訊,使得鬆弛問題的最優解與原問題最優解儘可能接近。
本節將介紹兩種對排程問題的鬆弛方法,一是通過非搶佔式到搶佔式的鬆弛,二是通過構造線性規劃問題,鬆弛某些線性約束來實現。將鬆弛解轉化為原問題解的方法也有兩種,一是根據任務與機器的配對,二是根據任務在機器上的執行順序。後面會詳細介紹。
在開始本節內容之前,我們先介紹一個概念:鬆弛決策過程(relaxed decision procedure, RDP)。一個最小化問題的\(\rho\)-\(RDP\)定義為,接受一個目標值\(T\),如果鬆弛問題沒有小於等於\(T\)的解則返回\(None\),否則返回一個不超過\(\rho T\)的原問題解。一個多項式時間的\(\rho\)-\(RDP\)能夠很容易的轉化為原問題的\(\rho\)-近似演算法:通過對\(T\)進行二分查詢,尋找最小的\(T\),使得鬆弛問題有解並將此解轉化為原問題的解。
為什麼是\(\rho\)-近似的呢?邏輯是這樣:假如原問題有最優解\(T^*\),則鬆弛問題在\(T^*\)下必有解,將這個解轉化為不超過\(\rho T\)的原問題解,這個過程構成\(\rho\)-近似演算法。下面將應用這個設計思路。
\(R||C_{max}\)問題
本節給出一個\(R||C_{max}\)的\(2\)-近似演算法。我們剛剛用線性規劃解決過的\(R|pmtn|C_{max}\)問題,是這個問題的搶佔式鬆弛版本,實際上,如果我們加一條約束\(x_{ij}\in \{0,1\}\),就是非搶佔式排程的線性規劃模型了。實際上加上這個條件後,原先的第3條約束可以使得第4條約束多餘,因此同樣的建模下,本問題的線性約束為:
\[
\sum_{i-1}^m x_{ij}=1,\ for\ j=1,...,n \\\sum_{j=1}^n p_{ij}x_{ij}\le D,\ for\ i=1,...,m \\x_{ij}\in \{0,1\},\ for\ i=1,...,m,\ j=1,...,n
\]
這是一個整數線性規劃問題,相比於一般的線性規劃問題,整數線性規劃是\(NP\)難的,因此問題並沒有變簡單。但是,我們提出的模型是有用的,可以用來鬆弛某些約束,例如得到一個非整數解,然後舍入到整數。
現在我們再次將整數約束鬆弛為\(x_{ij}\ge 0\),但這就太鬆了一點,我們還要新增一個約束:如果一個任務\(j\)在機器\(i\)上的效率過慢,即\(p_{ij}\ge D\),就不把這個任務分配到機器\(i\):
\[
x_{ij}=0,\ if\ p_{ij}\ge D. \tag{4}
\]
這個約束在原來的整數線性規劃模型中是天然成立的,但我們移除整數約束後就需要手動新增。注意到,當\(D\)固定時,這是個簡單的只有線性約束的規劃問題(沒有成本函式),我們只要找可行解即可。如果對於給定的\(D\),問題沒有解,則輸出\(None\),如果有解,我們就嘗試將非整數解轉化為原問題的可行整數解。
根據一個線性規劃問題的基本結論:我們可以找到一個此問題的可行解,其中最多隻有\(n+m\)個正值。這\(n+m\)個正的\(x_{ij}\)指定了\(n\)個任務的去向,假設這些\(x_{ij}\)中等於1的數量為\(k\),則\(k\)個任務已經被完全指定去向,剩餘\(n-k\)個任務需要至少\(2(n-k)\)個\(x_{ij}\)指定去向(因為非整數意味著至少被分配在兩臺機器上),故\(k+2n-2k\le m+n\),故\(n-k\le m\),意味著至多有\(m\)個任務被分配在不止一臺機器上。
現在,我們將所有\(x_{ij}=1\)的任務\(j\)直接分配到機器\(i\),這部分排程記為\(S_1\),剩餘還有至多\(m\)個任務需要排程。我們簡單地按照\(x_{ij}>0\)的解將任務\(j\)匹配到機器\(i\),且保證每個機器至多一個任務(因為這部分任務不超過\(m\)個),這部分任務的排程記為\(S_2\)。關於\(S_2\)的存在性證明稍微有點複雜,感興趣的請讀[1]。
我們分析一下這樣形成的排程策略的完成時間,它顯然不超過\(S_1\)的完成時間加上\(S_2\)的完成時間。而由於\(x_{ij}\)是鬆弛問題的可行解,因此\(S_1\)的完成時間是\(\le D\)的,在\(S_2\)中,由於每個機器至多一個任務,且由於約束\((4)\),\(x_{ij}>0\)意味著\(p_{ij}\le D\),從而\(S_2\)的完成時間也是不超過\(D\)的,故這樣排程的時間不超過\(2D\)。因此假設原問題的最優解是\(D\),則該鬆弛問題必有解,且該解不超過\(2D\)。
\(1|r_j|\sum C_j\)問題
前面已經提到,帶釋出時間的單機排程問題是\(NP\)難問題,本節將設計一個解決此問題的近似演算法。對於此問題的搶佔式版本,前面已經證明了最短剩餘時間優先演算法\(SRPT\)的最優性。利用這個鬆弛,我們將從其最優解中找出各任務的完成時間順序,然後以相同的順序構建非搶佔式排程策略。此演算法稱為Convert-Preempt-Schedule,反轉搶佔式排程。
我們首先使用\(SRPT\)演算法構建搶佔式排程版本的最優解,然後按照該最優解中各任務的完成時間排序,按照\(C_1^P\le ...\le C_n^P\)給這些任務重新編號。而後按照相同順序非搶佔式的排程這些任務,如果某個時間點後繼任務還未釋出,就讓機器空閒即可。可以證明,這個演算法是\(2\)-近似的。
證明:對於任務\(j\),由於其在搶佔式排程中能在\(C_j^P\)時完成,因此假如沒有其他任務,則它最晚也能在\(C_j^P\)時完成,當存在其他任務後,我們在其完成前插入了排在它前面的任務,因此它的最晚完成時間延長為:
\[
C_j\le C_j^P+\sum_{k\le j}p_k
\]
而由於在搶佔式排程中,所有\(k\le j\)的任務都在\(C_j^P\)之前完成了,因此\(\sum_{k\le j}p_k\le C_j^P\),從而有:
\[
\sum_{j=1}^n C_j \le 2\sum_{j=1}^n C_j^P
\]
假設非搶佔式排程的最優解是\(\sum C_j^P\),則對於搶佔式的鬆弛版本必然有不超過\(\sum C_j^P\)的最優解,而通過上述分析可知此演算法給出的解不超過搶佔式最優解的兩倍,證畢。
\(1|r_j,prec|\sum w_jC_j\)問題
這一節依然使用鬆弛法來解決這個難題(基本上是目前遇到的最難的單機排程問題了),我們採用線性規劃來設計一個2-近似演算法。
首先我們描述這個問題的線性規劃約束,和之前不同,我們不從整數/非整數的角度鬆弛,而是從問題定義中尋找必要條件,形成一個線性規劃問題。
對這個問題來說,任務執行的順序極其重要,因此我們要尋找一種能表示任務順序的形式化描述。很容易想到用時間來表示:定義\(C_j\)為任務\(j\)在排程策略中的完成時間。實際上這就能夠完確定一個排程了(比之前的\(x_{ij}\)更清晰)。顯然,最小化的成本函式是\(\sum w_jC_j\)。並且滿足如下條件:
\[
C_j \ge r_j+p_j,\ j=1,...,n.\\C_k \ge C_j+p_k,\ for\ each\ j<k.\\C_k \ge C_j+p_k \ or\ C_j \ge C_k+p_j,\ for\ each\ j \not= k.
\]
這三個條件很容易理解,首先任務必須在釋出時間後才能開始,其次需要等待任務所有的前驅任務完成才能開始,最後,任意兩個不同的任務存在先後關係(處理時間不重疊)。
不幸的是,最後一個約束有“或”運算,不是一個確定的線性約束,這導致這個問題不是線性規劃問題。我們嘗試用不等式代替它。定義任務集\(J=\{1,...,n\}\),對任意子集\(S\subseteq J\),定義\(p(S)=\sum_{j\in S}p_j\),\(p^2(S)=\sum_{j\in S}p_j^2\)。對任何可行的單機排程策略,可以證明下面的不等式成立:
\[
\sum_{j\in S}p_jC_j\ge \frac{1}{2}(p^2(S)+p(S)^2),\ for\ each\ S\subseteq J.\tag{*}
\]
證明:假設\(S\)中的任務按照完成時間升序編號。由於任意的任務\(j\)的完成時間大於在其前面完成的所有任務的處理時間之和,即\(C_j\ge \sum_{k=1}^j p_k\),代入上式左邊得:
\[
\sum_{j\in S}p_jC_j\ge\sum_{j\in S}p_j\sum_{k=1}^jp_k=\frac{1}{2}(p^2(S)+p(S)^2)
\]
對於沒有釋出時間,沒有任務依賴的問題\(1||\sum w_jC_j\)問題,上面這個不等式的約束是完備的[37,41],可以形成一個可行解。現在把上面這個不等式加上原先的第一個和第二個不等式,組成\(1|r_j,prec|\sum w_jC_j\)的線性約束,這個新的線性規劃問題是原問題的鬆弛問題。
注意到我們新提出來的不等式似乎有\(2^n\)個,但是它仍然可以被線性規劃的橢圓演算法[37,41]在多項式時間內解決。
現在為了簡單起見,我們移除釋出時間約束,只探討\(1|prec|\sum w_jC_j\)問題,其對應的鬆弛問題將移除上面提到的第一個不等式。解上面的線性規劃問題得到的解為\(C_1\le C_2\le...\le C_n\),我們將證明按照這個順序來排程任務是2-近似的。
假設上面的排程形成的新的完成時間為\(\tilde{C_j}\),按照慣例,我們只需證明\(\tilde{C_j}\le 2C_j\)就行。首先,設\(S=\{1,...,j\}\),沒有了釋出時間機器是沒有空閒的,因此\(\tilde{C_j}=p(S)\)。同時根據上面提到的不等式\((*)\),我們有:
\[
\sum_{k=1}^jp_jC_j\ge \frac{1}{2}(p^2(S)+p(S)^2)\ge \frac{1}{2} p(S)^2
\]
又因為\(C_1\le C_2\le...\le C_n\),我們有:
\[
C_jp(S)=C_j\sum_{k=1}^j p_k\ge\sum_{k=1}^j C_kp_k\ge \frac{1}{2} p(S)^2
\]
故\(\tilde{C_j}=p(S)\le 2C_j\),證