分支限界法

2021-08-25 18:13:32 字數 2334 閱讀 6232

分支限界法之佈線問題

一、要求:

1、輸入電路板區域n*m以及佈線的起始位置和結束位置;

2、輸出佈線方案;

3、可以使用c或者vc實現

二、問題分析及實驗原理:

在n*m的方格陣列中存在封鎖區域(佈線時必須繞開的區域),找到起始位置到目標位置的最短路徑。從目標位置開始向起始位置回溯,逐步構造最優解。每次向標記距離比當前方格標記距離少1的相鄰方格移動,直到到達起始方格為止。

三、演算法程式源**:

#include

#include

using namespace std;

typedef struct

int row ;

int col ;

}position;

typedef struct

//struct position;

int row[10000] ;

int col[10000] ;

int end;

int begin ;

}queue;

int grid[100][100];

position start, finish;

int pathlen = 0;

position * path;

int n , m , a , b , x ;

bool findpath(position start,position finish)

//start=finish

//設定方格陣列「圍牆」

int i ;

for( i=0; i<= m+1; i++)

grid[0][i]=grid[n+1][i]=1; //頂部和底部

for( i=0; i<= n+1; i++)

grid[i][0]=grid[i][m+1]=1; //左翼和右翼

int j ;

//初始化相對位移

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;

//標記可達方格位置

//linkedqueueq;

queue q ;

q.end = 0 ;

q.begin = 0 ;

do while(true);

//構造最短佈線路徑

pathlen=grid[finish.row][finish.col]-2;

path=new position[pathlen];

//從目標位置finish開始向起始位置回溯

here=finish;

for( j = pathlen-1; j>=0; j--){

path[j]=here;

//找前驅位置

for( i=0; inbr.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;

int main()

int j ;

printf("輸入電路板區域n*m和封鎖的格數x:\n");

cin>>n>>m>>x;

printf("輸入封鎖的座標:\n");

for( a = 0 ; a < n+2 ; a ++ )

for( b = 0 ; b < m +2 ; b ++ )

grid[a][b] = 0 ;

for( x = x ; x >= 1 ; x -- )

cin >> a >> b ;

grid[a][b]= 1;

printf("輸入起始位置和結束位置:\n");

cin>>start.row>>start.col>>finish.row>>finish.col;

if(findpath(start,finish))

printf("輸出路徑長度及途中座標:");

coutcoutreturn 0 ;

來自:

分支限界法

分支限界法 類似於回溯法,也是一種在問題的解空間樹t上搜尋問題解的演算法。但在一般情況下,分支限界法與回溯法的求解目標不同。回溯法 的求解目標是找出t中滿足約束條件的 所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解,或是在滿足約束條件的解中找出使某一目標函式值達到極大或極小的解,即在某種...

分支限界法

分支限界法 類似於回溯法,也是一種在問題的解空間樹t上搜尋問題解的演算法。但在一般情況下,分支限界法與回溯法的求解目標不同。回溯法 的求解目標是找出t中滿足約束條件的 所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解,或是在滿足約束條件的解中找出使某一目標函式值達到極大或極小的解,即在某種...

分支限界法

分支限界法 類似於回溯法,也是一種在問題的解空間樹t上搜尋問題解的演算法。但在一般情況下,分支限界法與回溯法的求解目標不同。回溯法 的求解目標是找出t中滿足約束條件的 所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解,或是在滿足約束條件的解中找出使某一目標函式值達到極大或極小的解,即在某種...