package saunfafenxi;
import java.util.Scanner;
public class shiyan5 {
static int worknum=3; //作业总数
static int[] T1 = new int[worknum];//第i个任务在机器一上面执行的时间
static int[] T2 = new int[worknum];//第i个任务在机器一上面执行的时间
static int[] jieguo = new int[worknum];//保存结果的辅助数组
static int[][] mission2 = new int[worknum][2];//第i个任务在机器一上面执行的时间
int bestFinishtime = Integer.MAX_VALUE;//最短时间
int[] schedule = {0,1,2};//默认的策略顺序。
int[] bestSchedule = new int[worknum];//最佳顺序
int[] f2 = new int[worknum];//第二台机器的每个任务的结束时间
int f1,totaltime;//f1当前任务的结束时间,f2的总时间
public void swap(int[] str,int m,int n){
int temp = str[m];
str[m] = str[n];
str[n] = temp;
}
public void BackTrack(int t){ //当搜索到叶子节点后,将这次遍历的策略赋值到最佳策略。
if(t>worknum-1){
bestFinishtime = totaltime;
for(int i=0;i
bestSchedule[i] = schedule[i];
return;
}
for(int i=t;i
f1+=mission2[schedule[i]][0];
if(t==0)
f2[t]=f1+mission2[schedule[i]][1];
else
f2[t] = ((f2[t-1]>f1)?f2[t-1]:f1)+mission2[schedule[i]][1];
totaltime += f2[t];
//如果该作业处理完之后,总时间已经超过最优时间,就直接回溯。
if(totaltime
swap(schedule,t,i); //把选择出的原来在i位置上的任务序号调到当前执行的位置t
BackTrack(t+1);
swap(schedule,t,i);//进行回溯,还原,执行该层的下一个任务。
}
f1 -= mission2[schedule[i]][0];
totaltime -= f2[t];
}
}
public static void main(String[] args){
Scanner in_t1 = new Scanner(System.in);
System.out.println("请输入各任务在机器1上的执行时间:");//循环输入T1数组
for(int i=0;i
T1[i]=in_t1.nextInt();}
System.out.println("请输入各任务在机器2上的执行时间:");//循环输入T2数组
for(int i=0;i
T2[i]=in_t1.nextInt();}
System.out.println("|\t\t-----各个作业所需时间如下----\t\t|");
System.out.println("|\t作业\t|\t机器1\t|\t机器2\t|");
for(int i=0;i
int s=i+1;
System.out.println("|\t作业"+s+"\t|\t"+T1[i]+"\t|\t"+T2[i]+"\t|");//循环输出T1数组
}
for(int i=0;i
mission2[i][0]=T1[i];
mission2[i][1]=T2[i];
}
shiyan5 bs = new shiyan5();
bs.BackTrack(0);
System.out.println("\n\n使用回溯得出的作业安排顺序如下:");
for(int i=0;i
jieguo[i]=bs.bestSchedule[i]+1;
System.out.print("任务"+jieguo[i]+"\n");}
System.out.println("作业完成的总时间是"+bs.bestFinishtime);
}
}
结果截图: