算法设计与分析 第六章ppt.ppt

  1. 1、本文档共66页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法设计与分析 第六章ppt

5. 优先队列式分支限界法 * 算法设计与分析 分支限界法 优先队列表示:最大优先队列 优先级:从根结点到当前结点x的路径所对应的载重量加上剩余集装箱的重量之和记为x.uweight 特性: 结点x为根的子树中所有结点的载重量不超过x.uweight 叶结点的载重量即为叶结点的优先级 所以只要有一个叶结点成为当前扩展结点,则该结点所对应的解必为最优解。此时可终止算法。 * * 6.4 布线问题 1、问题描述 算法设计与分析 分支限界法 印刷电路板将布线区域划分为n×m个方格阵列。布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案。 要求: 布线时电路只能沿直线或直角布线。 已布线方格做上封闭标记,其他线路布线不允许穿过封闭区域。 * 算法思想——队列式分支限界法 初始情况从起始位置a开始,作为第一个扩展结点。 与该扩展结点相邻并可达的方格,作为可行结点加入到活结点队列中,且将这些方格标记为1,即从起始方格a到这些方格的距离为1。 算法从活结点队列中,取出队首结点作为下一个扩展结点,将与当前扩展结点相邻且未标记过的方格标记为2,并存入活结点队列。 重复步骤②③,直到算法搜索到目标方格b,或活结点队列为空时为止。 * 算法设计与分析 分支限界法 * 数据表示 方格位置类:Position 成员row和col:表示行和列 定义offset[4],表示移动方向 移动i 方向 offset[i].row offset[i].col 0 右 0 1 1 下 1 0 2 左 0 -1 3 上 -1 0 算法设计与分析 分支限界法 * * * 算法设计与分析 分支限界法 方格阵列数组:grid[][]记录距离 0表示允许布线,1表示封锁。 边界通过四周的封锁方格表示,增设方阵的围墙如下: for(int i=0;i=size+1;i++){ //上下围墙 grid[0][i]=grid[size+1][i]=1; //左右围墙 grid[i][0]=grid[i][size+1]=1; } 注意:起始位置的距离标记为2 private static int [][]grid; //方格阵列 private static int size; //方格阵列大小 private static ArrayQueue q; //扩展结点队列 private static Position start, //起点 finish; //终点 private static Position []path; //最短路经 private static int pathLen; //最短线路长度 算法设计与分析 分支限界法 * 其他成员变量的定义: * 算法设计与分析 分支限界法 算法实现 将当前扩展结点按照相邻方格顺序遍历,标记可达相邻方格 如果该方格未被标记,更改标记距离; 判断该方格是否为目标位置,是则退出循环 将方格插入队列 判断是否到达目标位置,布线完成 判断队列是否为空,如果为空表示无解,算法终止。 依次循环取出下一扩展结点 Do{ for (int i=0;inumOfNbrs;i++){ //以方向i进行移动,移动到nbr nbr.row=here.row+offset[i].row; nbr.col=here.col+offset[i].col; //若该位置未被布线 if (grid[nbr.row][nbr.col]==0){ grid[nbr.row][nbr.col]=grid[here.row][here.col]+1; if ((nbr.row==finish.row)(nbr.col==finish.col)) break; Q.add(nbr); }} if ((nbr.row==finish.row) (nbr.col==finish.col)) break; if (q.isEmpty()) return false; //无解 Q.Delete(here); //取下一个扩展结点 }while(true); 算法设计与分析 分支限界法 * * 为了构造最短布线路径,需要从目标方格开始向起始方格回溯,逐步构造出最优解。 每次向标记距离比当前方格距离少1的相邻方格移动,直至到达起始方格时为止。 初始化: pathLen=grid[finish.row][finish.col]-2; path = new Position[pathLen]; //从目标位置开始向起始位置回溯 here = finish; 算法设计与分析 分支限界法 构造最优解 for (int j=pathLen-1;j=0;j--){ p

文档评论(0)

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

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

1亿VIP精品文档

相关文档