koba::blog

小林聡: プログラマです

麻雀の打牌選択アルゴリズム(2)

麻雀の打牌選択アルゴリズム(1) - koba::blog の続き。前回は打牌選択の基準を待ちの牌種重視から枚数重視としたが、今回はその枚数を実際に「見えていない枚数」*1としてみる。

このためには配牌、自摸、打牌、副露、槓のタイミングで枚数をカウントする必要があるので、これを行うクラス Majiang.SuanPai*2を新たに追加した。

枚数を数えるためにわざわざクラスを追加したのは、将来的にこのクラスに危険牌読み、山読み、手牌読みも実装したいから。

ソースコードの差分は以下を参照。

新旧アルゴリズムの対戦結果は以下の通り。

対戦数 1,000総局数 9,608
1位率 .255和了 .227
2位率 .260放銃率 .154
3位率 .269立直率 .437
4位率 .216副露率 .000
平均順位 2.45平均打点 6,629

和了出現回数出現率 和了出現回数出現率
ドラ 922 42.25% 翻牌 161 7.38%
赤ドラ 973 44.59% 平和 524 24.01%
裏ドラ 865 39.64% 断幺九 207 9.49%
立直 2,165 99.22% 一盃口 109 5.00%
ダブル立直 7 0.32% 三色同順 42 1.92%
一発 640 29.33% 一気通貫 25 1.15%
門前清自摸 502 23.01% 七対子 137 6.28%

平均順位が 2.48位 → 2.45位 と若干上昇したが、期待したほどの成績上昇ではなかった。立直率、和了率はそれぞれ 43.8% → 43.7%、22.8% → 22.7% と横ばいだが、放銃率が 16.3% → 15.4% と下がっている原因が不明*3

現状の打牌を見ていると孤立牌の切り順に問題がありそうなので、次回は孤立牌の有効度をはかるアルゴリズムを導入する。

*1:他者の手牌もしくは山に眠っている枚数

*2:算牌: 中国語では牌読みのような意味になるはず

*3:カラ聴の立直をかけなくなった影響かも