棋盤遊戲中的AI人工智能(一)

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)

整棵樹 共享了一個信息,即當前的估值是相對於誰的,也就是樹的根節點是誰,有了這個信息,咱們才能正確的給上層返回合理的值。

相關文章
相關標籤/搜索