我明白殺手啓發式背後的想法以及爲什麼它有幫助。我正在努力的是如何在Alpha-Beta搜索例程中實現它。特別是如何確保只有兄弟節點的殺手動作首先被試用?僞代碼將非常有幫助。在國際象棋的Alpha-Beta搜索中實現殺手啓發式
3
A
回答
2
在搜索樹的許多部分,殺手級動作很可能是一個很好的駁斥動作。所以嘗試殺手爲其他職位移動可能是一個好主意。
你可能會有不同數量的殺手移動每層,並在進入(層)時清除陣列(層+ 1),這會給你一個'兄弟姐妹'殺手。我想說,'+1'偏移量就像一個參數來調整:嘗試清除數組(ply + N),而不是看看性能是最好的(我想增加N會改善事情)。順便說一下,對發動機性能的評估是一項耗費大量資源的任務:通常發動機試圖解決一個測試套件,或者兩個具有不同參數的發動機正在進行比賽(比賽應該足夠長,例如100遊戲)之間來確定哪個更好。
4
我將討論實施。爲了讓兄弟節點的殺手的動作,用一個方案這樣
killerMoves[ply][slot]
其中ply
是從根部的距離(不搜索的深度)和slot
是殺手的數量移動你想要的。這確保了兄弟節點首先被嘗試,因爲兄弟節點處於同一層。
要在獲得beta臨界值時插入殺手移動,可以將給定層的移動移至右側,可能會丟棄舊移動,然後插入新移動。通常情況下,當殺手通過其他機制訂購時,您不會存儲捕獲或散列移動。
for (int i = killerMoves[ply].Length - 2; i >= 0; i--)
killerMoves[ply][i + 1] = killerMoves[ply][i];
killerMoves[ply][0] = move;
現在,當您執行移動排序(通過移動列表迭代前),就可以判斷此舉是否是招殺手鐗:
for (int slot = 0; slot < killerMoves[ply].Length; slot++) {
int killerMove = killerMoves[ply][slot];
for (int i = 0; i < movesCount; i++)
if (moves[i] == killerMove) {
// moves[i] is a killer move so move it up the list
break;
}
}
你並不需要清除殺手移動對於一個層或類似的東西,因爲很可能殺手的移動是在同一層上出現的一系列相似位置上的很好的移動。
由於其他答案帶來了它,因此您可能不需要執行嚴格的測試,因爲這個殺手啓發式在理論上是合理的。您可以嘗試使用的殺手移動次數(2或3是常態)以及相對於其他良好移動(如捕獲)的順序。
相關問題
- 1. 國際象棋:獲得所有合法國際象棋棋子
- 2. 「跟隨國際象棋」直播國際象棋遊戲如何?
- 3. 沒有出現在國際象棋棋盤上的圖像 - PHP
- 4. 電腦國際象棋搜索的藝術狀況如何?
- 5. 平行國際象棋搜索的共享哈希表
- 6. 爪哇國際象棋
- 7. 國際象棋negamax功能
- 8. Java國際象棋桌
- 9. 國際象棋棋盤人口
- 10. 國際象棋棋盤代表 - 引擎
- 11. 0x88國際象棋棋盤代表
- 12. 國際象棋棋局職位
- 13. Java主教國際象棋棋盤
- 14. 在android中設計國際象棋
- 15. 在Java中建立國際象棋板
- 16. 實現minimax和alpha beta算法的國際象棋
- 17. 如何用RESTful API實現與backbone.js的國際象棋?
- 18. C中的國際象棋引擎
- 19. JavaScript中的國際象棋遊戲
- 20. XNA中的國際象棋邏輯
- 21. 這款國際象棋遊戲如何實現?
- 22. 在線國際象棋由VB.net
- 23. Java在線國際象棋遊戲
- 24. ASP.NET MVC中的國際象棋(如何在這裏實現M-V-C)
- 25. 在wxpython中建模國際象棋棋盤
- 26. 在Android中創建一個國際象棋棋盤
- 27. 在國際象棋比賽中成爲國王的地方
- 28. 用於GAE的國際象棋AI爲
- 29. 使用Asp.net的國際象棋引擎
- 30. 使用FPGA的國際象棋引擎
100場?!爲了獲得良好的錯誤界限,你需要成千上萬的遊戲...... – Zong