算法设计和分析电路板布线.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法设计和分析电路板布线.doc

电路板布线问题 印刷电路板将布线区域分成n×m个方格阵列,如下图 a .精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案。在布线时,电路只能沿直线或直角布线,如下图 b 所示。为了避免线路相交,已布了线的方格做了封锁标记,其它线路不允许穿过被封锁的方格。 采用队列式 FIFO 分枝限界法解此问题,它的解空间树是一个无向图。首先结点a作为第一个扩展结点。与该扩展结点相邻并且可达的方格成为可行结点被加入到活结点队列,这些结点被加入队列的顺序是:右、下、左、上。将这些方格标记为1,它表示从起始方格a到这些方格的距离为1。接着从活结点队列中取出队首结点作为下一个扩展结点,并将与扩展结点相邻且未标记过的方格标记为2,并以右、下、左、上的顺序将这些结点存放到活结点队列中。这个过程一直持续到算法搜索到目标方格b或者活结点队列为空时停止。注意到,搜索过程在遇到标记封锁的方格时,自动放弃此方格。下图是在7×7方格阵列中布线的例子。其中,起始点的位置是a 3,2 ,目标是位置b 4,6 .有!!号的方格表示被封锁。搜索过程如下图 c 所示。 图 c 图 d 本例中,a到b的最短距离是9。要构造出与最短距离相应的最短路径,须从目标方格开始向起始方格回溯,逐步构造出最优解。每次向比当前方格标号小1的相邻方格移动,直至到达起始方格为止。图 d 给出了该例子的最短路径,它是从目标方格b移动到 5,6 ,然后移至 6,6 ,…,最终移至起始方格a。 在算法实现时,首先定义一个表示电路板上方格位置的类Position,它有两个私有成员row和col,分别表示方格所在的行和列。在电路板的任一方格处,布线可沿右、下、左、上四个方向进行,分别记为移动0,1,2,3。offset[i].col 1表示向右前进一步; offset[i].col -1表示向左前进一步。在这两种情况下,都有,offset[i].row 0。类似地讨论向下和向上前进的情况。 一般用一个二维数组grid表示所给的方格阵列。初始时,grid[i][j] 0,表示该方格允许布线,而grid[i][j] 1表示该方格不允许布线(有封锁标记)。为了便于处理边界方格的情况,算法对所给的方格阵列的四周设置一道“围墙”,即增设标记为1的附加方格。算法开始时测试初始方格与目标方格是否相同。若相同,则不必计算,直接返回最短距离0。否则,算法设置方格阵列的围墙,初始化位移矩阵offset。算法将起始位置的距离记为2。因为数字0和1用于表示方格的开放或封闭状态,所以,表示距离不用这两个数字,因而将所有的距离值都加2。实际距离应为标记距离减2。算法从起始位置start开始,首先标记所有标记距离为3的方格,并存入活结点队列,然后依次标记所有标记距离为4,5,… 的方格,直至到达目标方格finish或活结点队列为空时为止。 程序8-3-1 布线问题的队列式分枝限界算法 bool FindPath Position start,Position finish,int PathLen, Position * path //计算从起点位置start到目标位置finish的最短布线路径,找到最短布线路 //径则返回true,否则返回false if start.row finish.row start.col finish.col PathLen 0; return true; //start finish //设置方格阵列“围墙” for int i 0; i m+1; i++ grid[0][i] grid[n+1][i] 1; //顶部和底部 for int i 0; i n+1; i++ grid[i][0] grid[i][m+1] 1; //左翼和右翼 //初始化相对位移 Position offset[4]; offset[0].row 0; offset[0].col 1;//右 offset[1].row 1; offset[1].col 0;//下 offset[2].row 0; offset[2].col -1;//左 offset[3].row -1; offset[3].col 0;//上 int NumOfNbrs 4;//相邻方格数 Position here,nbr; Here.row start.row; Here.col start.col; Grid[start.row][start.col] 2; //标记可达方格位置 LinkedQueue Q; Do //标记相邻可达方格 For int I 0; I NumOfNbrs; I++ Nbr.row here.row + offset[

文档评论(0)

dmz158 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档