分支限界法類似與回溯法,也是一種在問題的解空間樹上搜尋問題的解法。但後者的目標是找到滿足約束條件的所有解,而前者要求找到某種意義下的最優解(極大值、極小值)。
分支限界法採用廣度優先的策略,依次搜尋活結點的所有分支,也就是所有相鄰結點。
設計合適的限界函式,排除該活結點不可能產生最優解的孩子結點,來提高搜尋效率。
組織活結點表,可採用佇列式分枝限界法和優先佇列式分枝限界法。
(1)佇列式:
a.將根結點加入活結點佇列
b.從活結點隊中取出隊頭結點,作為當前擴充套件結點
c.對當前擴充套件結點,從左到右的產生它的所有孩子結點,用約束條件檢查,把所有滿足約束條件的孩子結點加入活結點佇列
d.重複步驟b和c,直到找到乙個解或活結點隊列為空為止
(2)優先佇列式:
與(1)相似,每次先計算起始結點的優先順序再將它加入優先佇列
確定最優解的解向量
方法一:對每個擴充套件節點儲存從根節點到該結點的路徑
方法二:在搜尋過程中構建搜所經過的樹結構,利用雙親結點指標來實現對該樹結構的儲存
定義乙個二維陣列,例如:
int maze[5][5] = ;
它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。
輸入格式:
乙個5 × 5的二維陣列,表示乙個迷宮。資料保證有唯一最短路徑。
輸出格式:
左上角到右下角的最短路徑,格式如樣例所示。
輸入樣例:
0 1 0 0 0輸出樣例:0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
(0, 0)構建dot結構體用來存放每個點的資訊,包括該點當前標號n(取值為0~24),當前點的值num(0或1),當前路徑已經有的點數count(包含本點)以及用來儲存當前路徑經歷的點的標號的陣列temp。(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
構建dot結構體的佇列queue,完成對初始化佇列函式initqueue()、進隊函式push()和出隊函式pop()的編寫。
編寫getans函式用來獲得答案,答案儲存在全域性變數ans[25]和minnum中,其中ans[25]中儲存了結果路徑經歷的點的值,minnum儲存了最終得到路徑上點的個數。
getans(queue *q,dot d,int pos)
if(pos/5!=4&&d[pos+5].num!=1)
if(pos/5!=0&&d[pos-5].num!=1)
if(pos%5!=0&&d[pos-1].num!=1)
}
分支限界法按廣度優先策略搜尋問題的解空間樹,在搜尋過程中,對待處理的結點根據限界函式估算目標函式的可能取值,從中選取使目標函式取得極值(極大或極小)的節點優先進行廣度搜尋,從而不斷調整搜尋方向,盡快找到問題的解。
由於限界函式一般基於問題的目標函式決定,因此,分支限界法適用於求解最優解問題或者較小代價找出滿足條件的答案解。
迷宮問題 分支限界法
分支限界法求解迷宮問題 定義乙個二維陣列,例如 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。乙個5 5的二維陣列,表示乙個迷宮。資料保證有唯一最短路徑。左上角到右下角的最短路徑,格式如樣例...
C 分支限界法求解揹包問題
1.beibao.h檔案 如下 ifndef beibao h define beibao h include 子空間中節點型別 class bbnode bbnode class heapnode heapnode int compareto heapnode o class element el...
分支限界法求解01揹包問題
使用優先佇列,求最大價值 首先按照價效比排序 bound函式表示當前狀態之後的選擇都是理想的,這樣能到達的理想最大值 每個節點儲存物品在樹中的層次,表示已經對多少個物品做出了選擇,當前狀態放入揹包的總價值和重量。include using namespace std const int n 110 ...