多机调度问题

问题描述:

设有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];    
}
}

  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值