基本题一:多机调度问题

一、实验目的与要求

1、熟悉多机调度问题的算法;

2、初步掌握贪心算法;

二、实验题

    要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业。

三、实验提示

1、把作业按加工所用的时间从大到小排序

2、如果作业数目比机器的数目少或相等,则直接把作业分配下去

3 如果作业数目比机器的数目多,则每台机器上先分配一个作业,如下的作业分配时,是选那个表头上s最小的链表加入新作业。

typedef struct Job

{

    int ID;//作业号

    int time;//作业所花费的时间

}Job;

 

typedef struct JobNode //作业链表的节点

{

    int ID;

    int time;

    JobNode *next;

}JobNode,*pJobNode;

 

typedef struct Header  //链表的表头

{

    int s;

    pJobNode next;

}Header,pHeader;

 

int SelectMin(Header* M,int m)

{

    int k=0;

    for(int i=1;i<m;i++)

    {

        if(M[i].s<m[k].s)k=i;

    }

return k;

}

 

四、源代码

#include <vector>

#include <iostream>

#include <algorithm>

using namespace std;

#define N 7

#define M 3

typedef struct job

{

       int ID;

       int time;

}     Job;

typedef struct machine

{

       int ID;

       int avail;

}     Machine;

Job a[N]={{1,2},{2,14},{3,4},{4,16},{5,6},{6,5},{7,3}};       //原始作业数据,from:教材

vector<Job>          m_vec_job;                  

vector<Machine>   m_vec_machine;          

bool UDgreater(Job elem1,Job elem2)

{

       return elem1.time>elem2.time;

}

bool UDless(Machine elem1,Machine elem2)

{

       return elem1.avail<elem2.avail;

}

int main()

{

       if(M>N)

              cout<<"给每个任务分配一台机器即可"<<endl;

       for (int i=0;i<N;i++)

       {

              m_vec_job.push_back(a[i]);

       }

       sort(m_vec_job.begin(),m_vec_job.end(),UDgreater); //作业按时间长度排序完毕

//     cout<<m_vec_job[0].ID<<endl;    //作业是按照时间从大到小排列的

 

       for (i=0;i<M;i++)

       {

              Machine tmp={i+1,0};   //机器的编号是从1开始的

              m_vec_machine.push_back(tmp);

       }

 

       for(i=0;i<N;i++)

       {

              vector<Machine>::iterator it;

              it = min_element(m_vec_machine.begin(),m_vec_machine.end(),UDless);

              cout<<"将机器"<<(*it).ID<<""<<(*it).avail<<""<<(*it).avail+ m_vec_job[i].time<<"的时间段分配给作业"<<m_vec_job[i].ID<<endl;

              (*it).avail+=m_vec_job[i].time;

       }

       return 0;

}

结果: