题目如下:
-
设有n个独立的作业{1,2,…,n},由m台相同的机器{1,2, …,m}进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但未完工前不允许中断,任何作业也不能拆分成更小的子作业。多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。
例如,有7个独立的作业{1,2,3,4,5,6,7},由3台机器{1,2,3}加工处理,各作业所需的处理时间如下:
作业编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
作业的处理时间 | 2 | 14 | 4 | 16 | 6 | 5 | 3 |
分析:
首先,按照什么方式处理作业呢?
这里只列举最短作业优先和最长作业优先。
根据上面表格的计算。
按照作业处理时间由少到多进行排序,依次放入机器加工。若以最短作业优先的方式,机器1处理1,6,4三份作业,机器2处理7,5两份作业,机器三处理3,2两份作业,共计23秒(这里就以秒为时间单位吧!不重要)。若依最长作业优先的方式,机器1处理4一份作业,机器2处理2,7两份作业,机器三处理5,6,3,1四份作业,共计17秒。
经分析可得:贪心法求解多机调度问题的贪心策略是最长处理时间作业优先;即把处理时间最长的作业分配给最先空闲的机器,这样可以保证处理时间长的作业优先处理,从而在整体上获得尽可能短的处理时间。
按照最长处理时间作业优先的贪心策略,当m≥n时,只要将机器i的[0,ti)时间区间分配给作业i即可;
当m<n时,首先将n个作业依其所需的处理时间从大到小排序,然后依此顺序将作业分配给空闲的处理机。
接下来,要进行算法的构建以及数据结构的使用了。
1.确定数据结构
由题意可得,每一份作业处理时间需要用数据结构存储,很显然,这里使用数组存储。
那每台机器上要处理多少份作业呢?这里用数组num存储。
那可不可以用一个二维数组存储每台机器的第n份作业是什么呢?
最后,每台机器最终需要多少时间需要用一个数组来表示,来进行最终花费时间的比较,求得最终结果。
这些都是我们需要输出的,可以看出,这个题目需要用大量数组来实现的。
2.用贪心法完成多机调度问题
每一步最优化,取得局部最优化结果。
首先,将作业排序,这里按降序排序,因为是最长作业优先。
然后,通过求得当下的空闲机器放入作业,循环至遍历完所有作业。
最后,通过比较各台机器被占用时间,最大值为花费时间。
最后,就是程序实现了。
一部分功能如下:
比较机器最小占用时间
//比较机器最小占用时间
public static void min(int[] ctime,int m) {
int min=0x3f3f3f3f;
int t=0;
for(int j=0;j<m;j++) {
if(ctime[j]<min)
min=ctime[j];
}
for(int j=0;j<m;j++) {
if(ctime[j]==min)
t=j;
}
}
求出机器最大总时长,求得最终结果。
//求出机器最大总时长,求得最终结果。
public static void max(int[] ctime,int m) {
int max=0;
for(int j=0;j<m;j++) {
if(ctime[j]>max)
max=ctime[j];
}
}