收藏 分享(赏)

分支限界法-批处理调度问题.doc

上传人:精品资料 文档编号:10355912 上传时间:2019-11-03 格式:DOC 页数:14 大小:136.86KB
下载 相关 举报
分支限界法-批处理调度问题.doc_第1页
第1页 / 共14页
分支限界法-批处理调度问题.doc_第2页
第2页 / 共14页
分支限界法-批处理调度问题.doc_第3页
第3页 / 共14页
分支限界法-批处理调度问题.doc_第4页
第4页 / 共14页
分支限界法-批处理调度问题.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、1【分支限界法】批处理作业调度问题问题描述给定 n 个作业的集合J1,J2,Jn。每个作业必须先由机器 1 处理,然后由机器 2 处理。作业 Ji 需要机器 j 的处理时间为 tji。对于一个确定的作业调度,设 Fji 是作业 i 在机器 j 上完成处理的时间。所有作业在机器 2 上完成处理的时间和称为该作业调度的完成时间和。批处理作业调度问题要求对于给定的 n 个作业,制定最佳作业调度方案,使其完成时间和达到最小 。例:设 n=3,考虑以下实例:这 3 个作业的 6 种可能的调度方案是1,2,3;1,3,2;2,1,3;2,3,1;3,1,2;3,2,1;它们所相应的完成时间和分别是 19,

2、18,20,21 ,19,19 。易见,最佳调度方案是 1,3,2,其完成时间和为 18。限界函数2批处理作业调度问题要从 n 个作业的所有排列中找出具有最小完成时间和的作业调度,所以如图,批处理作业调度问题的解空间是一颗排列树 。 在作业调度问相应的排列空间树中,每一个节点 E 都对应于一个已安排的作业集 。以该节点为根的子树中所含叶节点的完成时间和可表示为:设 |M|=r,且 L 是以节点 E 为根的子树中的叶节点,相应的作业调度为pk,k=1,2,n,其中 pk 是第 k 个安排的作业。如果从节点 E到叶节点 L 的路上,每一个作业 pk 在机器 1 上完成处理后都能立即在3机器 2 上

3、开始处理,即从 pr+1 开始,机器 1 没有空闲时间,则对于该叶节点 L 有:注: (n-k+1)t1pk,因为是完成时间和,所以,后续的 (n-k+1)个作业完成时间和都得算上t1pk。如果不能做到上面这一点,则 s1 只会增加,从而有: 。类似地,如果从节点 E 开始到节点 L 的路上,从作业 pr+1 开始,机器 2 没有空闲时间,则:同理可知,s2 是 的下界。由此得到在节点 E 处相应子树中叶节点完成时间和的下界是:注意到如果选择 Pk,使 t1pk 在 k=r+1 时依非减序排列,S1 则取得极小值。同理如果选择 Pk 使 t2pk 依非减序排列,则 S2 取得极小值。 4这可以

4、作为优先队列式分支限界法中的限界函数。 算法 描述算法中用最小堆表示活节点优先队列。最小堆中元素类型是MinHeapNode。每一个 MinHeapNode 类型的节点包含域 x,用来表示节点所相应的作业调度。s 表示该作业已安排的作业时 x1:s。f1 表示当前已安排的作业在机器 1 上的最后完成时间;f2 表示当前已安排作业在机器 2 上的完成时间;sf2 表示当前已安排的作业在机器 2 上的完成时间和;bb 表示当前完成时间和下界。二维数组 M 表示所给的 n 个作业在机器 1 和机器 2 所需的处理时间。在类 Flowshop 中用二维数组 b 存储排好序的作业处理时间。数组 a 表示

5、数组 M 和 b 的对应关系。算法 Sort 实现对各作业在机器 1 和 2 上所需时间排序。函数 Bound用于计算完成时间和下界。函数 BBFlow 中 while 循环完成对排列树内部结点的有序扩展。在while 循环体内算法依次从活结点优先队列中取出具有最小 bb 值(完成时间和下界)的结点作为当前扩展结点,并加以扩展。 算法将当前扩展节点 E 分两种情形处理:1)首先考虑 E.s=n 的情形,当前扩展结点 E 是排列树中的叶结点。E.sf2 是相应于该叶结点的完成时间和。当 E.sf2 2. 3. template 4. class Graph; 5. 6. template 7.

