给定n个作业的集合J={J1,J2,…,Jn}。每一个作业有两项任务分别在两台机器上完成。每个作业必须先由机器1处理,再由机器2处理。作业Ji需要机器j的处理时间为tji,i=1,2,…n,j=1,2。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。则所有作业在机器2上完成处理的时间和f=F21+F22+…+F2n称为该作业调度的完成时间和。 批处理作业调度问题要求,对于给定的n个作业,制定最佳的作业调度方案,使其完成时间和最小。
输入示例:
3
2 1
3 1
2 3
输出示例:
18
1 3 2
#include<stdio.h>
#define n 4 //作业数量
#define m 2 //机器数量
int time[n][m]={0,0,2,1,3,1,2,3}; //每个作业在每个机器上所需的时间
int totalsum2=0;//在机器2上各作业完成的时间和
int minTime=100000;
int a[n]={0,1,2,3}; //作业
int t1;//各作业在机器1上的完成时间
int t2[n]={0};//各作业在机器2上的完成时间
int bestOrder[n]; //最佳顺序
//以作业号进行回溯
void traceback(int t){
int temp;
if(t==n){
if(totalsum2<minTime){ //进行判断,找出最优
minTime=totalsum2;
for(int i=1;i<n;i++){ //将最优顺序赋值给bestOrder
bestOrder[i]=a[i];
}
}
return;
}
else{
for(int i=t;i<n;i++){
t1+=time[a[i]][0];
t2[t]=(time[t-1][1]>t1?time[t-1][1]:t1)+time[t][1];
totalsum2+=t2[t];
if(totalsum2<minTime){
temp=a[i];
a[i]=a[t];
a[t]=temp;
traceback(t+1);
temp=a[i];
a[i]=a[t];
a[t]=temp;
}
t1-=time[a[i]][0];
totalsum2-=t2[t];
}
}
}
int main(){
traceback(1);
printf("%d\n",minTime);
for(int i=1;i<n;i++)
printf("%d\t",bestOrder[i]);
putchar('\n');
return 0;
}