• 计算机算法分析与设计(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(1in),每个作业均可在任何一台机器上加工处理,但不可间断、拆分。多机调度问题要求给出一种作业调度方案,使所给的 n n n 个作业在尽可能短的时间内由 m m m 台机器加工处理完成。

     2. 解决思路:(1)如果 n < m nn<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。

    在这里插入图片描述

    二、代码编写

    #include
    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 > 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    在这里插入图片描述

  • 相关阅读:
    到达终点数字
    【NeurIPS】解决离线强化学习中的互模拟缺陷,FaceChain团队联合出品
    Vue组件中引入jQuery
    http协议与tomcat
    配置zabbix监控nginx状态,监控华为路由器
    Nessus安全测试工具使用教程
    电力电子转战数字IC20220728day58——uvm入门实验5
    Django(四、路由层)
    人事部门OKR案例:为同事创造最佳办公环境
    有人会吗,做一下可以吗
  • 原文地址:https://blog.csdn.net/m0_62881487/article/details/133917335