布线问题分支界限法求解

【布线问题】“分支限界法”——《算法设计与分析(第五版)》 阅读详情

问题描述

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

在这里插入图片描述

问题分析

布线问题的解空间是一个图结构。
解决的思路采用分支限界法,从起始节点开始不断扩展,直到目的节点结束,得到最短的路径长度(即最优值);然后从目的节点往回回溯,逐步求得最优解。

解题步骤

  • 创建一个表示节点的结构体Position,其包含两个int变量,x,y分别表示当前节点所在的行数,列数;
  • 创建一个二维数组grid[][],表示当前的电路板,初始时,grid[i][j]=0表示可以布线,grid[i][j]=1表示该节点被封锁,不能布线。为了便于处理方格边界的问题,约定在原有的方格阵列四周增设一道围墙,这些附加方格全部标记为1,不允许扩展。
  • 创建一个队列Q,用来扩展活结点表,初始时队列为空,将起始节点的四周的可扩展节点全部加入队列,不断循环,求解最优值,直到队列为空为止。本题采用队列式分支限界法求解;
  • 创建位移矩阵offset[][],表示当前节点向上下左右扩展的相对位移
    在这里插入图片描述

输入

输入共有n+3行
第一行包括两个数,n,m表示电路板是一个n*m的方格阵列
第二行包括两个数,row1,col1,表示起始点的行号和列号
第三行包括两个数,row2,col2,表示目标点的行号和列号
然后输入n行,每行m个数,0或1,表示电路板的封锁情况

数据规模:
0<=m<=100
0<=n<=100

输出

输出只有一行
表示从起始点到目的点的最短距离

样例输入

7 7
3 2
4 6
0 0 1 0 0 0 0
0 0 1 1 0 0 0
0 0 0 0 1 0 0
0 0 0 1 1 0 0
1 0 0 0 1 0 0
1 1 1 0 0 0 0
1 1 1 0 0 0 0

样例输出

9
在这里插入图片描述

代码

#include <iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<math.h>
#include<queue>
//方格结构体
typedef struct
{
    int x;//x表示小方格所在行号
    int y;//y表示小方格所在列号
}Position;

int grid[102][102];//用来表示电路板
int n,m;//n表示电路板行数,m表示电路板的列数
bool FindPath(Position start,Position finish,int PathLen)
{
    //起点和目的点是同一个点,最短路径为0
    if(start.x==finish.x&&start.y==finish.y){
        PathLen=0;
        return true;
    }
    //设置方格围墙,扩充边界
    for(int j=0;j<=m+1;j++)
        grid[0][j]=1;//第0行全部置1
    for(int i=0;i<=n+1;i++)
        grid[i][0]=1;//第0列全部置1
    for(int j=0;j<=m+1;j++)
        grid[n+1][j]=1;//第n+1行全部置1
    for(int i=0;i<=n+1;i++)
        grid[i][m+1]=1;//第m+1列全部置1

    //初始化相对位移,上,下,左,右
    Position offset[4];
    offset[0].x=0;offset[0].y=1;//表示向右走一格
    offset[1].x=1;offset[1].y=0;//表示向下走一格
    offset[2].x=0;offset[2].y=-1;//表示向左走一格
    offset[3].x=-1;offset[3].y=0;//表示向上走一格
    int NumOfNbrs=4;//可扩展的点为四连通区域
    Position now,nerb;//now表示当前的活结点,nerb表示与活结点相邻的上下左右四个方格
    now=start;//给now赋初值,从初始节点开始,注意start不在活结点表里面
    grid[start.x][start.y]=0;//初始节点到初始节点的
    //构建活结点表的队列
    queue<Position>Q;
    while(1){
        for(int i=0;i<NumOfNbrs;i++){
            nerb.x=now.x+offset[i].x;
            nerb.y=now.y+offset[i].y;
            //说明当前节点可以扩展,那么填充并加入活结点表
            if(grid[nerb.x][nerb.y]==0){
                grid[nerb.x][nerb.y]=grid[now.x][now.y]+1;
                //如果是目的节点,退出
                if(nerb.x==finish.x&&nerb.y==finish.y)
                    break;
                Q.push(nerb);//将新扩展的节点加入活节点表
            }
        }
        if(nerb.x==finish.x&&nerb.y==finish.y)
            break;//如果是目的节点,退出
        if(Q.empty())  return false;//当队列为空时,退出
        now=Q.front();//更新now的值,不然没法接着遍历新的活结点
        Q.pop();//将这个节点从活结点表中删除
    }
    return true;//返回
}
int main()
{
    cin>>n>>m;//输入电路板的行数,列数
    Position start,finish;//表征起始方格,目的方格
    cin>>start.x>>start.y;
    cin>>finish.x>>finish.y;
    //根据输入初始化电路板grid
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
        cin>>grid[i][j];
    int Pathlen;//用来传递参数,当路径不为0时,不用Pathlen
    //执行FindPath函数,更新grid数组,并判断路径是否为0
    FindPath(start,finish,Pathlen);
    //输出结果
    if(Pathlen==0)
        cout<<0;
    else
        cout<<grid[finish.x][finish.y];
    return 0;
}

