見出し画像

押し引きに根拠を!リアルタイム麻雀AI を自作する。


1.押し引きAIとは。

天鳳や雀魂をプレイしながら、リアルタイムかつ、自動的に押し引きを並行演算するAIを開発しています。

画像1

麻雀理論に関しては、戦術本を30冊以上読んだ内容を、演算に組み込むため、ある程度信用できるものだと思います。


2.押し引きAI作成の目的

・自分でプログラムを組むことで、麻雀理論の原理を理解できる。

たとえば、押し引き判断が、点数状況/自手の価値/自手の待ちの良さ/宣言牌の危険度 等、複数のパラメータで行われることなどをプログラムを書くことで理解する。

・機械学習および、統計学の学習になる。

天鳳の鳳凰卓の実践譜を解析して順位期待値の計算式を導き出したり、放銃率の計算など、機械学習や統計学の知識を利用するため、楽しみながら学習ができると考えた。

・メンタルを保つために、運に左右されにくい指標がほしい。

和了率、和了打点、放銃打点など、(ある程度) 運に左右される指標ではない新しい指標を見つけたい。


3.押し引きAI作成の背

・Excelにて試作版は作成しており、有用性を確認済み
・麻雀上達のために覚えたいことが多いが、実用的なものから覚えたい
・"データ分析/データ活用" 力をつけることで、仕事にも幅が出ると考えた

スクリーンショット 2020-08-16 16.59.09

Googleスプレッドシートにて、押し引きシートを作成しましたが、手動で入力するのが面倒くさいので、画像認識から自動で計算してくれたら楽だなと思いました。


4.押し引きに関する重要な2つの考え方

まず、本シミュレータの基礎となり、平面の押し引き判断は、『「統計学」のマージャン戦術』(著:みーにん) を参考にしています。
理論に不明点があれば、本を買ってみてください。
私は、本とKindle版 の両方を持ってます。。


この本には、押し引きに関する重要な指標が書かれています。

それは、「局収支」「和了価値指標」という考え方です。

今回作成する押し引きAI の基本的なロジックは、この「局収支」を採用しています。
"押したときの局収支""オリたときの局収支" を比較して、より局収支がよい方を採用します。

4-1.局収支を高める選択

スクリーンショット 2020-08-16 19.40.52

『「統計学」のマージャン戦術』P.18より

【式1】では、局収支を求める公式に変数がいくつもあるように見えますが、失点と失点率は統計データにより、平均がわかっているので、【式2】のように簡易化することが出来ています。

先制聴牌時は、【式2】にて、簡易的な局収支が求められます。

そして、追っかけ聴牌時は、【式1】に状況に応じた 放銃率 を入力することで簡易的な局収支を求めることができそうです。

つまり、和了率和了時得点放銃率がわかれば、局収支がわかるようになっています。


繰り返しになりますが、今回、この 押し引きAI は、「押し時の局収支」と、「ベタオリ時の局収支」を比較し、どちらが局収支が良いかを自動的に判断します。

そして、そのために必要なパラメータは、「和了率」と「和了時得点」と「放銃率」です。

和了率は、良形待ちが愚形待ちかで大きく変わります。

追っかけリーチの和了率は、
良形待ちだと、45%程度、
愚形待ちだと、30%程度です。

和了時得点は、手牌の打点、および、供託点によって変わります。

追っかけリーチの場合は、他家がリーチ棒を出しているので、自分の手牌価値+1,000点ですね。


そして、最後に押す牌の 放銃率 がわかれば、局収支が計算できそうです。


放銃率も統計から計算結果が出ており、通ったスジの本数から放銃率が簡易的に計算できます。
(※詳細な牌種ごとの放銃率は、『「統計学」のマージャン戦術』で御覧ください。)


たとえば、以下の場面。

スクリーンショット 2020-08-16 16.59.09

対面からリーチを受けて2巡目。

リーチ宣言牌になりそうな牌は、片無スジの6p
オリるとすれば、現物が6枚ほどありオリられそうです。

ここで、ここまでの理論を使って押し引き判断していきます。

放銃率の計算は、スジが12本ほど既に通っているので、
片スジ6pの放銃率は 「13.8%」ほどであることがわかっています。

押したときの局収支」を計算すると、

6p切りリーチの局収支は、+1,300ほど
6p切りダマの局収支は、▲800ほど

オリたときの局収支」は、
親のベタオリ局収支は、▲1,700 となっています。

局収支の観点では、
6p切りリーチ > 6p切りダマ > ベタオリ
であることがわかりました。



4-2.  和了価値指標で、点数状況に応じた押し引きをする。


上記の理論では、どんな点数状況でも同じ押し引きになってしまいますが、実際は点数状況を判断して押し引きを行う必要があります。

持ち点が 10,000点のときと、40,000点のときでは押し引きが変わってきます。

ここでは、「和了価値指標」 という指標を用いて、立体的な押し引きをしていきます。

スクリーンショット 2020-08-19 22.09.53

同じ東一局でも、45,000点持ちの場合はいつもよりも、自分の打点を半分にして押し引きする必要があります。


以上の理論を用いて、押し引きAIを自作しました。

5.押し引きAI の画面構成

画像9

点数状況

・局情報・点数状況

より立体的な押し引きをするために、局情報と点数状況を取得します。
こちらの情報を使って、和了価値指標 を計算します。

例の状況での和了価値指標は、0.6 ほどなので、自分の手牌価値を0.6倍する必要があります。


牌姿

・牌姿
→ 牌姿を確認し、「打点」「良形/愚形」「シャンテン数」を計算し、押し引きに利用します。

・河
→ 各家の河を確認し、スジの本数を確認します。
この結果から、牌姿 の下に放銃率を表示しています。

・押し引き判断
→ 放銃率の背景色によって、押し引き判断を表示できるようにしました。
灰色は、安全牌。
薄い橙色は、押し有利の牌。
濃い橙色は、押すのが不利な牌。
としています。

上記例だと、一旦、打中として、聴牌ったら、4mは押し有利と判断します。


6.おまけ - 順位期待値計算機能

点数判断

局情報と点数状況から、順位期待値 を計算できる機能も付けました。

たとえば、上記例だと、
1位率 53.9% 、2位率 28.5%、3位率 13.6% 、4位率 4%
になることを表示しています。

自家の牌姿や、他家の状況によって、起こり得そうな和了が発生した際の順位期待値も予測して計算・表示しました。

今回は、上家と対面からリーチが入っていますが、対面ツモは許せる展開であることがわかります。


今後は、自分の手牌の進行についても、計算できる機能を追加したり、
さらに精度良く計算できるように組み込みたいです。


今後開発する各システムを、Webサービス化するためのサーバ代として利用させていただきます。