问题描述
设有n个独立的作业{1,2,…,n},由m台相同的机器{1,2, …,m}进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但未完工前不允许中断,任何作业也不能拆分成更小的子作业。
多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。
问题求解
贪心法求解多机调度问题的贪心策略是最长处理时间作业优先,即把处理时间最长的作业分配给最先空闲的机器,这样可以保证处理时间长的作业优先处理,从而在整体上获得尽可能短的处理时间。
按照最长处理时间作业优先的贪心策略,当m≥n时,只要将机器i的[0,ti)时间区间分配给作业i即可;
当m<n时,首先将n个作业依其所需的处理时间从大到小排序,然后依此顺序将作业分配给空闲的处理机。
代码
int n = 7;
int m = 3;
struct NodeType
{
int no;
int t;
int mno;//机器序号
bool operator<(const NodeType &s)const//按照处理时间递减排序
{
return t > s.t;
}
};
struct NodeType A[] = { {1,2},{2,14},{3,4},{4,16},{5,6},{6,5},{7,3} };
void solve()
{
NodeType e;
if (n <= m)
return;
sort(A, A + n);
priority_queue<NodeType> qu;
for (int i = 0; i < m; i++)//给每个机器分配一个作业
{
A[i].mno = i + 1;
qu.push(A[i]);
}
for (int j = m; j < n; j++)//分配余下的作业
{
e = qu.top();
qu.pop();
e.t += A[j].t;
qu.push(e);
}
}
算法分析
排序的时间复杂度为O(nlog2n),两次for循环的时间合起来为O(n),所以本算法的时间复杂度为O(nlog2n)。