运行结果

在这里插入图片描述

[算法]分支界限法——C++实现用优先队列求解任务分配问题 [问题描述] 有n(n≥1)n(n≥1)n(n≥1)个任务需要分配给n个人执行,每个任务只能分配给二个人,每个人只能执行一个任务,第iii个人执行第jjj个任务的成本是C[i][j](1≤i,j≤n)C[i][j](1≤i, j≤n)C[i][j](1≤i,j≤n)。 求出总成本最小的一种分配方案。 #include <queue> #include <iostream> using namespace std; #define INF 0x3f3f3f3f #define MA 阅读详情

相关推荐

实验九 分支限界法

与该扩展结点相邻并可达的方格,成为可行结点被加入到活结点队列中,且将这些方格标记为1,即从起始方格a到这些方格的距离为1。算法从活结点队列中,取出队首结点作为下一个扩展结点,将与当前扩展结点相邻且未标记过的方格标记为2,并存入活结点队列。其中第2行第3列的方格是封锁的,第3行第4列的方格是封锁的。布线的起始位置a是第1行第1列的方格,布线的终止位置b是第5行第3列的方格。其中绿色的方格是封锁的,即不能布线的方格。白色的方格是可以布线的。精确的电路布线问题要求确定连接方格a中点到方格b中点的最短布线方案。

Junds0的博客 5253

6-4布线问题(分支限界)

