演算法 批處理作業排程
阿新 • • 發佈:2019-02-09
題目
給定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 2
int a[n+1][2]={0,0,1,2,3,4};
int f1=0;//機器1完成的處理時間
int *f2;//第i階段機器2完成的時間
int bValue=0;//當前完成用的時間
int bestValue=1000;//最優時間
int *bOrder; //作業順序;
int *bestOrder;//最優作業順序
void backtrack(int t){
int i,j;
int temp;
if(t>n){
for(i=0;i<=n;i++)
bestOrder[i]=bOrder[i];
bestValue=bValue;
}else {
for(j=t; j<=n; j++){//j從i開始,控制分支數
f1+=a[bOrder[j]][0];//在第1臺機器上的完成處理時間
f2[t]=(f2[t-1]>f1?f2[t-1]:f1)+a[bOrder[j]][1];//在機器2上的完成處理時間,f2[0]初值為0
bValue+=f2[t];//總的完成時間和
if(bValue<bestValue){
temp=bOrder[t]; bOrder[t]=bOrder[j]; bOrder[j]=temp;
backtrack(t+1 );
temp=bOrder[t]; bOrder[t]=bOrder[j]; bOrder[j]=temp;
}
f1-=a[bOrder[j]][0];
bValue-=f2[t];
}
}
}
int main(){
int i,j,k;
f2=new int[n+1];
bOrder=new int[n+1];
bestOrder=new int[n+1];
for(i=0;i<=n;i++){
f2[i]=0;
bOrder[i]=i;
}
//
backtrack(1);
//輸出
for(i=1;i<=n;i++)
printf("%d\t",bestOrder[i]);
printf("\n%d",bestValue);
return 0;
}