1. 定義:
分支限界算法是按照廣度優先的方式對解空間樹(狀態空間樹)進行搜索,從而求得最優解的算法。在搜索的過程當中,採用
限界函數(bound function)估算全部子節點的目標函數的可能取值,從而選擇使目標函數取極值(極大值或者極小值)的節點做爲擴展結點(若是限界值沒有超過目前的最優解,則剪枝)進行下一步搜索(重複
BFS -> 計算全部子節點限界 -> 選擇最優子節點做爲擴展結點的過程),從而不斷調整搜索的方向,儘快找到問題的最優解。
(
ps:回溯算法求出知足約束的全部可行解,分支限界求出知足約束的解中使得目標函數達到極值的最優解)
分支限界的思想相似於:圖的廣度優先搜索,樹的層序遍歷。
2. 分支限界算法和回溯算法的不一樣點:
(1)分支限界算法與回溯算法在
子結點的擴展方式上不一樣:
回溯通常採用輪流遍歷子節點的方式擴展結點。
分支限界則採用活結點的方式,一次性對全部的可行子節點進行擴展,估算子節點目標函數的可能值,若是該子節點的目標函數值差於當前最優解,則丟棄;不然將其加入活葉子表,依次從表中選取使目標函數取極值的節點做爲當前的擴展結點。重複這一過程,直到找到最優解。
(2)分支限界算法與回溯算法在
解空間樹的搜索方式上不一樣:
回溯採用
深度優先搜索的方式去搜索解空間樹。搜索過程當中,對全部的子節點輪流進行深度優先搜索,一旦發現有不知足約束的子節點,則對該子節點爲根的子樹進行剪枝;不然就從該子節點深度優先搜索,直到搜索到一個知足約束條件的葉子節點,即求得一個可行解。
分支限界採用
廣度優先搜索的方式去搜索解空間樹。搜索過程當中,先生成全部的子節點(分支),而後對全部分支計算一個函數值(限界),並根據這些函數值(計算出的上界或者下界),從中選擇一個使目標函數最優(限界最優)的子節點做爲擴展結點,使得搜索朝着最優解的方向快速推動,從而很快求得一個最優解。(
ps:個人理解是每次從全部子節點中找出一個最有潛力的,做爲擴展結點進行下一次的BFS)
3. 分支限界算法的通常步驟:
(1)將問題的解空間轉化爲圖或者樹的結構表示,維護一張活葉子表(能夠是優先隊列)。
(2)初始將根節點計算一個限界後加入活葉子表。
(3)當活葉子表不爲空時,
從活葉子表中取出一個限界最優的結點做爲擴展結點,並將該節點去除出表。當活結點表爲空時,算法結束。
(4)判斷當前的擴展結點是否能夠知足全部約束,而且獲得一個可行解(該擴展結點是葉子節點)。
若是是,判斷優於當前最優解後,記錄並更新最優解,隨後將當前最優解與全部活葉子節點的限界作比較,
對於限界差於最優解的活葉子結點,去除出活葉子表,並返回(3)。
若是不是,則進入(5)。
(5)計算擴展結點的全部子節點是否知足約束條件,對於不知足約束條件的子節點,將以該節點爲根的子樹剪枝(丟棄)。
(6)根據限界函數,計算該節點知足約束的全部子節點的限界。
對於限界差於當前最優解的子節點(ps:廢了,沒潛力),將以該子節點爲根的子樹丟棄;
對於限界優於當前最優解的子節點(
ps:還有潛力),
將這些潛力節點做爲活葉子結點添加到活葉子表,並返回(3)
(
ps:對於上述步驟的推導,參考了《算法分析與設計基礎》12.2 分支限界法 )
4. 分支限界算法應用的難點:
(1)解空間的構造,即狀態空間樹的構造方法(節點的生成順序)
(2)剪枝函數的肯定,即約束規則的肯定
(3)限界函數的肯定,邊界的評估方法
至於程序示例,最近有點忙,抽空寫。