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