1. 问题描述
设有n个独立的作业{1, 2, …, n},由m台相同的机器{M1, M2, …, Mm}进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但不可间断、拆分。多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。
2. 三种解决方法分析
作业的个数为n,机器的数目为m。
若n<=m,则将n个作业分配给m个机器中的n个即可。
若n>m,则有以下三种策略:
设7个独立作业{1, 2, 3, 4, 5, 6, 7}由3台机器{M1, M2, M3}加工处理,各作业所需的处理时间分别为{2, 14, 4, 16, 6, 5, 3}。
策略一: 将作业按顺序平均分配给每个机器。
这种策略简单,但如果所需处理时间最长的作业被分配给同一个机器,则效率很低。
策略二:按照作业所需处理时间从短到长依次分配给最先空闲的机器。
这种策略考虑到了时间的安排,但处理时间最长的作业一定是最后完成的,最后可能造成几个机器等待一个机器的情况,该策略运行效率也相对较低。
策略三:按照作业所需处理时间从长到短依次分配给最先空闲的机器。
该策略优先挑选处理时间相对较长的作业分配给机器进行处理,符合贪心算法总是做出局部最优的选择的特点。按贪心算法给出的作业调度如下图所示:
3. 算法描述
贪心算法求解多机调度问题的贪心策略是最长处理时间的作业优先被处理,即把处理时间最长的作业优先分配给最先空闲的机器处理,这样就可以在整体上获得尽可能短的总处理时间。
4. 代码实现
#include<bits/stdc++.h>
using namespace std;
int n,m; //作业个数为n, 机器个数为m
int main() {
cin>>n>>m;
vector<int> time(n);
vector<vector<int> > machine(m);
vector<int> sumTime(m,0);
for(int i=0;i<n;++i){
cin>>time[i];
}
sort(time.begin(),time.end(),greater<int>());
for(int i=0;i<n;++i){
int select=0;
for(int j=0;j<m;++j){
if(sumTime[j]<sumTime[select]){
select=j;
}
}
machine[select].push_back(time[i]);
sumTime[select]+=time[i];
}
int maxTime=sumTime[0];
for(int j=0;j<m;++j){
if(sumTime[j]>maxTime){
maxTime=sumTime[j];
}
}
for(int j=0;j<m;++j){
cout<<"第"<<j<<"台机器所需处理总时间为: "<<sumTime[j]<<endl;
}
cout<<"处理所有作业时间共需: "<<maxTime;
return 0;
}
5. 代码运行截图
本文含有隐藏内容,请 开通VIP 后查看