批处理作业调度问题 核心代码

题目描述:

  • 给定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];
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值