题目描述:
- 给定n个作业的集合J=(J1,J2,…,Jn)。每一个作业Ji都有两项任务分别是在2台机器上完成。每个作业必须先由机器1处理,然后再由机器2处理。作业Ji需要的处理事件时Tji,i=1,2,…n;j=1,2。
- 例:
考虑如下情况:
作业 机器1 机器2
作业1 2 1
作业2 3 1
作业3 2 3
解:
- 作业1:
f1 = f1 + t11 = 0 + 2 = 2
f2[1] = max(f2[0],f1) + t12 = 3 - 作业2:
f1 = f1 + t21 = 2 + 3 = 5
f2[2] = max(f2[1],f2) + t22 = 6 - 作业3:
f1 = f1 + t31 = 5 + 2 = 7
f2[2] = max(f2[2],f3) + t32 = 10
批处理作业调度问题要从N个作业的排列中找出最小完成时间的排列,所以解空间是一棵排列树。
// 主代码如下:
public class PCLZY {
public static int n = 3;// 作业数
public static int x[] = {1,2,3};// 代表安排顺序的数组
public static int bestx[] = new int[3];
public static int bestf = 9999;//当前最优值
public static int f;// 完成时间和
public static int f1 = 0;// 机器1的处理时间
public static int f2[];//机器2的处理时间
public static int M[][];// 各作业处理所需要的时间
public static void backtrack(int i){// 这里的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 = f1 + M[x[j]][1];
f2[i] = ((f2[i-1] > f1)?f2[i-1]:f1) + M[x[j]][2];
f = f + f2[i];
if (f < bestf) { // 剪枝函数
swap(x[i], x[j]);
backtrack(i + 1);
swap(x[i], x[j]);
}
f1 = f1 - M[x[j]][1];
f = f - f2[i];
}
}
}
}