C++用分支限界法求解最短布线问题.docxVIP

  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文档。上传文档
查看更多
ab a b 实验六 用分支限界法求解最短布线问题 学院: 计算机科学与技术 专业:计算机科学与技术 学号: 班级: 姓名: (本程序在Microsoft Visual C++ 6.0的环境下实现) 一、实验内容: 布线问题:印刷电路板将布线区域划分成 n×m 个方格阵列,要求确定连接方格阵列 中的方格 a 的中点到方格 b 的中点的最短布线方案。在布线时,电路只能沿直线或直角布 线,为了避免线路相交,已布了线的方格做了封锁标记,其他线路不允许穿过被封锁的方 格。 实验要求:用分支限界法解此最短布线问题。 分支限界法类似回溯法,也是一种在问题的解空间树 T 上搜索问题解的算法。但分支 限界法只找出满足约束条件的一个最优解,并且以广度优先或最小耗费优先的方式搜索解 空间树 T。树 T 是一棵子集树或排列树。在搜索时,每个结点只有一次机会成为扩展结点, 并且一次性产生其所有儿子结点。从活结点表中选择下一扩展结点有两种方式:(1)队列 式(FIFO) (2)优先队列式。分支限界法可广泛应用于单源最短路径问题,最大团问题, 布线问题,电路板排列问题等。 举例说明:一个 7×7 方格阵列布线如下:起始位置是 a = (3,2),目标位置是 b = (4,6), 阴影方格表示被封锁的方格。那么一条从 a 到 b 的最短布线方案如下图红色路径所示。a 到 b 的最短距离是 9。 请思考:如何使得构造出的最短布线中的折角数量最少? 最短布线路径示例 二、算法思想: 首先从点 a 出发向上下左右四个方向查找到点 b 的路径,并且每走一步便做增一标记, 到达 b 点后,将路径长度赋给一个变量,依次递减路径长度,由 b 点往回查找得到路径。 三、实验过程: #includeiostream #includeiomanip using namespace std; struct Position { int row; int col; }; struct TEAM { int x; int y; TEAM *next; }; Position start,end,path[100]; TEAM *team_l=NULL; int a[100][100]; int m,n,path_len; void Output() { int i,j; cout\n-------------------布线区域图-------------------\n; for(i=0;im+2;i++) { for(j=0;jn+2;j++) { coutsetw(2)a[i][j]; } coutendl; } cout------------------------------------------------\n; return; } void Input_data() { char yes; int x,y; cout请输入区域大小(行列的个数): ; cinmn; cout请输入开始点坐标(x,y): ; cinstart.rowstart.col; cout请输入结束点坐标(x,y): ; cinend.rowend.col; cout区域内是否有被占用点? (y/n) ; cinyes; while(yes==y) { cout请输入占用点的坐标(x,y): ; cinxy; if(x0 || xm+1 || y0 || yn+1 || (x==start.row y==start.col) || (x==end.row y==end.col)) { cout输入错误,请重新输入!!!\n; continue; } else { a[x][y]=-1; } cout是否还有被占用点? (y/n) ; cinyes; } for(x=0;xm+2;x++) { a[0][x]=-1; a[m+1][x]=-1; } for(x=0;xn+2;x++) { a[x][0]=-1; a[x][n+1]=-1; } return; } void Inq(Position p) { TEAM *t,*q; q=team_l; t=new TEAM; t-x=p.row; t-y=p.col; t-next=NULL; if(team_l==NULL) { team_l=t; return ; } while(q-next!=NULL) { q=q-next; } q-next=t; return; } Position outq() { Position out; out.row=team_l-x; out.col=team_l-y; team_l=team_l-next; return out; } void Find_path() { Position o

文档评论(0)

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

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

1亿VIP精品文档

相关文档