计算机算法分析与设计(13)---贪心算法(多机调度问题)

文章目录


一、问题概述

1.1 思路分析

 1. 设有 n n n 个独立的作业 1 , 2 , ... , n {1, 2, ..., n} 1,2,...,n,由 m m m 台相同的机器 M 1 , M 2 , ... , M m {M_1, M_2, ..., M_m} M1,M2,...,Mm 进行加工处理,作业 i i i 所需的处理时间为 t i ( 1 ≤ i ≤ n ) t_i(1≤i≤n) ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但不可间断、拆分。多机调度问题要求给出一种作业调度方案,使所给的 n n n 个作业在尽可能短的时间内由 m m m 台机器加工处理完成。

 2. 解决思路:(1)如果 n < m n<m n<m,这种情况很简单,将 n n n 个作业分配给 m m m 个机器中的 n n n 个就可以了。(2)如果 n > m n>m n>m,则用贪心算法求解。

 3. 贪心算法求解多机调度问题的贪心策略是最长处理时间的作业优先,即把处理时间最长的作业分配给最先空闲的机器,这样可以保证处理时间长的作业优先处理,从而在整体上获得尽可能短的处理时间。

1.2 实例分析

 设 7 7 7 个独立作业 1 , 2 , 3 , 4 , 5 , 6 , 7 {1, 2, 3, 4, 5, 6, 7} 1,2,3,4,5,6,7 由 3 3 3 台机器 M 1 , M 2 , M 3 {M1, M2, M3} M1,M2,M3 加工处理,各作业所需的处理时间分别为 2 , 14 , 4 , 16 , 6 , 5 , 3 {2, 14, 4, 16, 6, 5, 3} 2,14,4,16,6,5,3。贪心算法产生的作业调度如下图所示。所需要的加工时间为17。

二、代码编写

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

bool compare(int a,int b)
{
	return a>b;

}
 
int main(){
	int n,m; //作业个数为n, 机器个数为m
	
	cout<<"请输入作业和机器的个数:"<<endl; 
	cin>>n>>m;
	
	vector<int> time(n);
	//vector<vector<int> > machine(m); //理解成m×1二维数组 
	vector<int> sumTime(m,0); //0表示初始化值为0 
	
	cout<<"请输入每个作业的处理时间:"<<endl; 
	for(int i=0;i<n;i++)
	{
		cin>>time[i];
	}
	sort(time.begin(),time.end(),compare); //对time进行排序,从大到小。
	
	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]=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+1<<"台机器所需处理总时间为: "<<sumTime[j]<<endl; 
	}
	
	cout<<"处理所有作业时间共需: "<<maxTime;
	return 0;
}
相关推荐
-To be number.wan4 小时前
算法日记 | STL-MAP
c++·算法
cjp5604 小时前
015. UG 二次开发,拉伸草图生成实体类,高级草图类封装
算法
楼田莉子4 小时前
C++20新特性:Range库
开发语言·c++·后端·学习·c++20
字节高级特工4 小时前
【Linux】深入理解C语言命令行参数与环境变量
linux·c++·人工智能·后端
linux开发之路5 小时前
C++项目推荐:eBPF+调度器性能分析框架
linux·c++·ebpf·火焰图·调度器
愿天垂怜5 小时前
【C++脚手架】ffmpeg 库的介绍与使用
linux·服务器·开发语言·c++·ide·git·ffmpeg
Eric 辰东5 小时前
【C 语言程序的编译和链接】详解编译链接过程
c语言·笔记·算法·学习方法
并不喜欢吃鱼5 小时前
从零开始 C++-----十一【C++ 数据结构】红黑树全解析:从定义到工程实现(一文搞定,十分详细)
开发语言·数据结构·c++
不会C语言的男孩5 小时前
C++ Primer Plus 第7章:函数——C++的编程模块
开发语言·c++
迈巴赫车主5 小时前
蓝桥杯21247弹跳鞋java
java·开发语言·数据结构·算法·职场和发展·蓝桥杯