批處理作業調度問題的java實現(回溯法)
具體問題描述以及C/C++實現參見網址
http://blog.csdn.net/liufeng_king/article/details/8764319
/**
* 批處理作業調度問題--回溯法(排列樹)
* @author Administrator
*
*/
public class FlowShop {
int n;//作業數
int f1;//機器1完成處理時間
int f;//完成時間和
int bestf;//當前最優值
int[][] m;//各作業所需的處理時間
int []x;//當前作業調度
int[] bestx;//當前最優作業調度
int[] f2;//機器2完成處理時間
public FlowShop(int n,int[][] m){
this.n=n;
this.m=m;
f1=0;
f=0;
bestf=10000;//給定初始值
bestx=new int[n+1];
x=new int[n+1];
//初始化,x[i]爲原始排序
for(int i=1;i<=n;i++){
x[i]=i;
}
f2=new int[n+1];
}
public void swap(int[] x,int i,int j){
int temp=x[i];
x[i]=x[j];
x[j]=temp;
}
public void backtrack(int i){
if(i>n){
for(int j=1;j<=n;j++)
bestx[j]=x[j];
bestf=f;
}
else{
for(int j=i;j<=n;j++){
f1+=m[x[j]][1];//作業x[j]在第一臺機器的時間
f2[i]=((f2[i-1]>f1)?f2[i-1]:f1)+m[x[j]][2];//f2[i]等於f2[i-1]和f1中較大者加上作業x[j]在第2臺機器的時間
f+=f2[i];
if(f<bestf){
swap(x,i,j);
backtrack(i+1);
swap(x,i,j);
}
f1-=m[x[j]][1];
f-=f2[i];
}
}
}
public static void main(String[] args) {
int n=3;
int[][] m={{0,0,0},{0,2,1},{0,3,1},{0,2,3}};//m的下標從1開始,因此第一行的0和每一行第一列的0無用
FlowShop f=new FlowShop(n,m);
f.backtrack(1);
System.out.println("最優批處理作業調度順序爲:");
for(int i=1;i<=n;i++)
System.out.print(f.bestx[i]+" ");
System.out.println();
System.out.println("最優調度所需的最短時間爲:"+f.bestf);
}
}
/*
運行結果:
最優批處理作業調度順序爲:
1 3 2
最優調度所需的最短時間爲:18
*/