1. 程式人生 > >演算法 批處理作業排程

演算法 批處理作業排程

題目

給定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; }