贪心算法求解多机调度问题

  有这么个问题:有n个独立的作业,由m台相同的机器进行加工处理。作业i所需的处理时间为works[i]。 任何作业可以在任何一台机器上面加工处理,但未完工之前不允许中断处理。任何作业不能拆分成更小的作业。 要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。

  这个问题是NP问题,可以使用贪心算法求解出其近似解。

  贪心的规则:将作业按照执行时间从大到小排序,每当机器空闲时选取剩余作业中执行时间最长的作业。每次选取时间最长的作业,而且是已经空闲的机器,如果安排给忙碌的机器只会让总的完成时间更长,这样可以避免由时间长的作业造成较大的尾延迟。

  以下案例中存在 7 个作业,由三台机器并发完成。一种合理的调度方式如下图所示。

 

 

   代码的编写很简单,定义一个机器作业完成时间数组,按照作业顺序调度作业每次选择机器完成时间最小的那个机器(最先空闲)

#include <stdio.h>
#include <malloc.h>

/*
    n: 作业数量
    m:机器数量 
*/
int n = 7,m = 3;
int works[7] = {16,14,6,5,4,3,2},machines[3] = {0};

int distribute();

int main(void)
{
    printf("%d\n",distribute());
    return 0;
} 

int distribute()
{
    int minP = -1,minT = 0x8ffffff;
    int maxT = -1;
    int i=0,j=0;
    
    for(i = 0;i < n; i++)
    {
        minP = 0;
        minT = machines[0];
        for(j = 1;j < m; j++)
        {
            if(minT > machines[j])
            {
                minP = j;
                minT = machines[j];
            }
        } 
        machines[minP] += works[i]; 
        if(maxT < machines[minP])
        {
            maxT = machines[minP];
        }
    }
    return maxT;
}

 

版权声明:本文为tpffy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/tpffy/p/13788142.html