剪枝技術(Pruning)#

剪枝是提升搜尋效率的關鍵策略,通過提前捨棄無效或劣質分支,大幅減少搜尋空間。

為什麼需要剪枝?#

現實問題的狀態空間往往呈指數級增長。純粹的 BFS/DFS 會走訪所有節點,計算成本無法負荷。剪枝的本質是優勝劣汰:提前捨棄那些明顯較差或無效的分支。

剪枝的運作邏輯#

當搜尋進行到某個節點時(例如面臨 50 個分支):

  1. 確定性剪枝:若能確定最優解只存在於某分支,直接捨棄其他
  2. 優先順序剪枝:優先搜尋「區域最優」的分支,較差的延後或捨棄

常見剪枝策略#

策略說明應用場景
可行性剪枝當前狀態已違反約束N 皇后、數獨
上下界剪枝當前路徑成本已超過已知最優Alpha-Beta 剪枝
對稱性剪枝左右對稱只需搜一邊排列組合問題
常識剪枝基於領域知識排除明顯劣解棋類遊戲

案例:井字棋的剪枝思維#

人類下棋時自然會進行剪枝:

當對手落子於某位置後,你不會再考慮「對手下在其他位置」的分支。這就是最自然的剪枝——根據已知事實,剪掉不可能的未來

從深藍到 AlphaGo#

國際象棋(深藍,1996)#

  • 方法:強大計算力 + 精細剪枝規則
  • 搜尋深度:30-40 步
  • 複雜度:約 10^123

圍棋(AlphaGo,2016)#

  • 方法:深度學習 + 蒙特卡洛樹搜尋
  • 創新:神經網路充當「智慧剪枝函式」
  • 複雜度:約 10^360

從西洋棋到圍棋,本質上是對抗「狀態空間爆炸」。當無法窮盡所有變化時,演算法重心從「算得快」轉向「剪得準」。

棋類遊戲複雜度排行#

遊戲博弈樹複雜度
圍棋 (19x19)10^360
日本將棋10^220
中國象棋10^150
國際象棋10^123

剪枝的難點#

剪枝的難點在於評估函式的設計

  • 剪得太狠:可能漏掉全域最優解
  • 剪得太少:起不到優化效果

這需要對具體業務邏輯有深刻理解。

實戰啟發式規則#

以象棋為例:

  • 開局剪枝:沒人第一步移老帥,這種「傻步」直接剪掉
  • 價值交換:用車(高價值)換馬(低價值)通常不划算,賦予低優先順序
  • 歷史啟發:之前產生過好結果的走法,優先嘗試