Home

鳴かない麻雀の成績への影響をシミュレーションする

前回 麻雀AIの作り方 で麻雀AIの実装と評価方法にいて説明しました。 今回は実際に「鳴かない戦術のAI」を実装し、その成績に与える影響をシミュレーションしてみます。


AIの実装

@kobalab/majiang-ai を clone します。

$ mkdir work
$ cd work
$ git clone https://github.com/kobalab/majiang-ai.git
$ cd majiang-ai
$ npm ci

現在の実装である lib/player.js を修正します。 今回、鳴かない実装にするので、鳴きを判断するメソッド select_fulou() が常に false を返すよう、空メソッドにします。

    select_fulou(dapai, info) {}

AIのテスト

Webブラウザ上でAIの動作を確認するために、AIを電脳麻将 に組み込みます。 まず、電脳麻将 を clone します。

$ cd ..
$ git clone https://github.com/kobalab/Majiang.git
$ cd Majiang
$ npm ci

先ほど修正した麻雀AIに置き換えます。

$ npm i ../majiang-ai

ビルドします。

$ npm run release

ブラウザから dist/index.html を開けば修正後の「鳴かないAI」と対戦できます。 dist/autoplay.html でAI同士の自動対戦を観戦してもいいでしょう。

シミュレーション

作成したAIを従来のAIと対戦させて結果を比較しますが、麻雀の成績は運の要素が大きいため、ランダムな牌山で対戦させても効果が測定しにくいです。 電脳麻将には牌山とツモを固定させて対局する デュプリケート対局 の機能があるためこれを利用します。

デュプリケート対局用の牌山を生成

まず、デュプリケート対局用の牌山を生成します。

$ node dev/make_shan.js shan.json.gz

デフォルトでは1000半荘の赤牌入りの牌山を生成しますが、変更することも可能 です。 電脳麻将の実装のときには、1000半荘の牌山を10個用意し、計1万半荘の対局で評価していましたが、対局に時間もかかるため今回は1000半荘で評価します。

修正前のAIで対局を実施

AI自動対局スクリプト でAI同士を対局させます。 まず修正前のAIを対局させ、この結果を修正後の対局と比較します。 最新のAIのバージョンは 0504 ですので、これを指定します。

$ node dev/testplay.js -i shan.json.gz -o 0504.json 0504 0504

実行には6時間程度かかると思います。 発熱が大きいマシンでは実行しない方がよいかもしれません*1 結果は 牌譜 として出力されるので、これを 牌譜ビューア に読み込み集計します。

完全に同一のアルゴリズムを対戦させても1000半荘程度では「運による」成績のムラがあることはご覧いただけると思いますが、牌山とツモを固定しているので、「私」という対局者に着目すればアルゴリズムによる成績の変化を確認することができます。

修正後のAIで対局し結果を比較

次に修正後のAIと対局させ、集計します。

$ node dev/testplay.js -i shan.json.gz -o test.json 0504

当然ながら副露率は 0% となっています。 和了打点が 5646 → 7872 と大きく上昇していますが、和了率が 21.7% → 14.3% と激減した影響で、平均順位は 2.52 → 2.65 と大幅に悪化しました。

鳴かない麻雀は平均順位を0.13程度悪化させるようです。

牌譜解析ツール で集計すれば、和了役の統計などより詳細な情報が得られますので、興味ある方は使用してみてください。

  1. ^ MacBookで対局を繰り返すとバッテリーが膨張する恐れあり