假设有n个作业,m台机器设备,每个作业i可选择一台设备加工,加工时间为Ti,每次一台设备只可以加工一个作业,基于贪心策略,实现作业调度,使n个作业等待时间的和最小。
#include<stdio.h>
//定义最大作业数量
#define MAXLENGTH 10
//定义机器的空闲时间
int d[MAXLENGTH];
//定义每台机器的处理时间
int S[MAXLENGTH][MAXLENGTH];
//定义一个结构体,记录作业处理时间
struct work{
//作业时间
int hour;
//原顺序
int number;
};
work t[MAXLENGTH];
//数组的排序算法
void bubble_sort(work a[], int n){
int i, j;
work temp;
for (j = 0; j < n - 1; j++){
for ( i = 0; i < n-1-j; i++)
{
if (a[i].hour<a[i+1].hour)
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
}
//多机调度算法声明
void MultiMachine(work t[], int n, int d[], int m);
int main(){
//作业个数
int n;
//机器个数
int m;
//用于计数
int i;
printf("请输入待处理的作业个数:");
scanf("%d", &n);
printf("请输入作业需要处理的时间:");
for ( i = 0; i <n; i++)
{
scanf("%d", &t[i].hour);
t[i].number = i + 1;
}
//将结构体数组进行从大到小的排序,序号存在number中
bubble_sort(t, n);
printf("请输入机器的个数:");
scanf("%d", &m);
//将数组d初始化为0
for ( i = 0; i < m; i++)
{
d[i] = 0;
}
MultiMachine(t, n, d, m);
getchar();
getchar();
getchar();
}
void MultiMachine(work t[], int n, int d[], int m){
//队尾下标
int rear[MAXLENGTH];
int i, j, k;
//安排前m个作业
for ( i = 0; i < m; i++)
{
S[i][0] = t[i].number;
rear[i] = 0;
d[i] = t[i].hour;
}
//一次安排余下几个作业
for ( i = m; i < n; i++)
{
//查找最先空闲的机器
for (j = 0, k = 1; k < m; k++){
if (d[k]<d[j])
{
j = k;
}
}
rear[j]++;
S[j][rear[j]] = t[i].number;
d[j] += t[i].hour;
}
//输出结果
for ( i = 0; i < m; i++)
{
printf("机器%d处理:", i + 1);
for ( j = 0; S[i][j]>0; j++)
{
printf("作业%d\t", S[i][j]);
}
printf("处理时间:%d\n",d[i]);
printf("\n");
}
}