批处理作业调度问题

给定n个作业的集合J={J1,J2,,Jn}。每一个作业有两项任务分别在两台机器上完成。每个作业必须先由机器1处理,再由机器2处理。作业Ji需要机器j的处理时间为tjii=1,2,nj=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;
}

点赞