印刷电路板将布线区域划分成m*n个方格阵列,如图(1)所示。 精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案。 在布线时,电路只能沿直线或直角布线,如图(2)所示。 为了避免线路相交,已布了线的方格做了封锁标记,其他线路不允许穿过被封锁的方格。 算法的思想: 队列式分治限界法 每个点的下一步有四个可选位置(上下左右) 解空间树是4叉树位置偏移量: int go[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; //上下左右int m,n;//m行n列; int

我走的每一步都算数 3600

布线问题(分支限界法)

布线问题,和迷宫问题是同一类问题。都是通过广度优先搜索来解决的。当然,深度就更好了。

第1关:印刷电路板

其中绿色的方格是封锁的,即不能布线的方格。白色的方格是可以布线的。精确的电路布线问题要求确定连接方格a中点到方格b中点的最短布线方案。与该扩展结点相邻并可达的方格,成为可行结点被加入到活结点队列中,且将这些方格标记为1,即从起始方格a到这些方格的距离为1。算法从活结点队列中,取出队首结点作为下一个扩展结点,将与当前扩展结点相邻且未标记过的方格标记为2,并存入活结点队列。其中第2行第3列的方格是封锁的,第3行第4列的方格是封锁的。布线的起始位置a是第1行第1列的方格,布线的终止位置b是第5行第3列的方格。

Hakuuna的博客 2764

布线问题(分支界限法)C++实现

费了好大的劲才搞定,应用分支界限法!

【电子元件篇】MOSFET场效应管作用、选型和测量指南-超简单解读

场效应管是一种电压控制型半导体器件,相比三极管具有输入阻抗高、噪声小、功耗低等优势。主要分为结型和绝缘栅型两大类,后者又可分为耗尽型和增强型MOS管。场效应管通过栅极电压控制漏极电流,具有转移特性和输出特性两大静态特性,以及快速的开关特性。其关键参数包括饱和漏源电流、夹断电压、跨导等,应用场景涵盖信号放大、恒流源、阻抗变换等领域。使用时需根据电路需求选择合适类型,如结型管适合一般放大,功率MOSFET适合高压大电流场合。检测时可用万用表电阻档初步判断好坏和放大能力。

2301_81299416的博客 2540

布线问题中,布线时候,电路可以走日字。

在布线问题中,如果电路可以走"日"字,我们可以将问题建模为一个图,其中每个节点代表一个位置,每条边代表两个位置之间的可能路径。然后,我们可以使用分支界限法来找到从起点到终点的最短路径,同时考虑到路径的成本和限制。在这个图中,节点用字母表示,边的权重表示路径的成本。例如,从节点A到节点B的成本是1,从节点B到节点C的成本是2,以此类推。这个图允许走"日"字,这意味着从一个节点可以直接到达它的水平、垂直和对角相邻的节点。示例图是一个无向图,其中每个节点代表一个位置,每条边代表两个位置之间的可能路径。

qq_20489259的博客 597

从桨叶设计到电机匹配:手把手教你调出无人机最佳动力组合

本文系统介绍了无人机动力系统的核心匹配原则,重点解析了如何通过测试与数据分析,优化螺旋桨与电机的组合,从而显著提升系统力效与续航。文章提供了从参数解读、实战测试到深度调优的完整指南,帮助开发者解决电机过热、推力不足等常见问题,实现无人机性能最大化。

weixin_29305313的博客 239

布线问题_分支界限法(广度优先搜索)|(图的搜索问题)

广度优先对图的搜索

qq_52809737的博客 136

lumerical中DEVICE和MODE模块的交互使用(真的很干货!!可以自信的说网上绝对找不到比我更详细的步骤了)

几个脚本文件很重要! Lumerical仿真流程: 一、DEVICE: (1).建模并且运行完之后,在脚本提示符下键入以下脚本行以运行plotDopingProfile.lsf如图1(文件名如果索引不到的话就可以把文件直接用notepad++打开,然后把代码直接输入到device中script脚本中 如图2)脚本文件并生成下图 如图3: (图2) (图1) (图3) (2).仿真...

1万+

【Rcode】生存分析: KM & COX回归& 随机森林& nomogram

本文使用了R——survival包下的lung数据进行方法测试: 1)KM 2) Cox回归:多因素 3)随机森林因子(根据cox回归结果) 4)nomogram ( 根据cox回归结果,建立了中位生存时间,1年5年生存率的概率计算) -------------------????????‍♀️本文只有干货,非常干!????----------------------------- 一、数据加载 #生存分析 library("survival") library("survminer") data("

weixin_43172152的博客 9273

java算法分支界限法_算法详解之分支限界法的具体实现

首先我们来关注一个问题:问题描述:布线问题:印刷电路板将布线区域划分成n×m个方格阵列,要求确定连接方格阵列中的方格a的中点到方格b的中点的最短布线方案。在布线时,电路只能沿直线或直角布线,为了避免线路相交,已布了线的方格做了封锁标记,其他线路不允许穿过被封锁的方格。如下图所示: 算法思路:布线问题的解空间是一个图,则从起始位置a开始将它作为第一个扩展结点。与该扩展结点相邻并可达的方格成为可行结点...

