在當前節點(擴充套件節點)處,先生成其所有的兒子節點(分支),然後再從當前的活節點(當前節點的子節點)表中選擇下乙個擴充套件節點。為了有效地選擇下乙個擴充套件節點,加速搜尋的程序,在每乙個活節點處,計算乙個函式值(限界),並根據函式值,從當前活節點表中選擇乙個最有利的節點作為擴充套件節點,使搜尋朝著解空間上有最優解的分支推進,以便盡快地找出乙個最優解。分支限界法解決了大量離散最優化的問題。
1.佇列式(fifo)分支限界法
佇列式分支限界法將活節點表組織成乙個佇列,並將佇列的先進先出原則選取下乙個節點為當前擴充套件節點。
2.優先佇列式分支限界法
優先佇列式分支限界法將活節點表組織成乙個優先佇列,並將優先佇列中規定的節點優先順序選取優先順序最高的下乙個節點成為當前擴充套件節點。如果選擇這種選擇方式,往往將資料排成最大堆或者最小堆來實現。
有一批共n個貨櫃要裝上2艘載重量分別為c1,c2的輪船,其中貨櫃i的重量為wi,且要求確定是否有乙個合理的裝載方案可將這n個貨櫃裝上這2艘輪船。
可證明,採用如下策略可以得到乙個最優裝載方案:先盡可能的將第一艘船裝滿,其次將剩餘的貨櫃裝到第二艘船上。
**如下:
1演算法maxloading的計算時間和空間複雜度為o(2^n).//分支限界法解裝載問題23
//子函式,將當前活節點加入佇列
4 template
5void enqueue(queue&q, type wt, type &bestw, int i, int
n) 6
11else q.add(wt) ; //
非葉結點12}
1314
//裝載問題先盡量將第一艘船裝滿
15//
佇列式分支限界法,返回最優載重量
16 template
17 type maxloading(type w,type c,int
n)1842}
43 }
上述演算法可以改進,設r為剩餘貨櫃的重量,當ew+r<=bestw的時候,可以將右子樹剪去。因為最優值不可能出現在下面了。
改進**如下:
1分支限界法解決了大量離散最優化問題。//分支限界法解裝載問題23
//裝載問題先盡量將第一艘船裝滿4//
佇列式分支限界法,返回最優載重量
5 template
6 type maxloading(type w,type c,intn)7
2627
//將右兒子新增到佇列
28if(ew+r>bestw&&i
29q.add(ew);
30 q.delete(ew); //
取下乙個節點為擴充套件節點並將重量儲存在ew
31if(ew==-1) //
檢查是否到了同層結束
3239
}40 }
分支界限法演算法
支限界法思路的簡單描述是 把問題的解空間轉化成了圖或者樹的結構表示,然後使用廣度優先搜尋策略進行遍歷,遍歷的過程中記錄和尋找所有可行解或者最優解。類似於回溯法,也是一種在問題的解空間樹t上搜尋問題解的演算法。但在一般情況下,分支限界法與回溯法的求解目標不同。回溯法的求解目標是找出t中滿足約束條件的所...
演算法分析 分支界限法
二 分支限界法的一般過程 由於求解目標不同,導致分支限界法與回溯法在解空間樹t上的搜尋方式也不相同。回溯法以深度優先的方式搜尋解空間樹t,而分支限界法則以廣度優先或以最小耗費優先的方式搜尋解空間樹t。分支限界法的搜尋策略是 在擴充套件結點處,先生成其所有的兒子結點 分支 然後再從當前的活結點表中選擇...
008 演算法 分支界限法
一 概念 與貪婪法一樣,這種方法也是用來為組合優化問題設計求解演算法的,所不同的是它在問題的整個可能解空間搜尋,所設計出來的演算法雖然時間複雜度比貪婪演算法高,但它的優點是與窮舉法類似,都能保證求出問題的最佳解,而且這種方法不是盲目的窮舉搜尋,而是在搜尋中通過界限,可以中途停止對某些不可能得到的最優...