算法设计--电路布线问题(分支限界法求解)

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

问题描述

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

算法应用

用分支限界法解此布线问题。分支限界法类似回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但分支限界法只找出满足约束条件的一个最优解,并且以广度优先或最小耗费优先的方式搜索解空间树T。树T是一棵子集树或排列树。在搜索时,每个结点只有一次机会成为扩展结点,并且一次性产生其所有儿子结点。从活结点表中选择下一扩展结点有两种方式:(1)队列式(FIFO) (2)优先队列式。分支限界法广泛应用于单源最短路径问题,最大团问题,布线问题,电路板排列问题等。

求解思路

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

算法思路

在实现上述算法时,

(1)定义一个表示电路板上方格位置的类Position。

它的2个成员row和col分别表示方格所在的行和列。在方格处,布线可沿右、下、左、上4个方向进行。沿这4个方向的移动分别记为0,1,2,3。下表中,offset[i].row和offset[i].col(i= 0,1,2,3)分别给出沿这4个方向前进1步相对于当前方格的相对位移。

移动i

方向

offset[i].row

offset[i].col

0

1

2

3

0

1

0

-1

1

0

-1

0

(2)用二维数组grid表示所给的方格阵列。

初始时,grid[i][j]= 0, 表示该方格允许布线,而grid[i][j]= 1表示该方格被封锁,不允许布线。

举例说明

一个7×7方格阵列布线如下:

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

算法设计--电路布线问题(分支限界法求解)_第1张图片



代码转自http://blog.csdn.net/ei__nino/article/details/8195906

#include 
#include 
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< Q;
    do  //标记相邻可达方格
    {
        for(int I=0; I=0; j--)
    {
        path[j]=here;
//找前驱位置
        for(int i=0; i





你可能感兴趣的:(算法设计--电路布线问题(分支限界法求解))