麻雀AI Microsoft Suphxの第1打

前置き

Suphxの分析というより、Rの練習の意味合いが強い。なので、麻雀としての結論は麻雀をやっていれば当たり前の結論が導かれている、ということは最初に前置きしておきたい。

Microsoft Suphxとは

Microsoft Suphxは、Microsoftが作った麻雀AIである。2019年春から夏にかけて実際に麻雀サイト「天鳳」で打ち、天鳳の最高段位である「十段」を麻雀AIとして初めて達成した。

麻雀 AI Microsoft Suphx が人間のトッププレイヤーに匹敵する成績を達成 - News Center Japan

将棋やチェスなどに代表される「二人零和有限確定完全情報ゲーム」では、ルールの特性を除けば、すべての情報が盤面にあらわれており、比較的研究しやすいゲーム分野ではあり、チェスAIのDeepBlueや名人に勝利したPonanzaなどの将棋AIは1990年代から2010年代にかけて研究がされており、Deep Learningが広く知られるようになった2010年代には急激に発達した分野である。

一方、麻雀やテキサスホールデムなどの多人数かつ情報が隠れているようなゲームについても研究は進められ、特に画像処理で使用されるGPUを演算処理に活用される手法が確立されてからは様々なAIが不完全情報ゲームにおいて人間に勝利を収めるようになった。

Suphxの詳細をを突っ込むとそれだけで1記事になるので、論文やそれを解説したサイトを見ていただきたい。

Suphx 論文

Suphx 論文 (0) Introduction を読む|daku-longyi|note

でもここでは普通に数の分析をしていく

筆者は、深層学習に詳しくもなく、統計学者でもなければ、統計学にも詳しいわけでもない初心者であり、適当にコードが組める人間である。

なので、初心者にふさわしくだれでもわかるような数値データにしてみたい。当然の話だが、注意いただきたいこととして、ここで述べる話は仮説(あるいはそれ以前の次元であるただの意見)であり、相関関係を証明した結果でないということを覚えていただきたい。

麻雀の第1打

麻雀における第1打が戦術に影響するか、というと、対してためになるものではないし、何切る問題をするほうがいいだろう。ただ、統計的な分析をするという観点におけば、極めてベーシックな話なので、やってみることとした。

条件

麻雀の第1打とはつまり、以下のようなことである。

  • 1局のそのプレイヤーの初期状態である
  • ランダムに配られた14牌(13牌+第1ツモ牌)の手牌から選ぶだけの(ほぼ)手牌だけ見れば良いものである

ほぼ、というのは、他プレイヤーの点数の違いなどで打牌に影響はするだろうし、正真正銘の第一打である親とその後に続く子でも捨牌の状況が発生するのでやはりそれも影響するだろう、ということである。ただし、正真正銘の東1局の親第1打だけを抽出するとサンプル数が足りなさすぎるので、ここでは以下のように少々の影響を許容する。

  • 場や局、点数局面の違いは無視する
  • 親と子を無視する
  • 他プレイヤーの捨てた牌、他プレイヤーが鳴いている牌、なども無視する

ただ、以下の点は除外することとした。

  • 九種九牌で流した場面(そもそも打牌してないので無視)
  • Suphxが第1ツモを待たずに鳴いた場面(Suphxの鳴き判断が既に極端な影響を及ぼしているため)

グラフ化した結果

Image from Gyazo

牌 打数
5p 11
5s 14
7p 15
5m 18
4p 23
7s 24
3p 27
3s 28
7m 28
6m 30
6p 30
3m 34
4m 36
6s 38
4s 39
2p 88
8p 88
8s 91
2s 100
8m 100
2m 109
中 337
発 459
白 513
1p 883
9p 899
9s 913
1s 966
9m 980
1m 1050
東 1446
南 1634
西 2138
北 2168

なお、Rで入れたコマンドは以下のとおり。もっとも、牌譜はCSV化しているものの公表されているものではない。強いて言えば、自力で天鳳のサイトとSuphxのツイッターで公表されている牌譜URLから取ったものをCSV化したものである。なので、コマンドもあまり役に立たないとは思われる。

data <- read.csv(csvfilepath, header=T)
ret <- d[d$巡目 == 1, ]
# 鳴きなし、九種九牌なし
ret <- d[d$巡目 == 1 & d$直近捨牌 != "" & d$晒牌0 == "", c("直近捨牌")]
# 色々整形したグラフ
barplot(sort(table(ret)), main="Suphxの第1打", ylab="総数", xlab="牌種", ylim=c(0,2500), axis.lty=1, las=1, cex.main=2, cex.names=0.75)

グラフから見る傾向

右側の打牌の多い順から1~6群に分けた。正直「そりゃそうだわな」という結果にはなったが、一応解説する。

第1群「北、西」

天鳳では半荘戦であるので、この2牌は(ほぼ)場風牌になることのない風牌である。手を進める上では真っ先に見切られる牌といえるのでわかりやすい。

第2群「南、東」

やはり半荘戦であるので、この2牌は場風牌になりえる風牌である。南のほうが若干多いのは、天鳳ではトビ終了があるので、南場の途中、南場に入る前に打ち切られる可能性があるためのように思われる。 ここから見えるのは「役牌の価値はそうでない字牌より重い」という仮定が建てられる。もっとも、人間的な感性としてもそのとおりではあると思う。

第3群「19牌」

風牌と比較して著しい差が見えるのは19牌になる。19牌は牌効率の観点で無駄になることが多い牌である。たとえば、1牌と4牌が1枚ずつあるとき受け入れの2と3の牌が重なることから1の牌は無駄が多い、といえる有名なセオリーである。また、鳴き断么九ありのルールでも使えない牌なので、除外したい牌の候補である。そのことから、3番めの位置につけている。

第4群「三元牌」

個人的には、注目したい点である。三元牌は19牌のそれぞれよりも半分程度の打牌である。これは、向聴数別の打牌数で解説したいが、やはり「役牌は若干重く見る」傾向にあるのがわかる。あるいは、19牌と比べれば。既に対子・刻子として重なっている場合に捨てる候補に足り得ない、なども考えられる。字牌が後々の安全牌になり易い、というのもあるかもしれない。

少なくとも、三元牌の価値を風牌と合わせて「字牌」として一緒にするべきではない、とは間違いなく言える。

第5群「28牌」

中張牌のなかでも、28牌は少し捨てられやすい傾向にある。これは、単純に牌効率の問題であろう。

第6群「3~7牌」

3~7牌にはほとんど差がなかった。強いて言えば、46牌>37牌>5牌という傾向が見えなくもない。5牌が少ないのは、天鳳のルールでは5牌に赤牌が採用されているからだろう。

結論

Suphxの第1打をRを使ってグラフ化した。そこから傾向として6つの群に分けることができた。

仮説としては以下のとおりである。

  • オタ風牌の価値はもっとも軽い
  • 役牌の価値を他の字牌より重くみる
  • さらに19牌は三元牌と比べると価値を軽くみる
  • その他は牌効率のセオリーのとおりの価値水準である

つまり「麻雀をやっている人間にはごくごく当たり前の結果がでた」というところであるし、そりゃそうだろという結論だ。

もっともRの練習として行ったことなので「当たり前の結果がでた」ということは、「練習の結果として正しい」ということなので個人的には価値ある結果だった。

コメント

このブログの人気の投稿

リモートワークをLogicoolのマウスとキーボードで複数PC切り替えて優勝した

フローチャート図を書けるmermaid.jsを使ってみた

SUPERHOTがいかにSUPERHOTか語りたい