给定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个作业,制定最佳的作业调度方案,使其完成时间和最小。
#include<stdio.h>
#include<math.h>
#define n 3
int tt[n+1][2]={{0,0},{2,1},{3,1},{2,3}};
int sumf2=0;
int bestx[n+1];
int best=100;
int x[n+1];
int f1;
int f2[n+1];
void trace(int t){
int i;
if(t==n+1){
if(sumf2<best){
best=sumf2;
for(i=0;i<=n;i++)
bestx[i]=x[i];
}
return;
}
for(i=t;i<=n;i++){//全排列
int temp=x[i];
x[i]=x[t];//座标改变
x[t]=temp;
f1+=tt[x[t]][0];
f2[t]=(f1>f2[t-1]?f1:f2[t-1])+tt[x[t]][1];
sumf2+=f2[t];
if(sumf2<best){
trace(t+1); //回溯到最底层时,结束执行全排列,进入下一条回溯分支
}
sumf2-=f2[t];
f1-=tt[x[t]][0];
temp=x[i];
x[i]=x[t];
x[t]=temp;
}
}
int main(){
for(int i=0;i<=n;i++){
x[i]=i;
}
f1=0;
f2[0]=0;
trace(1);
printf("最优作业调度的最少时间和为:%d\n",best);
printf("最优作业调度的顺序为:");
for(i=1;i<=n;i++)
printf("%d",bestx[i]);
printf("\n");
return 0;
}