import java.util.*;
public class Flowshop{
static int n, //作业数
f1, //机器1完成处理时间
f, //当前完成时间和
bestf; //当前最优值
static int[][] m; //各作业所需要的时间
static int[] x; //当前作业调度
static int[] bestx; //当前最优作业调度,保存结果调度顺序
static int[] f2; //机器2完成处理时间
public static void swap(int[] x,int i,int j){
int temp;
temp=x[j];
x[j]=x[i];
x[i]=temp;
}
private static void backtrack(int i){//i用来指到达的层数
if(i>n) {
for(int j=1;j<=n;j++){//j用来指示选择了哪个任务
bestx[j]=x[j];
System.out.print("当前作业调度为:");
System.out.print(x[j]+" ");
}
System.out.println();
bestf=f;
System.out.println("每条深度优先结果为:"+bestf);
}
else
for(int j=i;j<=n;j++){
f1+=m[x[j]][1];
f2[i]=((f2[i-1]>f1)? f2[i-1]:f1)+m[x[j]][2];
f+=f2[i];
if(f<bestf){
swap(x,i,j);//把选择的任务j调到当前执行的为之i
backtrack(i+1);
swap(x,i,j);
}
f1-=m[x[j]][1];//状态恢复
f-=f2[i];
}
}
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.println("请输入作业数目:");
n=scanner.nextInt();//注意这里的n是已经定义了的,不要再在这里定义,否则传参
//传不进去,输出只是0,0,0
m=new int[n+1][3];
bestx=new int[n+1];
f2=new int[n+1];
x=new int[n+1];
bestf=Integer.MAX_VALUE;
for(int i=1;i<=n;i++)
x[i]=i;
System.out.println("请输入作业在机器1,2上的运行时间:");
for(int i=1;i<=n;i++)
for(int j=1;j<=2;j++)
m[i][j]=scanner.nextInt();
backtrack(1);
System.out.println("当前最优值: "+bestf);
System.out.print("当前最优作业调度为: ");
for(int i=1;i<=n;i++)
System.out.print(bestx[i]+" ");
}
}
这学期就要结束了,将我的程序上传来供大家学习参考吧!加油啦!批处理作业调度java实现
最新推荐文章于 2024-11-14 19:49:43 发布