多机调度问题(贪心算法总结)
问题
设有 n 个独立的作业{1,2,3,4,…,n },由 m 台相同的机器{ M1,M2,…,M3 }进行加工处理,作业 i 所需的处理时间为 Ti (1 <= i <=n),每个作业均可咋任何一台机器上加工处理,但不可间断、拆分。多机调度问题要求给出一种作业调度方案,使所有作业在尽可能短的时间内由m台机器加工处理完成。
想法
确认贪心算法的贪心策略,这个的贪心策略是最长处理时间优先。分两种情况 :当m > n 的时候直接将每个作业分配给一台机器。当 m < n 时,根据贪心策略优先将最长处理时间的作业分配给最空闲的机器处理。因为有多台机器,每台机器用处理多个不同的作业,所有需要使用二维数组进行储存。
步骤
1、判断 m 与 n 的关系(当 m < n )
2、将作业按照最长处理时间进行排序
3、首先将 m 个作业依次分配给 m 台机器
4、将剩下的 n-m 个作业依次分配给最空闲的机器(最空闲的机器为要处理作业时间总和最短的机器)
例题
#include <iostream>
#include <algorithm>
using namespace std;
//快速排序
int partition(int Z[],int T[],int i ,int j)
{
while(i < j)
{
while(i < j && T[i] >= T[j]) j--;
if(i < j)
{
swap(T[i],T[j]);
swap(Z[i],Z[j]);
}
while(i < j && T[i] >= T[j]) i++;
if(i < j)
{
swap(T[i],T[j]);
swap(Z[i],Z[j]);
}
}
return i;
}
void quick_sort(int Z[],int T[],int i, int j)
{
if(i < j)
{
int priovt = partition(Z,T,i,j);
quick_sort(Z,T,i,priovt-1);
quick_sort(Z,T,priovt+1,j);
}
}
int main(int argc, char** argv) {
//所有数组下标从1开始
int Z[] = {0,1,2,3,4,5,6,7}; //7个独立作业
int T[] = {0,2,14,4,16,6,5,3}; //每个作业所需的处理时间
int S[4][8] = {0}; //三台机器
int St[4] = {0}; //每个机器的工作时间
int index[4] = {0}; //每个机器最后一个作业的下标
quick_sort(Z,T,1,7);
//首先将每个机器依次放入最长处理时间的作业
for(int i = 1; i <= 3; i++)
{
S[i][1] = Z[i]; //将作业放入机器
St[i] = T[i]; //增加该机器的工作时间
index[i]++;
}
//将剩下的作业按照最长处理时间依次放入最空闲机器
for(int i = 4; i <= 7; i++)
{
int k = 1; //最空闲的机器
//遍历最空闲机器
for(int j = 2; j <= 3; j++)
{
if(St[j] < St[k]) k = j;
}
S[k][index[k]+1] = Z[i];
St[k] += T[i];
index[k]++;
}
//处理完成
cout << "处理完成" << endl;
for(int i = 1; i <= 3; i++)
{
for(int j = 1; j <= 7;j++)
{
cout << S[i][j] << " ";
}
cout << endl;
}
return 0;
}