Problem
在縮小版本國際象棋中,兩個人只能操控士兵 (Pawn),其中白色先手並且位於棋盤下方,操控棋子為大寫 P,黑色後手為小寫 p。
士兵在移動時,只能往敵方軍營前進,只能往前一步走到空的,或者是吃掉對方斜著走。也就是當敵方在斜角時才能往斜角走。
將對方逼得無路可走時 (全滅),或者是我方棋子抵達對方底線時遊戲宣告結束。請問白色先手最少要幾步才能獲勝?
Sample Input
|
|
Sample Output
|
|
Solution
一種很傳統的博弈問題,一般而言對於劃分狀態最小化即可。但是效率會很差,因為狀態分化的太多,必須走訪所有的狀態才能知道結果。基於這一點,有了 alpha-beta 剪枝,但這種剪枝相當依賴走訪順序,因此也不保證是比較好的搜索,但已經提供相當不錯的思路。
pruning 中文翻譯:修剪
alpha-beta pruning
主要為博弈剪枝用,求最少步數獲勝 (對於是否必勝的判斷在效率上有待考量。)
策略
假設 [999, -999] 作為步數的決策 (用實際數值來假設)
- 正數表示先手必勝的步數,越大表示需要的步數越少,
- 負數表示後手必勝的步數,越小表示需要的步數越少。
根據博弈的遞迴寫法,步數從深度 999 往下找,先手要最大化其結果 (最後最少步數用 999 - 結果),後手要最小化其結果 (最後最少步數用 999 + 結果)。分層討論的話,就是取最大 - 取最小 - 取最大 … 交錯。
我們把已知的兩個結果做討論,定義當前搜索過程中得到的 alpha 是先手最佳化,beta 是後手最佳化。
父節點會將已經找到的部分解傳遞給孩子繼續搜索,假使父親是取最大值,還是則都是要取最小值,如果其中一個孩子的最小值 p 已知,另一個孩子搜索到一半時,發現其中它的孩子回傳 q < p,其實可以放棄搜索,因為這一層還要取最小,隨後回父親要取最大,不可能比 p 還要大。直接放棄 son 的所有分支搜索。
|
|
發現思路其實相當簡單,關鍵在於如何表示最小化、最大化之間對於博弈的定義。
|
|