多机调度问题

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));
    }
}
原文地址:https://www.cnblogs.com/hyserendipity/p/8597302.html