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