布线问题—分支限界—java实现
问题描述
印刷电路板将布线区域划分成m×n个方格阵列,精确的电路布线问题要求确定连接方格a的中点到方格b中点的最短布线方案。
在布线时,电路只能沿直线或直角布线。
———————
算法思想
1、解决此问题的队列式分支限界法从起始位置a(起始为2)开始将它作为第一个扩展结点。
2、与该扩展结点相邻并且可达的方格成为可行结点并加入到活结点队列中,并且将这些方格标记为3,即从起始方格a到这些方格的距离为3-2 = 1
3、接着,算法从活结点队列中取出队首结点作为下一个扩展结点,并将与当前扩展结点相邻且从未被标记过的方格标记为4,并存入活结点队列。
4、这个过程一直持续到算法搜索到目标方格b或活结点队列为空为止。即加入剪枝的广度优先搜索。
设计
【Position类设计】
class Position{private int row;private int col;public int getRow() {return row;}public void setRow(int row) {this.row = row;}public int getCol() {return col;}public void setCol(int col) {this.col = col;}public Position(int row, int col) {super();this.row = row;this.col = col;}public Position() {super();}//这里实现了一下拷贝构造函数,目的是为了更容易为对象赋值public Position(Position position) {this.row = position.row;this.col = position.col;}//这里重写toString函数,便于输出解的形式@Overridepublic String toString() {return "(" + row + ", " + col + ")";}}
【定义移动方向的相对位移】
public static void setPos() {//右offset[0] = new Position(0,1);//下offset[1] = new Position(1,0);//左offset[2] = new Position(0,-1);//右offset[3] = new Position(-1,0);}
【分支限界算法核心代码】
public static boolean search() {Position nbr = new Position();here = new Position(2,2);//a的位置grid[2][2] = 2;Position end = new Position(5,5);//b的位置do {for(int i = 0;i<4;i++) {nbr.setRow(here.getRow() + offset[i].getRow());nbr.setCol(here.getCol() + offset[i].getCol());if(grid[nbr.getRow()][nbr.getCol()] == 0) {//该方格未标记grid[nbr.getRow()][nbr.getCol()] = grid[here.getRow()][here.getCol()] + 1;//距离+1if((nbr.getRow() == end.getRow())&&(nbr.getCol() == end.getCol())) {break;//完成布线}queue.offer(new Position(nbr.getRow(),nbr.getCol()));//加入到扩展结点队列}}if((nbr.getRow() == end.getRow())&&(nbr.getCol() == end.getCol())) {break;//完成布线}if(queue.isEmpty()) {return false;}here = queue.poll();}while(true);pathLen = grid[end.getRow()][end.getCol()] - 2;//路径长度path = new Position[pathLen];//路径//从目标位置end开始向起始位置回溯here = end;for(int j = pathLen-1;j>=0;j--) {path[j] = here;//找前驱位置for(int i = 0;i<4;i++) {nbr.setRow(here.getRow() + offset[i].getRow());nbr.setCol(here.getCol() + offset[i].getCol());if(grid[nbr.getRow()][nbr.getCol()] == j+2) {break;}}here = new Position(nbr);//向前移动}return true;}
完整代码
package maze;import java.util.Queue;
import java.util.LinkedList;
class Position{private int row;private int col;public int getRow() {return row;}public void setRow(int row) {this.row = row;}public int getCol() {return col;}public void setCol(int col) {this.col = col;}public Position(int row, int col) {super();this.row = row;this.col = col;}public Position() {super();}public Position(Position position) {this.row = position.row;this.col = position.col;}@Overridepublic String toString() {return "(" + row + ", " + col + ")";}}public class Cm {private static int[][] grid = new int[8][8];//m=n=8private static int pathLen;private static Position[] path;private static Position here;//定义移动方向的相对位移private static Position[] offset = new Position[4];private static Queue<Position> queue = new LinkedList<Position>();public static boolean search() {Position nbr = new Position();here = new Position(2,2);//a的位置grid[2][2] = 2;Position end = new Position(5,5);//b的位置do {for(int i = 0;i<4;i++) {nbr.setRow(here.getRow() + offset[i].getRow());nbr.setCol(here.getCol() + offset[i].getCol());if(grid[nbr.getRow()][nbr.getCol()] == 0) {//该方格未标记grid[nbr.getRow()][nbr.getCol()] = grid[here.getRow()][here.getCol()] + 1;//距离+1if((nbr.getRow() == end.getRow())&&(nbr.getCol() == end.getCol())) {break;//完成布线}queue.offer(new Position(nbr.getRow(),nbr.getCol()));//加入到扩展结点队列}}if((nbr.getRow() == end.getRow())&&(nbr.getCol() == end.getCol())) {break;//完成布线}if(queue.isEmpty()) {return false;}here = queue.poll();}while(true);pathLen = grid[end.getRow()][end.getCol()] - 2;//路径长度path = new Position[pathLen];//路径//从目标位置end开始向起始位置回溯here = end;for(int j = pathLen-1;j>=0;j--) {path[j] = here;//找前驱位置for(int i = 0;i<4;i++) {nbr.setRow(here.getRow() + offset[i].getRow());nbr.setCol(here.getCol() + offset[i].getCol());if(grid[nbr.getRow()][nbr.getCol()] == j+2) {break;}}here = new Position(nbr);//向前移动}return true;}public static void setPos() {//右offset[0] = new Position(0,1);//下offset[1] = new Position(1,0);//左offset[2] = new Position(0,-1);//右offset[3] = new Position(-1,0);}public static void main(String[] args) {// TODO Auto-generated method stubsetPos();//设置边界的围墙,其实只用搜素1-6for(int i =0;i<8;i++) {grid[0][i] = grid[7][i] = 1;}for(int j=1;j<7;j++) {grid[j][0] = grid[j][7] = 1;}search();//输出分支限界算法的解矩阵System.out.println("输出分支限界算法的解矩阵:");for(int i=0;i<8;i++) {for(int j=0;j<8;j++) {System.out.print(grid[i][j] + " ");}System.out.println();}System.out.print("从a到b的路径: "+ here + "-->");for(int i =0;i<5;i++) {System.out.print(path[i] + "-->");}System.out.println(path[5]);}}
运行输出
布线问题—分支限界—java实现相关推荐
- 布线问题分支限界法java_大型布线:Java云应用程序缺少的技术
布线问题分支限界法java 您是否曾经想过,为什么大多数Java框架中的依赖项注入仅用于本地进程内服务而不是分布式服务? 我最近在2013年EMC世界大会上遇到了Paul Maritz的主题演讲 (跳 ...
- 大型布线:Java云应用程序缺少的技术
您是否曾经想过,为什么大多数Java框架中的依赖项注入仅用于本地进程内服务而不是分布式服务? 我最近在2013年EMC世界大会上遇到了Paul Maritz的主题演讲 (跳至第32分钟),这使我在云平 ...
- 6-4布线问题(分支限界)
6-4布线问题(分支限界) 一.问题描述 印刷电路板将布线区域划分成m*n个方格阵列,如图(1)所示. 精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案. 在布线时,电路只能沿直 ...
- 布线问题(分支限界)
问题描述: 印刷电路板将布线区域划分成n×m个方格.精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案.在布线时,电路只能沿直线或直角布线.为了避免线路相交,已布了线的方格做了封锁 ...
- 分支限界——布线问题
分支限界--布线问题 问题: 印刷电路板将布线区域划分成n×m个方格如图a所示.精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案.在布线时,电路只能沿直线或直角布线,如图b所示. ...
- java分支限界实现装载问题_分支限界法之装载问题
装载问题(分支限界)Dlg.cpp #include "Queue.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE ...
- java递归实现汉字组词穷举_01背包各种算法代码实现总结(穷举,贪心,动态,递归,回溯,分支限界)...
2020-05-22 所有背包问题实现的例子都是下面这张图 01背包实现之--穷举法: 1.我的难点: (1)在用穷举法实现代码的时候,我自己做的时候认为最难的就是怎么将那么多种情况表示出来,一开开始 ...
- 算法高级(28)-递归、分治、动态规划、贪心、回溯、分支限界几大相似算法比较
在学习算法的过程中,递归.分治.动态规划.贪心.回溯.分支限界这些算法有些类似,都是为了解决大问题,都是把大问题拆分成小问题来解决,但她们之间还是有一些不同之处的,我来给同学们整理一下. 一.算法思想 ...
- java api 设计_Java API设计实践
使你的API在模块化和非模块化Java环境中都可用 在优锐课的java学习分享中,对微服务有了更深层次的新概念.关于API设计实践一点就通了. 介绍 了解设计Java API时应应用的一些API设计实 ...
- java 最小化 api_Java的API设计实践
Introduction 了解在设计Java API时应该应用的一些API设计实践.通常,这些实践很有用,并确保API可以在模块化环境中正确使用,例如OSGi和Java平台模块系统(JPMS).有些做 ...
最新文章
- 一文梳理2019年腾讯广告算法大赛冠军方案
- 量子计算技术的研究现状与趋势
- 查询ms sql 2005版本号
- Bootstrap-模态框 modal.js
- Dapr + .NET 实战(四)发布和订阅
- 【Python】对象、类、元类
- 明显调用的表达式前的括号必须具有函数类型_Chisel(二) Scala语法 变量与函数...
- mysql表统一编码_PHP MySQL Apache统一编码
- Flask开发天气查询软件,带你掌握pipenv的使用与手机Termux下的部署
- 9001.消息中间件zeroMQ
- axios创建实例对象发送ajax请求_解决一个网页请求多个服务器场景---axios工作笔记009
- 1 Hello World,JavaFX Style
- 图像数集据增广的15+种功能总结和Python代码实现
- C#------如何获取本机IP地址
- Atitit 知识图谱解决方案:提供完整知识体系架构的搜索与知识结果overview
- VMware虚拟机中Ubuntu16.04系统下通过MVS运行海康威视工业相机
- (五十七)方差分析与相关分析
- Turtle 画正方形螺旋线
- 安卓开发实现俄罗斯方块游戏
- 骞云科技DevOps实践