minimax Minimax演算法,極小化極大演算法
阿新 • • 發佈:2021-06-16
minimax Minimax演算法,極小化極大演算法
參考:https://baike.baidu.com/item/極小化極大演算法/1351828?fromtitle=Minimax演算法&fromid=3876233&fr=aladdin
Minimax演算法(亦稱 MinMax or MM)又名極小化極大演算法,是一種找出失敗的最大可能性中的最小值的演算法
- 介紹
Minimax演算法常用於棋類等由兩方較量的遊戲和程式。該演算法是一個零總和演算法,即一方要在可選的選項中選擇將其優勢最大化的選擇,另一方則選擇令對手優勢最小化的方法 。而開始的時候總和為0。很多棋類遊戲可以採取此演算法,例如井字棋(tic-tac-toe)。 - 基本演算法思想
極小化極大(minimax)演算法顧名思義,就是讓最大得情況最小,這裡的最大一般是指最差的情況,比如遊戲中最不利的情況。
該演算法需要滿足零和博弈,初略的解釋就是若有兩個玩家進行遊戲,如果其中一方得到利益那麼另一方就會失去利益,遊戲利益的總和為0(某些情況下為常數)。
因此,零和的約束條件也使得該演算法在很多遊戲中圖體現出很好的效果,比如大多數的棋類遊戲。
其實說白了,這個演算法就是一個樹形結構的遞迴演算法,每個節點的孩子和父節點都是對方玩家,所有的節點被分為極大值(我方)節點和極小值(對方)節點。 - 演算法優化
- α-β剪枝演算法
在上述的極大極小演算法中,MIN和MAX過程將所有的可能性省搜尋樹,然後再從端點的估計值倒推計算,這樣的效率非常低下。而α-β演算法的引入可以提高運算效率,對一些非必要的估計值進行捨棄。其策略是進行深度優先搜尋,當生成結點到達規定深度時,立即進行靜態估計,一旦某一個非端點的節點可以確定倒推值的時候立即賦值,節省下其他分支拓展到節點的開銷。 - 剪枝規則:
(1)α剪枝,任一極小層節點的β值不大於他任一前驅極大值層節點的α值,即α(前驅層)≥β(後繼層),則可以終止該極小層中這個MIN節點以下的搜尋過程。這個MIN節點的倒推值確定為這個β值。
(2)β剪枝,任一極大層節點的α值不小於它任一前驅極小值層節點的β值,即β(前驅層)≤α(後繼層),則可以終止該極大值層中這個MAX節點以下的搜尋過程。這個MAX節點的倒推值確定為這個α值。
- α-β剪枝演算法
程式碼
[minimax.py]{..\src\backtracking\minimax.py}
""" Prepare 1. sys.path 中增加 TheAlgorithms\src 子模組 """ import sys sys.path.append('E:\dev\AI\TheAlgorithms\src')
案例一:
nodeIndex是當前節點在scores[]中的索引。
如果move是maximizer返回true否則返回false
遊戲樹的葉子儲存在scores中[]
高度是遊戲樹的最大高度
def minimax(
depth: int,
node_index: int,
is_max: bool,
scores: List[int],
height: float
) -> int:
from backtracking.minimax import minimax
import math
"""
"""
depth, node_index,is_max = 0,0,True
scores = [90, 23, 6, 33, 21, 65, 123, 34423]
height = math.log(len(scores), 2)
print(f'height :{height}')
print("Optimal value : ", end="")
# print(minimax(0, 0, True, scores, height))
print(minimax(depth, node_index, is_max, scores, height))
height :3.0
Optimal value : 65