1. 程式人生 > >多機調度問題

多機調度問題

我們 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));
    }
}

多機調度問題