作业调度问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C[i]的变化 C[0]=0 4 C[1]=1 0 C[2]=2 2 C[3]=3 1 C[4]=4 3
机 器 1 排 序 后
3、对b[i][0]和b[i][1]按非减 序排序 b[0][0]=1 ; b[0][1]=1; b[1][0]=2 ; b[1][1]=2; b[2][0]=3 ; b[2][1]=3; b[3][0]=4 ; b[3][1]=5; b[4][0]=6 ; b[4][1]=7;
分支限界法解批处理作业调度
分支限界法以广度优先或以最小耗费优先的方式搜索解空 间树。搜索的策略是在扩展结点处,首先让扩展结点出队, 一次性生成的所有儿子结点(分支),通过计算一个函数 值(限界), 淘汰导致不可行解或非最优解的儿子结点, 并将符合要求的儿子结点 放入一个FIFO队列或插入带有 优先级的队列(堆)中,然后再从当前的活结点中选择下 一个结点成为当前扩展结点。这个过程一直持续到找到所 需的解或活结点表为空时为止。 分支限界法解批处理作业调度问题,要从n个作业的所 有排列中找到具有最小完成时间的作业调度,它的解空 间树是一棵排列树。采用最小堆来表示活结点优先队列。
public static void Assert_notFalse(boolean p,String q) {if(!p)System.out.println((String)q);}
public static int key( HeapNode [] q,int p) { return q[p].bb;} //return position for left child of pos public static int leftchild(int pos) { Assert_notFalse(pos<n/2,"position has no left child"); return 2*pos+1; } //return position for right child of pos public static int rightchild(int pos) {Assert_notFalse(pos<(n-1)/2,"position has no right child"); return 2*pos+2; } public static int parent(int pos)//return position for parent {Assert_notFalse(pos>0,"position has no parent"); return (pos-1)/2; }
public static void buildheap() //Heapify contents of Heap { for(int i=n/2-1;i>=0;i--)siftdown(i);}
非M子集
F1pr
Pr+1
立即衔接工作方式
这种情况是以机器 1的加工时间作为 参照的
pr
M 子集
图a
对于这种情况,对应从e结点到该叶结点的所有作业在机器2上完成处理时 间为(公式中 n-k+1 反映非 M子集元素,根据进入顺序其机器1加工时间 倍数逐次递减)
F
iM
2i
k r 1
F
n
1 pr
机 器 2 排 序 后
C[i]的变化 C[0]=0 3 C[1]=1 1 C[2]=2 2 C[3]=3 0 C[4]=4 4
由a[i][0]得到机器1加工时间 原排位与排序后位置的对应 关系
由a[i][1]得到机器2加工时 间原排位与排序后位置的 对应关系 a[c[0]][1]=a[3][1]=0; a[c[1]][1]=a[1][1]=1; a[c[2]][1]=a[2][1]=2; a[c[3]][1]=a[0][1]=3; a[c[4]][1]=a[4][1]=4;
iM
上述两种情况均考虑的极端情况,如果不能满足只能增大 加工完成时间,因此有
iM
F
2i
S1
iM
F
2i
S2
取两者的最大值加上M作业集在机器2上的加工完成时间和, 可以作为所有作业在机器2 上完成处理的时间和的下界 , 用它来作为分支限界法中的限界函数,实现对不满足条件 的剪枝,从而减少计算量 。
n k 1t1 pk t2 pk S1
第二种情况是从结点e开始到叶结点的路上,从作业pr+1开始,机器2没有空 闲时间,如图b
非M子集
这种情况是以机器2的加 工完成时间作为参照的 其中
max( F2 pr , F1 pr min t1i )
iM
机器2无空闲方式
1. 问题的描述
给定n个作业的集合J={J1,J2,…,Jn}。每一个作业Ji都有2 项任务要分别在2台机器上完成。每一个作业必须先由 机器1处理,然后再由机器2处理。作业Ji需要机器j的处 理时间为tji,i=1,2,…,n;j=1,2。对于一个确定的作业调 度,设Fji是作业i在机器j上完成处理的时间。则所有作 n 业在机器2上完成处理的时间和 f F2 i
分支限界法应用实例
M1 J0 J1 J2 J3 J4 2 4 3 6 1 M2 5 3 3 1 7 1、输入 m[0][0]=2 m[1][0]=4 m[2][0]=3 m[3][0]=6 m[4][0]=1 ; ; ; ; ; m[0][1]=5; m[1][1]=2; m[2][1]=3; m[3][1]=1; m[4][1]=7; 2、将m[][]拷贝到 b[][],并设立指针c[i]
3. 算法描述
算法bbFlow是解批作业调度问题的优先队列式分支限界法的主体。算法开 始时,将排列树的根结点置为当前扩展节点。在初始扩展结点处还没有选 定的作业,故s=0,数组x初始化为单位排列。 算法的while循环完成对排列树内部结点的有序扩展。在while循环体内算法依 次从活结点优先队列中取出具有最小bb值(完成时间和下界)的结点作为当前 扩展结点,并加以扩展。算法当前扩展结点enode分为两种情形处理。 首先考虑enode.s=n的情形,此时已排定n个作业,当前扩展结点enode是排列 树中的叶结点。enode.x表示相应于叶结点的作业调度。 enode.sf2是相应于 该叶结点的完成时间和。当enode.sf2 < bestc时更新当前最优值bestc和相应 的当前最优解bestx。 当enode.s<n时,算法依次产生当前扩展结点enode的所有儿子结点。对于当 前扩展结点的每一个儿子结点node,计算出其相应的完成时间和的下界bb。 当bb < bestc时,将该儿子结点插入到活结点优先队列中。而当bb bestc时, 以node 为根的子树中不可能有比当前最优解bestx 更好的解,故可将结点 node舍去。
i 1
称为该作业调度的完成时间和。批处理作业调度问题 要求对于给定百度文库n个作业,制定最佳作业调度方案,使 其完成时间和达到最小。
省略的证明:存在最佳作业调度使得在机器1和机器2上作 业以相同次序完成。
在考虑作业调度问题时,解的排列空间树中每一个结 点e都对应一个已安排的作业集M,根结点到e结点部分属 于M作业集,由e结点为根到叶结点的部分不属于M 作业 集。这样一来,以该e结点为根的子树中所含叶结点的完 成时间和,表示为属于M子集和不属于M子集两部分在机 器2处理时间的和。 f F2i F2i
a[c[0]][0]=a[4][0]=0; a[c[1]][0]=a[0][0]=1; a[c[2]][0]=a[2][0]=2; a[c[3]][0]=a[1][0]=3; a[c[4]][0]=a[3][0]=4;
4、创建堆结点enode和最小堆初始化
为当前调度开辟n个空间,初始调度为顺序号。已安排的作业数为0, 机器1和机器2上的完成时间均为0,当前机器2上的完成时间和sf2也为0, 当前完成时间和下界bb为0。 5、搜索排列空间树 ①若为0个作业,直接进入叶结点,最佳调度时间为0,调度顺序保持原 顺序不变
2. 限界函数
在结点E处相应子树中叶结点完成时间和的下界是:
f F2i max{ S1 , S 2 }
iM
注意到如果选择Pk,使t1pk在k>=r+1时依非减序排列, S1则取得极小值。同理如果选择Pk使t2pk依非减序排列, 则S2取得极小值。
f
iM
F
2i
ˆ ,S ˆ } max{ S 1 2
对各作业在机器1(j=0)、j机器2 (j=1)上所需时间升序排序
位置
BBFlow BBFlow BBFlow BBFlow BBFlow BBFlow BBFlow BBFlow bbFlow bbFlow sort
计算完成时间和下界 计算最优调度的时间和 各作业加工需求时间 各作业处理时间升序排序 数组m 和b 的对应关系 最优解 用于区别作业是否已处理 堆结点的实例
②一般不应为0个作业,至少作业数大于等于1,因此进入else 语句,计算 enode结点完成时间下限,调用方法bound.
//本程序取自王晓东编著“算法分析与设计”第 232 页,例 //批作业调度问题的分支限界解法 class MinHeap { //Min-heap impmentation static HeapNode[] Heap; //Pointer to the heap array static int size; //Maximum size of the heap static int n; //Number of elements now in heap public MinHeap(HeapNode[] h,int num,int max)//constructor { Heap=h;n=num;size=max;buildheap();} public int heapsize()//return current size of the heap { return n;} public static boolean isLeaf(int pos)//true if pos is a leaf position { if(n==1)return true; return(pos>=n/2)&&(pos<n);} //return position for left child of pos
iM iM
设M子集中有r个元素,第r作业在F1上的加工完成时间为 F1pr,在F2上的加工完成时间为F2pr。
这是3个作业的调度排列树
1
∈M
A 2 C
3 D 3 1 I 2 N O 1 P H 1 2 J
2 E
∈M
B 3 F 2 3 L M 1 G
3 K
考虑两种特殊的情况,作为限界的选择。 一种是如果从e结点开始到叶结点的路上,每一个作业pk在机器1上完成处理 后都能立即在机器2上开始处理,即从pr+1开始机器1没有空闲时间。如图a
这可以作为优先队列式分支限界法中的限界函数。
主要标识符及其作用
类型 类 类 方法 方法 方法 数组 数组 数组 数组 数组 变量 方法 方法 标识符 HeapNode BBFlow sort bound bbFlow m[ ][ ] b[ ][ ] a[ ][ ] bestx[ ] y[ ][ ] enode swap(x,s,i) swap(b,k,j,k -1,j) 作用 堆结点 分支限界法解作业批处理
表示增加非M 子集作业时计算的 起点位置,如果前M作业的机器 2 完成时间,即最后的黑线比新 加作业的红线长,取黑线,否则 取红线,此图属后一种情况
M 子集
图b
F
iM
2i
k r 1
max(F
n
2 pr
, F1 pr min(t1i )) (n k 1)t2 pk S2
实现x[i] 元素与x[s]位置交换 实现二维数组的元素交换,体现 方法的多态性
算法中用一个最小堆来表示活结点优先队列。最小堆中元 素类型是HeapNode。每一个HeapNode类型的结点包含 域x,用来表示结点所对应的作业调度。
S
表示该结点已安排的作业是x[1:s]。
f1 表示当前已安排的作业在机器1上的最后完成时间; f2 表示当前已安排的作业在机器2 上的最后完成时间; sf2 表示当前已安排的作业在机器2上的完成时间; bb 表示当前完成时间和的下界。