印刷电路板将布线区域划分成n*m个方格阵列。精确的电路布线问题要求确定链接方格a到方格b的最短布线方案。在布线时,电路只能沿直线或者直角布线。为了避免线路相交,已布了线的方格做了封锁标记(红色方格),其他线路不允许穿过被封锁的方格。

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

在实现上述算法时,首先定义一个表示电路板上方格位置的类Position,它的两个私有成员row和col分别表示方格所在的行和列。在电路板的任何一个方格处,布线可沿右,下,左,上4个方向进行。沿这4个方向的移动分别记为移动0,1,2,3.下表的offset[i].row 和offset[i].col分别给出4个方向的相对位移。

用二维数组grid表示所给方阵。初始时grid[i][j]=0,表示该方格允许布线,而grid[i][j]=1表示该方格被封锁,不允许布线。为了方便处理方格边界的情况,给方阵的四周设置一道围墙,即把周围用附加的已封锁方格(g[i][j]=1)围住。算法一开始先检验起始方格和目的方格是否同位置,如果是,则不必计算,直接返回最短距离0。由于数字0和1用于表示方格的开放/封锁状态,所以表示距离时不用这两个数字,将距离的值都加2。实际距离为标记距离减2。算法具体的描述如下:

bool FindPath(Position start,Position finish,int &PathLen,Position *&Path)
{//计算从起始位置start到目标位置finish的最短布线路径//找到最短布线路径返回true,否则返回falseif((start.row==finish.row)&&(start.col==finish.col)){ PathLen=0;return true;}//设置围墙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<Position>Q;do{//标记可达相邻方格for(int i=0;i<NumOfNbr;i++){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);}}//是否达到目标位置finish?if((nbr.row==finish.row)&&(nbr.col==finish.col)) break; //完成布线//活结点队列是否空if(Q.IsEmpty()) return false;  //无解Q.Delete(here);   //取下一个扩展结点 }while(true);//构造最短布线路径PathLen=grid[finish.row][finish.col]-2;Path=new Position[PathLen];//从目标位置finish开始向起始位置回溯here=finish;for(int j=PathLen-1;j>=0;j--){path[j]=here;//找前驱位置for(int i=0;i<NumOfNbr;i++){nbr.row=here.row+offset[i].row;nbr.col=here.col+offset[i].col;if(grid[nbr.row][nbr.col]==j+2) break; }here=nbr;   //向前移动}return true;
}

布线问题 队列式分支算法相关推荐

  1. 装载问题-分支限界法(队列式分支限界法,优先队列式分支限界法)

    问题描述  有n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且            ∑i=1nwi≤c1+c2\sum^n_{i=1}w_i≤c_1+c_2i=1∑n​ ...

  2. PAI通过流式机器学习算法解决实时热点新闻挖掘案例

    打开新闻客户端,往往会收到热点新闻推送相关的内容.新闻客户端作为一个承载新闻的平台,实时会产生大量的 新闻,如何快速挖掘出哪些新产生的新闻会成为成为热点新闻,决定着整个平台的新闻推荐质量. 如何从平台 ...

  3. StreamDM:基于Spark Streaming、支持在线学习的流式分析算法引擎

    StreamDM:基于Spark Streaming.支持在线学习的流式分析算法引擎 streamDM:Data Mining for Spark Streaming,华为诺亚方舟实验室开源了业界第一 ...

  4. c语言程序位置式pid算法,位置式PID算法的C语言代码

    描述 位置式PID的C语言写法详解 PID调节口诀: 参数整定找最佳,从小到大顺序查 先是比例后积分,最后再把微分加 曲线振荡很频繁,比例度盘要放大 曲线漂浮绕大湾,比例度盘往小扳 曲线偏离回复慢,积 ...

  5. 基于自适应算法和增量式PID算法的模拟直升飞机控制系统

    基于自适应算法和增量式PID算法的模拟直升飞机控制系统 文章目录 基于自适应算法和增量式PID算法的模拟直升飞机控制系统 控制系统硬件 单片机系统 传感器系统介绍 直升机模拟系统介绍 系统模块介绍 A ...

  6. 三菱FX3U PLC 位置式PID算法(ST语言)

    三菱PLC自带的PID不必多说,大家可以自行查看指令说明.关于FX3U 增量式PID可以参看专栏的另一篇博客 三菱PLC增量式PID算法FB(带死区设置和外部复位控制)_RXXW_Dor的博客-CSD ...

  7. 毗邻目录算法与左右值无限分支算法的结合

    之前在开发过程当中会涉及到一些层级结构访问的问题.这种层级结构往往是无限的,而且十分常见.如企业内部的员工分组. 常见的层级结构如下: 全国总行 -- 北京分行 -- 上海分行 -- 福建分行 -- ...

  8. ROT13加密与解密(一种加密和解密都会得到同样答案的密文)“替换式密码算法”

    一. ROT13简介: ROT13(回转13位)是一种简易的替换式密码算法.它是一种在英文网络论坛用作隐藏八卦.妙句.谜题解答以及某些脏话的工具,目的是逃过版主或管理员的匆匆一瞥.ROT13 也是过去 ...

  9. LabVIEW增量式PID算法控制房间温度变化的简单例子的程序

    PID相关的基础知识可以查看我之前写的博客: PID算法的基础知识 基于PID算法的房间温度控制 增量式PID算法控制房间温度变化的简单例子 LabVIEW简单的PID控制程序 前面板

最新文章

  1. 《编写有效用例》读书笔记1
  2. express 设置跨域
  3. python 删除链表中的重复元素
  4. win10装机 哪个版本最稳定
  5. 避免使用CreateThread函数,导致的内存泄露
  6. PHP-Redis扩展安装 error: ext/standard/php_smart_str.h: No such file or directory
  7. 在JavaFX程序中嵌入Swing内容
  8. LeetCode 09. 回文数
  9. Docker容器硬盘热扩容-centos6
  10. 【CV101大会录播】人流密度/河道污染/安全帽识别获奖算法
  11. Makefile--基本规则(零)
  12. android 关闭服务代码,android – 调用stopService方法时,服务不会停止
  13. jquery常用遍历循环处理
  14. 如何全局使用php composer,php – 如何配置要全局安装的composer包?
  15. Allegro学习笔记:Allegro快速入门之一--查看BRD Layout
  16. java做航空购票系统_基于JAVA的航空订票系统
  17. 踩坑记---Win10安装anaconda及tensorflow-cpu版
  18. Houdini图文笔记:Could not create OpenCL device of type (HOUDINI_OCL_DEVICETYPE)问题的解决
  19. 手写由链表设计的简易队列
  20. UPC豁免流程精讲!你与大卖的距离,就在这里!

热门文章

  1. 敏捷软件开发:原则、模式与实践pdf
  2. iPhone手机连接WAPI调试方法和经验总结
  3. tomcat 报错 IOUtils 文件对拷使用
  4. 多目标跟踪(三)| D-S证据理论
  5. php 递归到空如何处理,PHP递归函数返回NULL - Carbon PHP库
  6. 在ubuntu下完美安装RTX(解决离线、乱码问题)
  7. DSP程序优化导致结果出错
  8. css+div 圆角
  9. 自动化测试之验证码识别
  10. 靠谱:保证实时的动态内存分配