淺談分支限界算法


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)限界函數的確定,邊界的評估方法
 
至於程序示例,最近有點忙,抽空寫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM