《算法设计与分析》实验报告

       

所在院系

计算机与信息工程学院

学生学号

学生姓名

年级专业

2020级计算机科学与技术

授课教师

彭绪富

学         期

2022-2023学年第1学期

提交时间

2022年12月10日

目录

实验十一:电路布线问题

一、实验目的与要求

二、 实验环境

三、实验步骤与分析

四、实验小结

实验一:电路布线问题

一、实验目的与要求

实验题目:印制电路板将布线区域划分成n x n个方格。精确的电路布线问题要求确定连接方格a到方格b的最短布线方案。在布线时,电路只能沿着直线或直角布线,也就是不允许线路交叉。

实验要求:①对电路布线问题确定一个合理的限界函数;②设计算法实现电路布线问题;③设计测试数据,统计搜索空间的结点数,分析时间性能。

  • 实验环境

devc++

三、实验步骤与分析

1.用队列式分支限界法来考虑布线问题。布线问题的解空间是一个图,则从起始位置a开始将它作为第一个扩展结点。与该扩展结点相邻并可达的方格成为可行结点被加入到活结点队列中,并且将这些方格标记为1,即从起始方格a到这些方格的距离为1。接着,从活结点队列中取出队首结点作为下一个扩展结点,并将与当前扩展结点相邻且未标记过的方格标记为2,并存入活结点队列。这个过程一直继续到算法搜索到目标方格b或活结点队列为空时为止。

一个7×7方格阵列布线如下图3-1:

起始位置是a =(3,2),目标位置是b =(4,6),阴影方格表示被封锁的方格。当算法搜索到目标方格b时,将目标方格b标记为从起始位置a到b的最短距离。此例中, a到b的最短距离是9。

图3-1 电路板及其最短布线路径

2.源代码:

#include <iostream>#include <queue>using namespace std;int m=8;int n=8;int grid[10][10];int indexcount=0;struct Position{int row;int col;};void showPath(){for(int i=0; i<10; i++){for(int j=0; j<10; j++)cout<<grid[i][j]<<" ";cout<<endl;}cout<<"------------------"<<endl;}bool FindPath(Position start,Position finish,int &PathLen,Position  *&path){//计算从起点位置start到目标位置finish的最短布线路径,找到最短布线路//径则返回true,否则返回falseif((start.row==finish.row) && (start.col==finish.col)){PathLen=0;cout<<"start=finish"<<endl;return true;} //start=finish//设置方格阵列“围墙”//初始化图,-1为未访问for(int i=1; i<9; i++){for(int j=1; j<9; j++)grid[i][j]=-1;}//添加阻挡点grid[2][3]=-2;for(int i=0; i<= m+1; i++)grid[0][i]=grid[n+1][i]=-2; //顶部和底部for(int i=0; i<= n+1; i++)grid[i][0]=grid[i][m+1]=-2; //左翼和右翼//初始化相对位移cout<<"完整图"<<endl;showPath();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]=0;//标记可达方格位置cout<<"布线前图"<<endl;showPath();queue<Position> Q;do  //标记相邻可达方格{for(int I=0; I<NumOfNbrs; I++){nbr.row=here.row + offset[I].row;nbr.col=here.col+offset[I].col;if(grid[nbr.row][nbr.col]==-1){//该方格未被标记//cout<<grid[nbr.row][nbr.col]<<endl;//显示路标值grid[nbr.row][nbr.col]=grid[here.row][here.col]+1;//cout<<nbr.col<<"   "<<nbr.row<<endl;//显示坐标}if((nbr.row==finish.row) &&(nbr.col==finish.col)) break; //完成布线Q.push(nbr);}//是否到达目标位置finish?if((nbr.row==finish.row)&&(nbr.col==finish.col)) break;//完成布线//活结点队列是否非空?if(Q.empty()) return false;//无解here = Q.front();//cout<<here.col<<" "<<here.row<<endl;Q.pop();//取下一个扩展结点indexcount++;// cout<<"下一节点"<<indexcount<<endl;}while(true);//构造最短布线路径PathLen=grid[finish.row][finish.col];path=new Position[PathLen];//从目标位置finish开始向起始位置回溯here=finish;for(int j=PathLen-1; j>=0; j--){path[j]=here;//找前驱位置for(int i=0; i<NumOfNbrs; i++){nbr.row=here.row+offset[i].row;nbr.col=here.col+offset[i].col;if(grid[nbr.row][nbr.col]==j){// cout<<j<<endl;break;}}here=nbr;//向前移动}return PathLen;}int main(){Position start;start.col=1;start.row=1;cout<<"布线起点"<<endl;cout<<start.col<<" "<<start.row<<endl;Position finish;finish.row=3;finish.col=4;cout<<"布线结束点"<<endl;cout<<finish.col<<" "<<finish.row<<endl;int PathLen=0;Position *path;FindPath(start,finish,PathLen,path);cout<<"布线后路径图"<<endl;showPath();cout<<"路径"<<endl;for(int i=0; i<PathLen; i++){cout<<path[i].col<<" "<<path[i].row<<endl;}cout << "布线问题完毕!" << endl;system("pause");return 0;}

3.运行结果:

四、实验小结

