#include "stdio.h"
#include "stdlib.h"
#include "queue"
#define MAX 10
using namespace std;
typedef struct Job
{
int id;
int time; //执行时间
}Job;
typedef struct Machine
{
int id;
int avail; //机器在此时间之后空闲
bool operator < (const Machine &m) const
{
return avail > m.avail;
};
}Machine;
priority_queue<Machine> mpq;
int cmp(const void *j1, const void *j2) //将作业按执行时间降序
{
return (*(Job *)j1).time < (*(Job *)j2).time;
}
//将作业按执行时间降序后,如果作业个数不大于机器个数,每天作业分配一台机器
//如果作业大于机器个数,则挑选出当前最先空闲出来的机器,先分配执行时间较长的作业
void greedy(Job job[], int n, Machine machine[], int m)
{
qsort(job, n, sizeof(Job), cmp); //将作业按执行时间降序
if(n<=m)
printf("为每一个作业分配一台机器\n");
else
{
int i;
for(i=0; i<m; i++)
mpq.push(machine[i]); //
for(i=0; i<n; i++)
{
Machine m = mpq.top();
mpq.pop();
int start = m.avail;
m.avail += job[i].time;
printf("将机器%d从%d到%d的时间分配给作业%d\n", m.id, start, m.avail, job[i].id);
m.id = m.id;
mpq.push(m);
}
}
}
//初始化
void init(Job jobe[], int jobTime[], int n, Machine machine[], int m)
{
int i;
for(i=0; i<n; i++)
{
jobe[i].id = i+1;
jobe[i].time = jobTime[i];
}
for(i=0; i<m; i++)
{
machine[i].id = i+1;
machine[i].avail = 0;
}
}
int main(){
int n = 7;
int jobTime[] = {2, 14, 4, 16, 6, 5, 3};
int m = 3;
int i;
Job jobe[7];
Machine machine[3];
init(jobe, jobTime, n, machine, m);
printf("作业情况:\n");
for(i=0; i<n; i++)
printf("作业%d执行时间为%d\n", jobe[i].id, jobe[i].time);
printf("共有%d台机器\n", m);
greedy(jobe, n, machine, m);
return 0;
}
多机调度问题
最新推荐文章于 2022-09-13 22:11:41 发布