多机调度问题

多机调度问题(贪心算法总结

问题

设有 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值