koba::blog

小林聡: プログラマです

麻雀の副露判断アルゴリズム(3)

麻雀の副露判断アルゴリズム(2) - koba::blog で役ありの向聴数が計算できるようになったので、基本的には向聴数が減る場合に鳴けばよいのであるが、実際に動かしてみると以下の問題があった。

  • オリている最中でも鳴いて手詰まりを起こしてしまう
  • オリているのに暗槓、加槓をして立直者に裏ドラを乗せてしまう
  • さかんに大明槓する*1

今回はこれを調整する。

副露(チー・ポン・大明槓)

Majiang.Player.prototype.select_fulou() に以下の判断を追加した。

    /* 立直者がいる場合は副露しない */
    if (this._lizhi.filter(function(x){return x}).length > 0) return;

暗槓・加槓

Majiang.Player.prototype.select_gang() に以下の判断を追加した。

    var n_xiangting = this.xiangting(this._shoupai);

    /* 立直者がいて自分がノー聴の場合は槓しない */
    if (this._lizhi.filter(function(x){return x}).length > 0
        && n_xiangting > 0) return;

大明槓

Majiang.Player.prototype.select_fulou() の内部関数 check_xiangting()に以下の判断を追加した。

            /* 大明槓していいのは既に槓子が2つ以上ある場合のみ */
            if (shoupai._fulou.filter(function(mm){
                    return mm.match(/^[mpsz](\d)\1\1.*\1.*$/)}).length >= 2)
            {
                return m;
            }

対戦結果

上記の調整を行った思考ルーチンと ver.0.5 の思考ルーチンを対戦させてみる。ver.0.5 の思考ルーチン4名(鳴きなし)のみで対戦した場合と、今回の改良した1名(鳴きあり)を加えた場合で成績を比較した。

ver.0.5 鳴きあり ver.0.5 鳴きあり
対戦数 1,000 1,000 総局数 10,427 10,444
1位率 .236 .300 和了 .157 .224
2位率 .283 .243 放銃率 .071 .081
3位率 .247 .230 立直率 .356 .286
4位率 .234 .227 副露率 .000 .238
平均順位 2.48 2.38 平均打点 7,384 5,616

和了率が大幅にアップしたが放銃率は大きく悪化しなかった*2、平均順位の 2.38 は成果が出たと言ってよいと思う。副露率は 23.8% だが、これは 30% くらいまでは増やしたいところ。

次に和了役の統計を示す。

和了出現回数出現率 和了出現回数出現率
ドラ 1,147 49.10% 断幺九 463 19.82%
赤ドラ 1,111 47.56% 一盃口 61 2.61%
裏ドラ 574 24.57% 三色同順 40 1.71%
立直 1,311 56.12% 一気通貫 15 0.64%
ダブル立直 6 0.26% 七対子 100 4.28%
一発 251 10.74% 対々和 0 0.00%
門前清自摸 724 30.99% 混一色 8 0.34%
翻牌 869 37.20% 清一色 2 0.09%
平和 341 14.60%

オンライン対戦麻雀 天鳳 / ランキング によると翻牌の出現率は40%超、断幺九は22%超だが、それに近いレベルまで仕掛けることはできたようだ。ただし対々和混一色については期待した効果がでなかった。この2役は「向聴数を減らす」方向で手を進めても完成しないからと思われる。この点については今後改良したい。

*1:これは大明槓する条件を「向聴数が増えないとき」にしていたから

*2:つまり鳴いてもベタオリすればオリきれるということ