问题描述:
设有n个独立的作业{1, 2, …, n}, 由m台相同的机器进行加工处理. 作业i所需时间为t i. 约定:任何作业可以在任何一台机器上加工处理, 但未完工前不允许中断处理,任何作业不能拆分成更小的子作业。要求给出一种作业调度方案,使所给的n 个作业在尽可能短的时间内由m台机器加工处理完成。
问题分析:
当作业n的数量小于机器的数量m的时,只需要作业一一分配到每一台机器中,只要把机器i的[0,ti]时间区间分配给作业i即可,所需要的时间便是max[ti]。
当作业n的数量大于机器的数量m的时,应使所有机器尽可能忙碌,首先将n个作业依其所需的处理时间从大到小排序。然后以此顺序将作业分配给空闲的处理机。
假定有7个独立作业,所需处理时间分别为{2,14,4,16,6,5,3},由三台机器M1,M2,M3加工。按照贪心算法产生的作业调度如下图所示,所需总加工时间为17.
伪代码Greedy(int a[],int n,int m):
输入:总作业数n,每个作业所需要的时间a[],m台机器输出:n个作业在m台机器近似最短处理时间
S1: sort(a,n)
S2: if(n<=m) then return a[0] //每一个作业分配一台机器即可
S3: else
S4: for i=0 to n
S5: min ← findmin(machine,m) //在m台机器里面查找空闲的机器或者耗时最短的机器
S6: machine[min] ← machine[min]+a[i]
S7: return max {machine [0,m] }
算法实现:
int Greedy(int a[],int n,int m){
int b[n],id[n];
for(int i=0;i<n;i++)
b[i]=a[i];
sort(a,n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
if(a[i]==b[j]){
id[i]=j+1;
break;
}
}
int machine[m]; //机器数
for(int i=0;i<m;i++){ //起初所有机器都没有工作
machine[i]=0;
}
if(n<=m){
cout<<"为每一个作业分配一台机器"<<endl;
return a[0];
}
else{
for(int i=0;i<n;i++){
int min = findmin(machine,m);
machine[min] = machine[min]+a[i];
cout<<"将第"<<id[i]<<"个作业分配到机器M"<<min+1<<endl;
}
sort(machine,m);
return machine[0];
}
}