http://en.wikipedia.org/wiki/Minimax佈局
棋盤遊戲的特色就是有比較簡單的規則(相對於複雜的世界來說),這些規則比較好用數學方式來描述,而且通常遊戲是你死我活的,不存在共贏的狀況。遞歸
最直接的方式是暴力的狀態空間的搜索,首先須要定義什麼是狀態,狀態包含哪些因素。遊戲
例如 tic-tac-toe這個遊戲,遊戲在 3*3的格子上面兩人交替 畫 X 和 O (邪惡),在某一行 某一列 對角線 上 同時三個相同則勝利。ip
例以下面 X 勝利。get
X X O數學
O X O基礎
X O X搜索
這個遊戲每個回合的狀態 包括的屬性有: 棋盤當前的棋子佈局, 棋盤上能夠下子的位置, 當前輪到誰來下子。遍歷
而模擬的過程就是 im
輸入: 當前狀態, 當前的下子玩家
遍歷 當前全部能夠下子的位置
拷貝一份當前狀態,修改狀態下子, 交換下子方
對拷貝的狀態進行 分析, 勝利,失敗,無地方可走? 若是還能走則 遞歸處理拷貝的狀態
可是上面的模擬過程沒有告訴咱們,當前狀態下,究竟該下哪一步呢?最簡單的方案,哪一步有勝利的但願就下那一步(通常會有多個可能性);
怎麼描述勝利的但願呢?
假設當前下子的是 X 同窗,
X同窗 試探全部的可能位置,尋找可能勝利的位置
接着該輪到O同窗下子, O同窗在X同窗下子的基礎上,尋找本身可能下子的位置。
那麼對於X同窗來說,開始就是要找到一個好的分支,這個分支O同窗勝利但願比較小。 可是問題是我沒試過這個分支,怎麼知道這個分支O同窗勝利但願比較小呢? 因此須要O同窗來告訴我 說這個分支O勝利比較小, X勝利比較大。
一樣對於O同窗, 在選擇分支的時候 須要X同窗告訴他 某個分支的狀況。
這種遞歸過程, 終止的條件就是棋盤下滿了,或者某一步出現了勝利條件。
所以整個評估過程是 自底向上的。
例如 假設有下面的下棋過程
X . . X O . X O . X O . X O .
. . . . . . . X . O X . O X .
. . . . . . . . . . . . . . X
X勝利了, 那麼 從最後一步向前分析就是:
倒數第二步 O 下子在 第二行 第一列 的 對於O的估值是 -1(失敗) 對於 X 來說是 1(勝利)
倒數第三步 X 下子在 2行 2列的 對X 估值是 1 對 O 估值是 0
倒數第4步 O 下子 2行 1列 O 估值 -1 X估值 1
倒數第5步 X 下子 1行 1列 X估值 1 O 估值 -1
ok, 上面的估值 能夠看到對X O 的估值是 相反數 和是0, 這也就是 0和遊戲的意思。 你死 = 我勝
可是問題是, 咱們對X下子 1行 1列的估值 只考慮了一種狀況, 就是上面下子的狀況, 沒有考慮 其它狀況,沒有考慮O會按照咱們設定的方案來走麼?
顯然不會,O同窗也會估計形勢, 選擇 當前最利於本身的方案來走, 因此第4步 O同窗不會選擇 2 行 1列, 而是 2行2列。
整個棋盤的 狀態空間 構成一棵 層層深刻的樹
X 選擇9種可能
X 選擇 1 X選擇 2 X選擇3 X選擇 4 。。。。。X選擇8
假設咱們對全部節點的估值都是相對於X來說的。
好比咱們是 X 則 X須要最大估值, max (child)
而每一個子節點 是 輪到O選擇, O要獲得 本身最大估值 對X最小估值 min(child)
整棵樹 共享了一個信息,即當前的估值是相對於誰的,也就是樹的根節點是誰,有了這個信息,咱們才能正確的給上層返回合理的值。