1. 程式人生 > 其它 >minimax Minimax演算法,極小化極大演算法

minimax Minimax演算法,極小化極大演算法

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