問題描述:
印刷電路板不限區域劃分成n*m個方格陣列。如下圖所示
精確的電路佈線問題要求確定連線方格a的中點,到連線方格b的中點的最短佈線方案。
佈線時,電路只能沿直線或直角佈線。為了避免線路相交,已佈的線的方格做了封鎖標記,其他線路不允許穿過被封鎖的方格。
分支限界法的解決方案:
首先,從起始位置a開始,將它作為第乙個擴充套件結點。與該節點相鄰,並且可達的方格成為可行結點被加入到活節點佇列中,並且將這些方格標記為1.
即從起始方格a到這些擴充套件方格距離為1.
然後,從活節點佇列中取出隊首結點作為下乙個擴充套件結點,並將於當前擴充套件結點相鄰且為未標記過的方格標記為2,並存入或節點佇列。
最後,這個過程一直到演算法搜尋到目標方格b或活結點隊列為空時截止。
實現方案:
初始定義position,私有變數row,col,顯示方格 行 列。
grid[i][j]表示方格陣列的0 : 開放, 1 :封鎖。
2個方格相同,則不必計算,直接返回最小距離。
否則,設定方格圍牆,初始化位移矩陣offset。
表示距離時,0,1已經使用,直接從2開始。因此所有距離最後都要減2.
演算法描述
bool findpath(position start,position finish,int& pathlen,position * &path)posted @//設定方格陣列的圍牆
for(int i=0;i<=m+1;i++)
for(int i=0;i<=n+1;i++)
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 numofnbs = 4;//
相鄰方格數
position here,nbr;
here.row =start.row;
here.col =start.col;
grid[start.row][start.col] = 2
;
//標記可達方格的位置
linkedqueueq;
do }
//是否到達目標位置finish?
if((nbr.row==finish.row)&&(nbr.col ==finish.col))
breakp;
//完成佈線
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--)
here = nbr;//
向前移動
}
return
true
;}
2012-11-06 10:41
xingoo 閱讀(
...)
編輯收藏
佈線問題 分支限界法
佈線問題就是在 m n 的方格陣列中,指定乙個起點 a 乙個終點 b,要求找到起點到終點的最短佈線方案 最短路徑 搜尋從起點 a 開始,到目標點 b 結束。約束條件 有邊相連且未成佈線。搜過過程 從起點 a 開始,將其作為乙個擴充套件結點,沿 a 的上 下 左 右 4 個方向的相鄰結點擴充套件。判斷...
佈線問題 分支限界法
問題描述 印刷電路板不限區域劃分成n m個方格陣列。如下圖所示 精確的電路佈線問題要求確定連線方格a的中點,到連線方格b的中點的最短佈線方案。佈線時,電路只能沿直線或直角佈線。為了避免線路相交,已佈的線的方格做了封鎖標記,其他線路不允許穿過被封鎖的方格。分支限界法的解決方案 首先,從起始位置a開始,...
佈線問題 分支限界法c 實現
問題描述 印刷電路板不限區域劃分成n m個方格陣列。如下圖所示 分支限界法類似於回溯法,也是在問題的解空間上搜尋問題的解的演算法。分支限界法是找出滿足約束條件的乙個解或者滿足某種條件的最優解。分支限界法則以廣度優先或者最小耗費優先的方式搜尋解空間。其搜尋策略是 1 在擴充套件結點處,先生成其所有的兒...