网站大量收购独家精品文档,联系QQ:2885784924

第6章+分支限界法-2018年.ppt

  1. 1、本文档共171页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2、当sn-2时,算法依次产生当前扩展结点的所有儿子结点。由于当前扩展结点所相应的路径是x[0:s],其可行儿子结点是从剩余顶点x[s+1:n-1]中选取的顶点x[i],且(x[s],x[i])是所给有向图G中的一条边。对于当前扩展结点的每一个可行儿子结点,计算出其前缀(x[0:s],x[i])的费用cc和相应的下界lcost。当lcostbestc时,将这个可行儿子结点插入到活结点优先队列中。 * 与作业分配问题相似的问题 * 各列最小值 * 35 * //是否到达目标位置finish? if((nbr.row==finish.row)(nbr.col==finish.col)) break;//完成 //活结点队列是否非空? if(Q.empty()) return false;//无解 here = Q.front(); //couthere.col here.rowendl; Q.pop();//取下一个扩展结点 * 完全子图:任意两点都相连的顶点的集合 最大完全数:最大完全子图中顶点的个数 * * * 6.12 批处理作业问题 1 问题的描述 给定n个作业集 {J1,J2,…,Jn}。每个作业先由机器1处理,再由机器2处理。Ji需机器j的处理时间为tji。 对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间(时间点)。所有作业在机器2上完成处理的时间和f=F21+F22+…+F2n称为该作业调度的完成时间和。 问题:对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。 对于批处理作业调度问题,可以证明, 存在一个最佳作业调度使得在机器1和2上以相同次序完成。 例如:有3个作业,所需时间如下表 tji 机器1 机器2 作业1 2 1 作业2 3 1 作业3 2 3 这3个作业的6种可能的调度方案是: 1,2,3;1,3,2;2,1,3;2,3,1;3,1,2;3,2,1; 它们所相应的完成时间和分别是 19(=3+6+10),18,20,21,19,19 易见,最佳调度方案是1, 3, 2,其完成时间和为18。 2.限界函数 在结点E处相应子树中叶结点完成时间和的下界是: 注意到如果选择Pk,使t1pk在k=r+1时依非减序排列,S1则取得极小值。同理如果选择Pk使t2pk依非减序排列,则S2取得极小值。 这可以作为优先队列式分支限界法中的限界函数。 private static class HeapNode implements Comparable { int s, //已安排的作业数 sf2, //机器2上的完成时间和 bb; //当前完成时间和下界 int []f; //f[i]表示机器i上最后完成时间 int []x; //当前作业调度 private HeapNode(int n) { x=new int [n]; for(int i=0;in;i++) x[i]=i; s=0; f=new int[3]; f[1]=0;f[2]=0; sf2=0;bb=0; } private HeapNode(HeapNode e,int []ef,int ebb,int n) { x=new int [n]; for(int i=0;in;i++) x[i]=e.x[i]; f=ef; sf2=e.sf2+f[2]; bb=ebb; s=e.s+1; } public int compareTo(Object x) { int xbb=((HeapNode)x).bb; if(bbxbb)return -1; if(bb==xbb)return 0; return 1; } } static int n, //作业数 bestc; //最小完成时间和 static int [][]m; //各作业所需的处理时间数组 //m[i][j]表示作业i在机器j上处理的时间 static int [][]b; //各作业所需的处理时间排序数组 static int [][]a; //数组b和m的对应关系数组 static int [][]bestx; //最优解 static boolean [][]y;//工作数组 private static void sort(){ //数组c用来记录排序以后的作业编号 int []c=new int[n]; for(int j=0;j2;j++){ for(int i=0;in;i++){ b[i][j]=m[i][j]; c[i]=i; } for(int i=0;in-1;i++) for(int k=n-1;ki;k--) if

文档评论(0)

jyr0221 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档