最近在寫乙個棋類博弈演算法,總結一下用到的搜尋演算法
博弈樹一般的搜尋是單一物件的,就像乙個人在房間裡尋找任務物品,只要找到了就贏了。
而棋類博弈用到的是對抗性博弈,有兩方,兩人在房間裡尋找任務物品,誰先找到誰贏。
跟普通的搜尋樹不同,博弈樹的每一層代表一方的走法,他們是交替的,代表甲方走法的子節點是乙方的走法。
博弈樹是從根部向下遞迴產生的一顆包含所有可能的對弈過程的完全搜尋樹。
令甲勝的局面值為win,乙勝的局面值為lost,平局為draw。輪到甲走時,甲肯定會選擇節點值為win或者draw的,
輪到乙走時,乙肯定會選擇節點值為lost或者draw的。
極大極小演算法
建立整顆搜尋樹,因為棋局涉及到的狀態轉換數量及其大,這是不可能的。
所以我們考慮用具體的值來表示局面值win,lost,draw,例如甲勝為+∞,乙勝為-∞,和局為0。
甲希望得到極大值,乙希望得到極小值。
int minmax(position p, int depth)
return bestvalue;
}
紅色是甲方,它希望得到評估值中最大的值,黑色是乙方,它希望得到最小的值。
負極大值演算法
檢查哪一方是紅方要取最大值有一點麻煩,所以對極大極小演算法做了一點優化。
int negamax(position p, int depth)
return bestvalue;
}
雙方都取極大值,但因為負數的性質,有一方取到的是負極大值,也就是極小值。
alpha-beta剪枝
可以剪去一些用不著的狀態分支。
比如
int alphabeta(int nply, int alpha, int beta)
return alpha;
}
A 搜尋演算法
啟發式搜尋演算法 要理解 a 搜尋演算法,還得從啟發式搜尋演算法開始談起。所謂啟發式搜尋,就在於當前搜尋結點往下選擇下一步結點時,可以通過乙個啟發函式 來進行選擇,選擇代價最少的結點作為下一步搜尋結點而跳轉其上 遇到有乙個以上代價最 少的結點,不妨選距離當前搜尋點最近一次展開的搜尋點進行下一步搜尋 ...
A 搜尋演算法
a 演算法是基於bfs的一種入門級啟發式搜尋演算法,就是將bfs的佇列改為基於估價的優先佇列,可以快速地找到答案。優先隊列為小根堆 while 優先佇列不為空 取出隊頭並擴充套件 將擴充套件節點以估價值 當前值為優先順序入隊 endwhile估價函式越接近真實值演算法越優,但一定不能大於真實值,否則...
搜尋演算法小結
搜尋演算法是利用計算機的高效能來有目的的窮舉乙個問題的部分和所有的可能情況,從而求出問題的解的一種方法。常用的搜尋演算法有 一.回溯法 回溯演算法是所有搜尋演算法中最為基本的一種演算法,其採用了一種 走不通就掉頭 思想作為其控制結構,其相當於採用了先根遍歷的方法來構造解答樹,可用於找解或所有解以及最...