多機調度問題
阿新 • • 發佈:2018-03-18
我們 post new csharp i++ AR out println true
2018-03-18 20:01:48
問題描述:
有n個獨立的作業需要在m臺相同的機器上進行加工處理,作業i需要的加工時間為ti. 每個作業可以任選一臺機器加工, 但加工結束前不能中斷,作業不允許拆分。
要求給一種作業調度方案,使所給的n個作業在盡可能短的時間內完成。
問題求解:
這個問題是一個NPC問題,到目前為止還沒有有效的解法,對於這一類的問題,使用貪心策略有時候可以設計出較好的近似算法。
我們可以采用最長處理時間優先的貪心選擇策略進行設計,這個策略的有效性可以類比裝瓦罐問題,先把大的放進去,最後再塞小的。
具體實現如下:
1)若 n <= m,則結果非常明顯,最後的結果就是那個最長處理時間。
2)若 n > m,則我們需要對n個作業進行排序,按從大到小的順序分配給最空閑的機器。
public class Greedy { int greedy(int[] jobs, int m) { int n = jobs.length; Arrays.sort(jobs); if (n <= m) return jobs[n - 1]; int[] machines = new int[m]; for (int i = n - 1; i >= 0; i--) { int index = getIdle(machines); machines[index] += jobs[i]; } int res = 0; for (int i = 0; i < machines.length; i++) { if (machines[i] > res) res = machines[i]; } return res; } int getIdle(int[] m) { int index = 0; int min = m[0]; for (int i = 1; i < m.length; i++) { if (m[i] < min) { min = m[i]; index = i; } } return index; } public static void main(String[] args) { Greedy g = new Greedy(); System.out.println(g.greedy(new int[]{2,14,4,16,6,5,3}, 3)); } }
多機調度問題