weixin_36204992的博客 940

Windows Server 2019整机备份与异机还原实战:从虚拟机到物理机的完整迁移指南

本文详细介绍了Windows Server 2019整机备份与异机还原的实战操作,涵盖从虚拟机到物理机的完整迁移流程。通过环境准备、备份策略设计、具体操作步骤及迁移后优化等内容,帮助用户实现系统环境的无缝迁移,特别适用于服务器硬件升级、数据中心迁移等场景。

weixin_30555125的博客 133

基于链表数据结构+优先队列式(LC)分支限界算法的布线问题的求解(C语言版)

本文给出了基于优先队列分支限界算法的布线问题的解决思路,并且给出了C语言的相应实现,方便大家交流讨论。

tangguofeng的博客 1165

Kaggle赛题总结:Enefit - Predict Energy Behavior of Prosumers

竞赛旨在解决能源不平衡的问题,即预计使用的能源与实际使用或产生的能源不符。自发自用者是既消耗又产生能源的个体,他们在造成能源不平衡方面起到了重要作用。尽管他们只占所有能源消费者的一小部分,但他们不可预测的能源使用行为给能源公司带来了物流和财务问题。如果不加以解决,可能会导致运营成本增加、电网不稳定以及能源资源的低效利用。如果这个问题得到有效解决,将显著降低不平衡成本,提高电网的可靠性,并使自发自用者更高效和可持续地融入能源系统中。

猫敷雪 741

配置 SAP Fiori 服务的 ICF 节点:从 SICF 激活到访问链路打通的完整实践

在SAP Fiori项目实施中,ICF节点配置是关键前置条件却常被忽视。ICF(Internet Communication Framework)作为HTTP请求入口,需要通过SICF事务码激活相关服务节点,否则即使应用开发完善,用户仍可能遇到页面无法访问等问题。典型问题表现为:磁贴可点击但页面空白、资源加载失败等。激活路径主要涉及三组节点:bsp分支下的管理入口、ui5_ui5分支下的应用资源,以及public/bc下的公共资源。项目实施中需特别注意同名服务在不同分支下的差异化作用,确保完整链路通畅。IC

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 264

使用分支限界法的应用-布线问题

法的使用首先要确定一个合理的限界函数,并根据限界函数确定目标函数的界 [down ,up],按照广度优先策略搜索问题的解空间树,在分直结点上依次扩展该结点的孩子 结点,分别估算孩子结点的目标函数可能值,如果某孩子结点的目标函数可能超出目标函数 的界,则将其丢弃;搜索过程中,先生成所有的子节点 (分支),然后对所有分支计算一个函数值(限界),并根据这些函数值(计算出的上界或者 下界),从中选择一个使目标函数最优(限界最优)的子节点作为扩展结点,使得搜索朝着 最优解的方向快速推进,从而很快求得一个最优解。

m0_61679138的博客 1786

YOLO26涨点改进| TGRS 2026 | 独家自研创新、检测头改进篇| AHATHead自适应混合注意力检测头,二次创新,强化特征表达与目标判别能力,适合遥感小目标检测、小目标检测有效涨点

🔥本文提出了一种改进YOLO26模型的AHATHead自适应混合注意力检测头,通过融合全局与局部注意力机制增强特征表达能力。该方法采用动态权重分配策略,在预测阶段自动调整关键区域与通道特征权重,有效提升小目标和密集场景的检测性能。实验表明,AHATHead在保持较高推理效率的同时,显著提高了目标定位精度与类别判别能力。文章详细介绍了模块结构、实现原理和代码集成步骤,并提供了两种改进配置方案(yolo26_AHATHead.yaml和yolo26_RFHA-YOLO-AHATHead.yaml)

Ai缝合怪、助力小伙伴高效发论文 159

