• 沒有找到結果。

加速搜尋方式

在文檔中 麻將之人工智慧研究 (頁 31-34)

第二章、 麻將人工智慧設計

2.4 加速搜尋方式

2.4 加速搜尋方式

本節首先在 2.4.1 節描述我們想要加速搜尋的原因,並使用預先 建表的方式,快速取得萬、索、筒牌的資訊。在 2.4.2 節說明在決定 捨牌時,我們可根據不同種類的牌分等級去決策。

2.4.1 預先建立牌數對應表

在上節我們介紹過計算上聽數時,我們必須同時擁有「此種類牌 包含眼牌的資訊」及「此種類牌不包含眼牌的資訊」,經由多種組合 方式,才能取得實際的上聽數。

我們在遊戲後期,找不到安全牌的狀況下,選擇 Monte-Carlo 來 模擬遊戲的進行,而四家玩家的捨牌策略仍是依照原來的 AI,因此,

若能增快捨牌的決定速度,就能模擬出更多種的牌局狀況,讓模擬的 結果更加準確。

在搜尋萬、索、筒類的有效牌資訊時,我們是使用遞迴的方式去 搜尋,然而,實際上我們能把這些搜尋動作,預先計算出所有狀況儲 存起來,隨著不同的手牌,經由查表的方式取得有效牌資訊。

麻將每張牌都有四張,因此,我們同時最多取得 4 張,可將擁有 的牌數分為 0、1、2、3 及 4 張牌五種狀況,而萬、索、筒類都是由 數字 1~數字 9 構成,總共有 5^9 = 1,953,125 個,且每份資料為

11bytes,因此,建出的表約為 23MB。

由於所見的表並不大,因此,我們可在程式啟動時,就將這份表 讀到記憶體中,之後,每一次需要取得有效牌資訊時,只需將手牌中 該類牌轉成對應的 Index,即可快速取得結果,相較於原本每次使用 遞迴搜尋,預先建表可大幅提昇搜尋速度,我們會在第四章節列出實 驗數據。

如圖 2-12,我們先計算手牌中的萬字牌,包含一萬 * 2、二萬、

三萬及四萬,這時我們將手牌轉成對應的 Index,即可取得有效牌資 訊,同理而言,索、筒牌也可以使用相同的方式取得。

字牌只可能組成刻子,因此,不需透過查表,根據手牌狀況直接 計算即可取得有效牌資訊,最後,我們將四種種類的牌做組合,計算 出上聽數和有效牌分數。

圖 2-12 將手牌該類牌轉換成對應的 Index,即可快速取 得有效牌資訊。

2.4.2 捨牌分階層搜尋

決定捨牌是麻將遊戲很重要的一環,不論是摸牌、吃牌、碰牌或 槓牌,最終都需要選擇一張牌來捨牌,適宜地捨牌不但能快速的減少 上聽數,尤其到了遊戲中後期,如何能避開放槍更是重要的決策。

不考慮安全牌的狀況下,我們想知道哪張捨牌可以得到最小的上 聽數,我們只需每次丟出一張手牌,然後把剩餘的手牌結果計算並紀

錄,這樣就可以確切的知道丟哪張牌最有利;然而,實際上我們並不 需要測試所有的牌,對於已經完成組的三張牌,拆這三張牌一定會增 加上聽數,因此,我們可以跳過檢查這些已完成組的牌。

參考實際玩家打牌的經驗,依據牌的有效性分層級,層級越低的 越優先捨棄。孤張字牌只能與本身相同的牌才能湊成一組,因此,未 來湊成完整一組的機會較小,屬於第一層級;接著,孤張萬、索、筒 若在之後拿到鄰近的牌可湊成搭子,相較孤張字牌有較大的機會湊成 一組,屬於第二層級;最後,在找不到孤張牌的狀況下,才考慮去拆 搭子,拆不同搭會得到不同的有效牌分數,選擇有效牌分數最高的方 式捨牌,因此,我們可以把需要檢查的牌分為下面三類:

1. 孤張字牌

2. 孤張萬、索、筒 3. 搭子

在文檔中 麻將之人工智慧研究 (頁 31-34)

相關文件