tomohxxの日記

麻雀プログラミング

麻雀AI開発(3) 打牌選択モデル

麻雀AI開発の3回目です。前回記事から麻雀AIをアップデートしたのですが、変えたのは打牌選択モデルです。前回記事はこちら。
tomohxx.hatenablog.com

今までは他家の攻撃があった場合の行動をルールベースで決めていました。例えば、立直者が一人かつ自分が聴牌の場合は全ツ、自分が一向聴の場合は回し打ち、立直者が二人以上の場合はベタ降りのようにしていました。今回の変更によって自分の手の和了確率と打牌候補の放銃率のバランスをとって、適度に押し返すことができるようになりました。対戦相手のmjai-manueは聴牌速度が速いので、押し返しが非常に重要といえます。そのため、この変更で成績の向上が見込めるということになります。

では、今回採用した打牌選択モデルを説明します。打牌選択の局面において以下の行動価値を最大にする牌を捨てるように行動します。

 (行動の価値) = (1-放銃率) \times (一人麻雀での行動の価値) - 放銃率 \times 期待失点

実はこの打牌選択モデルはmjai-manueから拝借しました。なのでオリジナルではないです。しかし、各項の計算は独自のやり方で行っています。まず「一人麻雀での行動の価値」は一人麻雀シミュレーションを行った結果得られる和了確率や翻数期待値、振り聴率などを組み合わせたものです。次に「放銃率」は全待ちパターンを生成してある牌を待つ確率を求めています。最後に「期待失点」は四麻シミュレーションを何度か行って決めた固定値です。ポイントなのは上記の式自体は何者なのか解釈できないながら上手くいくということです。行動の価値として四麻での局収支を使えばわかりやすいのですが、実際のところはこのような解釈できない式でも機能します。たぶんルールベースとは違って攻撃と防御を連続的に記述するということが重要ではないかと思っています。

mjai-manueとの対戦結果を示します。

試合形式 一局戦
試合数 1000
局数 1000
和了 0.266
放銃率 0.122
1位率 0.345
2位率 0.209
3位率 0.197
4位率 0.249
平均打点 5734

このように、mjai-manueを超えたといえる成績となりました。ちなみに前回「和了率約25%、放銃率約10%、トップ率30%以上」という目標を立てたのですが達成したことにします。放銃率12%は許容範囲なのか微妙ですが。

最後に、今回をもって一局戦の攻略は終了とします。今後は東風戦の攻略となります。東風戦攻略の鍵は得点状況に応じた押し引きの調整です。これには期待最終順位を使うことが有効であると既にわかっているのでそんなに苦労しないのではないかと思っています。