贪心算法解决多机调度问题——C++实现

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. 代码运行截图

在这里插入图片描述

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枯木何日可逢春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值