6、class MinHeap 8. 9. template 10. friend class Graph; 11. public: 12. MinHeap(int maxheapsize = 10); 13. MinHeap()delete heap; 14. 15. int Size() constreturn currentsize; 16. T Max()if(currentsize) return heap1; 17. 18. MinHeap 19. MinHeap 20. 21. void Initialize(T x, int size, int ArraySize); 22. vo

7、id Deactivate(); 23. void output(T a,int n); 24. private: 25. int currentsize, maxsize; 26. T *heap; 27. ; 28. 29. template 30. void MinHeap:output(T a,int n) 31. 32. for(int i = 1; i 38. MinHeap:MinHeap(int maxheapsize) 39. 40. maxsize = maxheapsize; 41. heap = new Tmaxsize + 1; 42. currentsize = 0

8、; 43. 44. 45. template 46. MinHeap 51. 52. int i = +currentsize; 53. while(i != 1 81. 82. 83. if(y 97. void MinHeap:Initialize(T x, int size, int ArraySize) 98. 99. delete heap; 100. heap = x; 101. currentsize = size; 102. maxsize = ArraySize; 103. 104. for(int i = currentsize / 2; i = 1; i-) 105. 1

9、06. T y = heapi; 107. int c = 2 * i; 108. while(c heapc + 1) 111. c+; 112. if(y 8122. void MinHeap:Deactivate() 123. 124. heap = 0; 125. 2、6d9.cppcpp view plain copy1. /批作业调度问题 优先队列分支限界法求解 2. #include “stdafx.h“ 3. #include “MinHeap2.h“ 4. #include 5. using namespace std; 6. 7. class Flowshop; 8. cl

10、ass MinHeapNode 9. 10. friend Flowshop; 11. public: 12. operator int() const 13. 14. return bb; 15. 16. private: 17. void Init(int); 18. void NewNode(MinHeapNode,int,int,int,int); 19. int s, /已安排作业数 20. f1, /机器 1 上最后完成时间 21. f2, /机器 2 上最后完成时间 22. sf2, /当前机器 2 上完成时间和 23. bb, /当前完成时间和下界 24. *x; /当前作业调

11、度 25. ; 26. 27. class Flowshop 28. 29. friend int main(void); 30. public: 31. int BBFlow(void); 32. private: 33. int Bound(MinHeapNode E,int 34. void Sort(void); 35. int n, /作业数 36. * M, /各作业所需的处理时间数组 37. *b, /各作业所需的处理时间排序数组 938. *a, /数组 M 和 b 的对应关系数组 39. *bestx, /最优解 40. bestc; /最小完成时间和 41. bool *y

12、; /工作数组 42. ; 43. 44. template 45. inline void Swap(Type 46. 47. int main() 48. 49. int n=3,bf; 50. int M132=2,1,3,1,2,3; 51. 52. int *M = new int*n; 53. int *b = new int*n; 54. int *a = new int*n; 55. bool *y = new bool*n; 56. int *bestx = new intn; 57. 58. for(int i=0;ii; k-) 159. 160. if(bkjE.f2)

13、?f1:E.f2)+ME.xE.s1; 198. int sf2 = E.sf2 + f2; 199. int s1 = 0,s2 = 0,k1 = n-E.s,k2 = n-E.s,f3 = f2; 200. 201. /计算 s1 的值 202. for(int j=0; jf1+bj0)?f2:f1+bj0; 210. 211. s1 += f1+k1*bj0; 212. 213. 13214. 215. /计算 s2 的值 216. for(int j=0; js2)?s1:s2); 228. 229. 230. /解批处理作业调度问题的优先队列式分支限界法 231. int Flowshop:BBFlow(void) 232. 233. Sort();/对各作业在机器 1 和 2 上所需时间排序 234. MinHeap H(1000); 235. 236. MinHeapNode E; 237. /初始化 238. E.Init(n); 239. /搜索排列空间树 240. while(E.s 284. inline void Swap(Type 287. a=b; 288. b=temp; 289. 程序运行结果如图:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报