通过本次实验,了解了分支限界算法的基本思想,掌握了使用限界剪枝法。对于具体的问题实例,很难预测限界剪枝法的大规模的组合问题在合理的时间内求解。然而,对于具体的问题实例,很难预测限界剪枝法的搜索行为,无法预先判断哪些输入实例可以在合理的时间内求解,哪些输入实例不能在合理的时间内求解。在最坏的情况下,限界剪枝法的时间复杂度是指数阶。

实验十一 电路布线问题相关推荐

  1. daad转换器实验数据_实验十一DAAD转换器.doc

    实验十一DAAD转换器 实验十一 D / A.A / D转换器 一.实验目的 1.了解D / A和A / D转换器的基本工作原理和基本结构 2.掌握大规模集成D / A和A / D转换器的功能及其典型 ...

  2. JAVA数据库访问设置的实验_实验十一 连接数据库实验(V2.0)

    实验十一  连接数据库实验(V2.0) 一.实验目的 1.  连接MS SQL Server2005数据库 2.  读取数据库到Web页面 二.实验内容 1.实验准备: java连接数据库的方法模型. ...

  3. 实验十一 连接数据库实验(V2.0)

    实验十一  连接数据库实验(V2.0) 一.实验目的 1.  连接MS SQL Server2005数据库 2.  读取数据库到Web页面 二.实验内容 1.实验准备:         java连接数 ...

  4. 实验十一 团队作业7:团队项目设计完善编码

    实验十一 团队作业7:团队项目设计完善&编码 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 实验十一 团队作业7:团队项目设计完善&编码 团队名称 Co ...

  5. c语言程序设计 实验十一,C语言实验十一 结构体程序设计(二)

    实验十一结构体程序设计(二) 一.实验目的 1.掌握链表的基本概念与定义方法: 2.掌握链表.共用体的程序设计. 二.实验环境 1.硬件:PII以上计算机: 2.软件:Windows.Visual C ...

  6. 50欧姆线设计 高频pcb_高频电路布线的应对方法有哪些?

    高频电路布线的应对方法有哪些? 文/中信华PCB 什么是高频电路布线?应该如何应对?说到高频电路布线,PCB设计工程师的比较头疼的.对于高频电路设计是一个非常复杂的设计过程,其布线对整个设计至关重要! ...

  7. mysql的备份与恢复_实验十一 MySQLl备份与恢复1

    实验十一MySQL备份与恢复 一.实验内容: 1. 使用SQL语句导入和导出表数据 2. 使用客户端工具备份还原数据库 3. 使用日志文件恢复数据库 二.实验项目:学生成绩数据库 创建用于学生成绩管理 ...

  8. 计算机综合布线实验报告,综合布线设计实验报告.doc

    综合布线设计实验报告.doc 桂林电子科技大学综合布线实验报告实验名称布线工程图设计制作实验辅导员意见电子信息工程系通信技术专业班第2实验小组作者张三学号091同作者辅导员实验日期2011年5月31日 ...

  9. 电路布线-----问题详解

    电路布线 在一块电路板的上.下两端分别有n个接线柱.根据电路设计,要求用导线(i,π(i)) 将上端接线柱i与下端接线柱π(i)相连,如下图. )] 其中π(i),1≤ i ≤n,是{1,2,-,n} ...

最新文章

  1. linux中文乱码的解决
  2. [2016-04-19 15:46:03 - IceHoloReader1.0] Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER [20
  3. Monkey测试1——Monkey的使用
  4. feature map 意义_FeatureMap Viewer以及中心化对统计分布变化的影响讨论
  5. 自动化办公之excel教程(4):使用艺术字,图片,图形美化工作表
  6. C#学生信息管理系统
  7. .NET Core 3.0】框架之十三 || 部署攻略
  8. Apache PDFBox 2
  9. Spring Cloud Sleuth+Zipkin 构建微服务链路跟踪系统
  10. asp.net mvc源码分析-Action篇 ParameterDescriptor
  11. 足球世界杯亚军去的南宁观音寺,咱也去了几次
  12. 手工配置Service的过程中。
  13. ADAPT-PT v8.0(房屋与停车场结构里的梁、板、楼板系统之先进后拉预力软件)
  14. python与城市规划_读书报告:地理信息系统与城市规划管理
  15. 三斜线表头表格HTML,excel三栏斜线表头的完美制作方法
  16. 魔教传奇—阿里软件的魔方文化
  17. 大众点评热门餐厅抓取与数据分析
  18. 解决升级完pip后无法使用pip的问题
  19. 数据科学导论——数据预处理进阶
  20. 机器学习 —— 简单模型的构建

热门文章

  1. 企业云化应用(SaaS)是未来绝对的趋势
  2. 全面屏虚拟键适配方案
  3. DB207S-ASEMI手机快充适配器标配整流桥
  4. kotlin和java区别!Android平台HTTPS抓包解决方案及问题分析,大厂面试题汇总
  5. 华为鸿蒙系统支持19款机型 有你的手机吗,华为鸿蒙OS再生变数,首批只有19款机型可升级,有你的手机吗?...
  6. 影像的滑动窗口裁切与拼接(附代码)
  7. 最全面的WordPress建站教程,零基础30分钟学会建站
  8. CMD快捷指令之启动字符映射表
  9. 墨刀教程:如何快速制作一个App首页原型?
  10. MySQL数据库的核心MVCC详解