問題描述
印刷電路板不限區域劃分成n*m個方格陣列。如下圖所示
分支限界法類似於回溯法,也是在問題的解空間上搜尋問題的解的演算法。分支限界法是找出滿足約束條件的乙個解或者滿足某種條件的最優解。分支限界法則以廣度優先或者最小耗費優先的方式搜尋解空間。
其搜尋策略是:
1、在擴充套件結點處,先生成其所有的兒子結點,然後再從當前的活結點表中選擇下乙個擴充套件結點。
2、為了加速搜尋的程序,在每乙個活結點處,計算乙個函式值,並根據函式值,從當前活結點表中選擇乙個最有利的結點作為擴充套件結點,使搜尋朝著最有利的分支推進。
分支限界的思想主要體現在第二點上。
從活結點表中選擇下乙個擴充套件結點的不同方式導致不同的分支限界法,最常見的有以下兩種
佇列式分支限界法 優先佇列式分支限界法
演算法描述
bool findpath(position start,position finish,int& pathlen,position * &path)
//設定方格陣列的圍牆
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;
//標記可達方格的位置
linkedqueue q;
dohere = nbr;//向前移動
}return true;
}下面結合佈線問題來體會分支限界的思想:**
李超的參考
演算法實現
#include
#include
using namespace std;
//表示方格上位置的結構體
struct position
;//分支限界演算法
bool findpath(position start,position finish,int& pathlen,position *&path,int **grid,int m,int n)
//設定方向移動座標值:東、南、西、北
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 numneighblo=4;
position here,nbr;
//設定當前方格,即搜尋單位
here.row=start.row;
here.col=start.col;
//由於0和1用於表示方格的開放和封鎖,故距離:2-0 3-1
grid[start.row][start.col]=0;
//佇列式搜尋,標記可達相鄰方格
queue q_findpath;
dohere=nbr;
}return true;
}int main()
//初始化棋盤格
for(int i=1; i <= m; i++)
}//設定方格陣列的圍牆
for(int i=0; i<=n+1; i++)
grid[0][i]=grid[m+1][i]=-2;//上下的圍牆
for(int i=0; i<=m+1; i++)
grid[i][0]=grid[i][n+1]=-2;//左右的圍牆
cout<>ci>>cj;
if(ci>m||cj>n)
{cout<
佈線問題 分支限界法
佈線問題就是在 m n 的方格陣列中,指定乙個起點 a 乙個終點 b,要求找到起點到終點的最短佈線方案 最短路徑 搜尋從起點 a 開始,到目標點 b 結束。約束條件 有邊相連且未成佈線。搜過過程 從起點 a 開始,將其作為乙個擴充套件結點,沿 a 的上 下 左 右 4 個方向的相鄰結點擴充套件。判斷...
佈線問題 分支限界法
問題描述 印刷電路板不限區域劃分成n m個方格陣列。如下圖所示 精確的電路佈線問題要求確定連線方格a的中點,到連線方格b的中點的最短佈線方案。佈線時,電路只能沿直線或直角佈線。為了避免線路相交,已佈的線的方格做了封鎖標記,其他線路不允許穿過被封鎖的方格。分支限界法的解決方案 首先,從起始位置a開始,...
佈線問題 分支限界法
問題描述 印刷電路板不限區域劃分成n m個方格陣列。如下圖所示 精確的電路佈線問題要求確定連線方格a的中點,到連線方格b的中點的最短佈線方案。佈線時,電路只能沿直線或直角佈線。為了避免線路相交,已佈的線的方格做了封鎖標記,其他線路不允許穿過被封鎖的方格。分支限界法的解決方案 首先,從起始位置a開始,...