tomohxxの日記

麻雀プログラミング

麻雀AI開発(2) 一局戦攻略

はじめに

この記事は一応以前の記事の続きですが、たぶん以前のものは自分にしかわからないと思うのでここで改めて経緯から説明します。
tomohxx.hatenablog.com

麻雀AIの開発の過程

これまでに開発したものは以下のものになります(2020/04頃まで)。

これらを組み合わせることで平場での打牌選択は大体うまくできるようになります。なお、これらのアルゴリズムに使われているテクニックとしては深さ優先探索動的計画法モンテカルロ法があり機械学習は使われていないです。この後、上記のアルゴリズムに、立直判断、押し引き判断、危険度推定のアルゴリズムを追加してAIに四人麻雀を打たせました。追加したアルゴリズムは簡単には以下のようになります。

それでAIに打たせた結果ですが、あまりうまくいきませんでした。具体的には和了確率が低い(20%以下)、危険度推定の精度が低い、立直判断・押し引き判断が微妙などの課題が見つかりました。そこで、まず危険度推定アルゴリズムを見直しました。教師あり学習ではなく、全待ちパターンを生成してある牌を待つ確率を求めるように変更しました。この変更によって現物は安全であること、外側の牌ほど安全であること、筋・壁は比較的安全であることを確実に判断できるようになりました。なお変更前は壁が比較的安全であることを判断できませんでした(教師あり学習がダメというわけではなく私の技術不足によるところが大きいと思います)。残る立直判断と押し引き判断ですがこれらはルールベースとして、他AIと対戦しながら成績を見て調整することにしました。例えば立直判断では先制であれば立直、追っかける際は一人麻雀での和了確率が30%以上が必要のように調整します(実際はもう少し条件分岐があります)。一時期強化学習を検討して試しましたが一旦断念することにしました。この事情について後日別の記事で書きたいと思います。また、打牌選択アルゴリズムにバグではないものの問題が見つかったので修正も行いました。

改良版麻雀AIの評価

改良した麻雀AIの評価しました。以前は東風戦で評価しましたが今回は一局戦に変更しました。これは自分と相手の打点を考えなくてよくなるので立直判断・押し引き判断の調整が簡単になるためです。対戦相手のAIはmjai-manueというAI 3体です。基本的な手作りと鳴きは問題なく行えます。詳しくはリンク先を参照してください。
github.com

目標は和了率約25%、放銃率約10%、トップ率30%以上としました。平均順位は一局戦の場合席順の影響が大きいので無視します。対戦結果は以下のようになりました。

f:id:tomohxx:20200705024743p:plain
Test_v2の成績

牌譜はリンク先を参照してください。

以下、評価環境です。

  • CPU: Intel(R) Core(TM) i7-10510U
  • RAM: 16.0 GB

評価にかかった時間は約8時間でした。

考察

和了率22%、トップ率28%なので目標は達成できませんでした。ただバグの修正と立直判断・押し引き判断の調整に約一週間かかって疲れたので今回はこれで妥協します。改善案として和了率を上げるには聴牌での押し引きの調整が必要かと思います。あとは形聴をとる戦略の調整ですかね。

また、今回の開発スタイルですが私自身の雀力に強く依存してしまうので非常によくないです。もし麻雀が強い方がこの記事を読んでいましたら、ぜひ牌譜を見てアドバイスを下さったらありがたいです。

おわりに

今回は麻雀AIの開発の進捗について記事を書きました。ゆくゆくは東風戦・東南戦の攻略へ進む予定です。ただ一局戦でまだ改善点や試してみたいことがあるので、あと一回は一局戦攻略をテーマに記事を書くつもりです。