分支限界法求解电路布线问题

OpenGL旋转立方体 #include <GL/gl.h> #include <GL/glut.h> int flag=0; GLfloat vertices[][3]={{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},{1.0,1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,1.0},{1.0,-1.0,1.0},{1.0,1...

weixin_44996854的博客 1827

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

分支界限法 图的搜索 布线问题

<br />/****************** *布线问题.从开始位置走到结束位置.中间有封锁区域,不得进入.只能走直线或垂直线绕过 *分支界限法: *其解空间是一个图. *从起始位置s开始将其作为第一个扩展结点,与该扩展结点相邻并且可达的方格成为可行点被加入到活结点队列中,并且在图上对其标记为路径长度 *接着从活结点列表中取出队首结点作为下一个扩展结点,照上...直到搜索到f方格或者队列为空时结束. */ #include <stdio.h> #include <string.h>

野生码农 1572

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

分支界限法--最优工程布线

#include<iostream> #include<algorithm> #include<queue> using namespace std; constexpr auto Max_size = 100; int map[Max_size][Max_size];//地图 int shortest_dist;//最优值 struct Position { ...

计算机科学与技术专业学生的成长之路 1055

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

分支界限法详解:系统性搜索与优化问题求解

分支界限法是一种用于求解优化问题的系统性搜索算法,通过广度优先或最佳优先策略探索解空间树,并利用界限函数剪枝无效分支。本文详解其核心思想、实现方法(如队列与优先队列管理)及在装载、布线等问题中的应用,兼顾理论与代码实践。

PyHaVolask的博客 1013

最短布线问题(田字布线)

从起始位置a开始,将a作为第一个扩展节点,并且将a周围斜线可达方格看作可行节点并放入队列当中,同时这些节点记作1,再从队列中取出首个节点,将该节点周围可达方格当作可行节点放入队列,同时将其记作2,不断循环此步骤,直到队列为空。精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案。在布线时,电路只能沿直线或直角布线,如图(2)所示。为了避免线路相交,已布了线的方格做了封锁标记,其他线路不允许穿过被封锁的方格。在本问题当中,其他条件不变,但要求在布线时,电路只能沿斜线布线(田字布线)。

2401_87235845的博客 392

【算法设计与分析】分支限界法习题

7-1 布线问题印刷电路板将布线区域划分成 n×m 个方格阵列,要求确定连接方格阵列中的方格a 点到方格b 的最短布线方案。在布线时,电路只能沿直线布线,为了避免线路相交,已布了线的方格做了封锁标记,其他线路不允许穿过被封锁的方格。问线路至少穿过几个方格。下图是一个布线的例子:输入格式:第1行输入三个正整数,表示布线区域的尺寸n和m(2≤n,m≤100),以及被封锁的方格数k;

weixin_55664293的博客 3376

布线问题 分析与理解

#include using namespace std; #define N 8 int a[N][N]={0}; typedef struct QNode{  int x;  int y;  struct QNode *next; }QNode, *QueuePtr; typedef struct{  QueuePtr front;  QueuePtr rear; }Q

u012760183的专栏 527

分支限界法总结--例题(01背包,最大团,单源最短路径,装载问题,布线问题)

目录 分支限界法剪枝搜索策略(广度搜索)与算法框架 01背包问题 最大团 单源最短路径 装载问题 布线问题 分支限界法剪枝搜索策略(广度搜索)与算法框架 基本思想 分支限界法与回溯法求解目标不同,回溯法的求解目标是找出解空间中满足约束条件的所有解,而分支限界法的求解目标是找出满足约束条件的一个解,或者是在满足约束条件的解中找出使某一个目标函数值达到极大或者极...

zxzxin的博客~ 1万+
上一篇: 减绳子问题动态规划求解
下一篇: 信号量解决进程同步互斥习题
practical_sharp
博客等级 码龄8年 499粉丝 148原创
评论 17
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值