第二章、 麻將人工智慧設計
2.3 搜尋
本節首先在 2.3.1 節描述分析手牌時,遞迴搜尋的方式。在 2.3.2 節說明不同種類的牌可獨立搜尋。最後在 2.3.3 節介紹將不同種類牌 組合在一起時,決定不同的眼牌會對上聽數造成的影響。
2.3.1 遞迴搜尋
當我們決定捨牌的時候,這時會依據捨棄哪張牌能有最小的上聽 數為判斷準則,因此,為了計算不同牌組的上聽數,先去計算手牌裡 的組數和搭數,我們使用遞迴的方式去搜尋,將同一副手牌做不同的 分割,並依照表 2-2 的規則來做遞迴搜尋。
種類 例子
順 一二三萬
刻 一一一萬
中洞搭 二四萬
連續搭 二三萬
對搭 二二萬
孤張 一萬
表 2-2 彼此有關聯性的牌。
如圖 2 - 6,假設我方萬字牌為一萬兩張、二萬、三萬及四萬,
由萬字牌最小的數字開始搜尋,將符合規則的取出綁在一起,第一層 的所有組合包括一二三萬、一二萬、一三萬、一一萬及一萬孤張,剩 餘未被框起來的為未處理的牌,接著再繼續往下搜尋,直到所有的牌 都被分類,以這個例子來說,一一萬及一二三萬可完成一組一搭,為 最好的組合方式。
圖 2-6 遞迴搜尋得到最大的組數和搭數。
2.3.2 單一種類牌獨立搜尋
若是我們將手牌整個展開來,會建造出如圖 2-7(a)的樹,而其
中包含許多重複的計算,因此,我們依據玩家實際的打牌觀念,將不 同種類的牌分開來考慮,各自計算出組數和搭數如圖 2-7(b),再做 組合取得最小的上聽數。
圖 2-7(a) 按照萬、索、筒、字牌順序 搜尋下來,完全展開樹。
圖 2-7(b) 將各花色牌分開計算再做結合。
我們將各種類牌獨自計算的組數和搭數做結合,加總已完成的組 數及有機會成為組的搭數,推算上聽數。如圖 2-8 萬子牌可組成 1 組、
1 搭,索子牌可組成 2 搭,筒子牌可組成 2 搭,字牌可組成 1 組,可 推算上聽數為 2 上聽。
萬子可組成 1 組、一搭(或當眼) 索子可組成 2 搭
筒子可組成 2 搭
字牌可組成 1 組
圖 2-8 結合各種類的牌可得上聽數為 2。
2.3.3 不同種類牌組合與眼牌的關係
我們在實作 AI 時,實際發現一些較複雜的牌型會無法正確計算 出最小上聽數,如圖 2-9(a)若我們把眼定在三萬會得到 1 上聽數,
但將相同的牌另外分割,如圖 2.9(b)把眼定在西風牌,可得更小的 0 上聽,因此,不同的牌當眼會得到不同的上聽數,我們針對此問題設 計出一個解決方法。
圖 2.9(a) 眼定在三萬為 1 上聽。
圖 2.9(b) 眼定在西風為 0 上聽。
我們會獨立計算各種類牌的組數、搭數和有效牌,除此之外,再 檢查此種類的牌是否有兩張以上相同的牌可當眼,若是有多張可當眼 的牌,比較哪張當眼有最多的組數、搭數,並將此牌設定為此類牌若 包含眼的眼牌。
當結合各種類的牌時,我們會分別計算眼落在不同種類的牌,可 得到的上聽數和有效牌分數,如圖 2-10,從中選擇最小的上聽數視 為最好的組合。
圖 2-10 計算眼落在不同花色的上聽數和有效牌分數。
若擁有相同的上聽數時,代表兩種當眼方式距離聽牌有相同的距 離,而這時有效牌的分數可累加,如圖 2-11,若由東風當眼,我方 的手牌已經為聽牌狀況,可聽三、六萬;另外,這時也得考慮由六萬 當眼,還可以聽東風,因此,這三張都可達成胡牌條件,必須設為聯 集關係。
如圖 2-11 不同眼有相同上聽數,有效牌為聯集關係。