續 調度算法(一)
線性規划
現在我們介紹線性規划算法在調度問題中的應用。一個線性規划問題通常以如下形式出現:
尋找長度為\(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}\)問題的定義。顯然,每部分任務的比例必須是非負的,從而有:
同時,任意有效調度下,每個任務都必須被完成,這意味着:
我們的設計目標是最小化調度的最終完成時間\(D\),顯然任何機器上的總處理時間不超過\(D\),根據之前的定義,不相關並行環境下,任務\(j\)在機器\(i\)上的處理時間記為\(p_{ij}\):
最后,我們還需要保證,所有任務的總處理時間都不超過\(D\):
我們需要在滿足上述約束條件下最小化\(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條約束多余,因此同樣的建模下,本問題的線性約束為:
這是一個整數線性規划問題,相比於一般的線性規划問題,整數線性規划是\(NP\)難的,因此問題並沒有變簡單。但是,我們提出的模型是有用的,可以用來松弛某些約束,例如得到一個非整數解,然后舍入到整數。
現在我們再次將整數約束松弛為\(x_{ij}\ge 0\),但這就太松了一點,我們還要添加一個約束:如果一個任務\(j\)在機器\(i\)上的效率過慢,即\(p_{ij}\ge D\),就不把這個任務分配到機器\(i\):
這個約束在原來的整數線性規划模型中是天然成立的,但我們移除整數約束后就需要手動添加。注意到,當\(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\)時完成,當存在其他任務后,我們在其完成前插入了排在它前面的任務,因此它的最晚完成時間延長為:
而由於在搶占式調度中,所有\(k\le j\)的任務都在\(C_j^P\)之前完成了,因此\(\sum_{k\le j}p_k\le 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\)。並且滿足如下條件:
這三個條件很容易理解,首先任務必須在發布時間后才能開始,其次需要等待任務所有的前驅任務完成才能開始,最后,任意兩個不同的任務存在先后關系(處理時間不重疊)。
不幸的是,最后一個約束有“或”運算,不是一個確定的線性約束,這導致這個問題不是線性規划問題。我們嘗試用不等式代替它。定義任務集\(J=\{1,...,n\}\),對任意子集\(S\subseteq J\),定義\(p(S)=\sum_{j\in S}p_j\),\(p^2(S)=\sum_{j\in S}p_j^2\)。對任何可行的單機調度策略,可以證明下面的不等式成立:
證明:假設\(S\)中的任務按照完成時間升序編號。由於任意的任務\(j\)的完成時間大於在其前面完成的所有任務的處理時間之和,即\(C_j\ge \sum_{k=1}^j p_k\),代入上式左邊得:
對於沒有發布時間,沒有任務依賴的問題\(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)\)。同時根據上面提到的不等式\((*)\),我們有:
又因為\(C_1\le C_2\le...\le C_n\),我們有:
故\(\tilde{C_j}=p(S)\le 2C_j\),證畢。