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