押し引きアルゴリズムの改善(3)

押し引きアルゴリズムの改善(2) - koba::blog で1シャンテンまでの押し引きを改善したので、今回はテンパイ時の押し引きを改善する。

の3つが改善候補。

ポンテン・チーテンをとる条件を変更

現在は牌姿にかかわらずポンテン・チーテンを取っているが、評価値により判断を変えるよう修正する。具体的には1シャンテン時に超好形とした1200点以上になるのであれば(以降は全押しにできるので)シャンテン数に関わらず副露(大明槓含む)するようにした。これにより愚形テンパイとなるケースが減ることになる。

        let max    = this.eval_shoupai(this._shoupai, paishu, '');
                                            // 副露前の手牌の評価値を基準とする
        /* …… */

        for (let m of mianzi) {     // 全ての可能な副露について以下を繰り返す

            let shoupai = this._shoupai.clone().fulou(m);   // 副露してみる

            /* …… */

            let ev = this.eval_shoupai(shoupai, paishu);
                                                // 副露後の評価値を計算する
            /* …… */

            if (bei_lizhi && ev < 1200) continue;
                                                // リーチを受けた後は
                                                // 評価値1200未満は候補としない
            if (ev > max) {     // 評価値が基準値以上であれば
                max = ev;       // 基準値を更新し、
                fulou = m;      // その副露を候補とする
            }
        }
        return fulou;           // 評価値最大の副露をする

デュプリケート方式 で1000戦の対局を行った結果は以下の通り(改善(3-1))。

結果 改善前 改善(1)改善(2)改善(3-1)
割合 局収支 割合 局収支 割合 局収支 割合 局収支
和了 10.2% +6441 11.6% +6468 11.3% +6721 10.7% +6939
放銃 10.5% -6209 13.0% -6200 12.0% -6279 11.5% -6243
被ツモ 32.6% -2690 31.5% -2703 31.9% -2706 32.2% -2708
横移動 26.3% -57 25.6% -68 26.0% -63 26.3% -64
流局 20.4% -827 18.2% -615 18.9% -667 19.3% -681
平均 -1057 -1036 -999 -991

愚形テンパイとなる副露をしなくなったためか、若干局収支が向上した。

超愚形ならオリるよう修正

現在はテンパイ後は評価値、牌の危険度に関わりなくすべて押しとなっているが、それではあまりに押しすぎと思うので、1シャンテン時の基準に合わせ評価値400未満の場合*1はベタオリするようにしてみた(改善(3-2))。

結果 改善前 改善(1)改善(2)改善(3-1) 改善(3-2)
割合 局収支 割合 局収支 割合 局収支 割合 局収支 割合 局収支
和了 10.2% +6441 11.6% +6468 11.3% +6721 10.7% +6939 10.4% +7044
放銃 10.5% -6209 13.0% -6200 12.0% -6279 11.5% -6243 11.2% -6214
被ツモ 32.6% -2690 31.5% -2703 31.9% -2706 32.2% -2708 32.4% -2700
横移動 26.3% -57 25.6% -68 26.0% -63 26.3% -64 26.5% -61
流局 20.4% -827 18.2% -615 18.9% -667 19.3% -681 19.5% -752
平均 -1057 -1036 -999 -991 -1001

結果は上の通り。局収支は -1001 で改善にならなかった。さらに閾値を評価値 0 (つまり役なしテンパイ)にして試してみたが、局収支は -997 で改善されなかった。どうやらテンパイしたら役なしでもベタオリはしない方がよいようである。

好形でないならリーチせず無スジは切らないよう修正

テンパイ後にベタオリする必要はないとしても無スジを押してはいけない閾値はあるだろうということで、1シャンテン時の基準を参考に評価値1200未満*2の場合は無スジは押さない(スジは押す)ように修正してみた。無スジをツモったときは押さないのでこの場合リーチはかけない(改善(3-3))。

結果 改善前 改善(1)改善(2)改善(3-1) 改善(3-3)
割合 局収支 割合 局収支 割合 局収支 割合 局収支 割合 局収支
和了 10.2% +6441 11.6% +6468 11.3% +6721 10.7% +6939 9.1% +7540
放銃 10.5% -6209 13.0% -6200 12.0% -6279 11.5% -6243 10.6% -6234
被ツモ 32.6% -2690 31.5% -2703 31.9% -2706 32.2% -2708 32.9% -2692
横移動 26.3% -57 25.6% -68 26.0% -63 26.3% -64 27.0% -49
流局 20.4% -827 18.2% -615 18.9% -667 19.3% -681 20.4% -836
平均 -1057 -1036 -999 -991 -1044

結果は上記の通りで局収支が -1044 と大幅に悪化してしまった。さらに閾値を 800、400、0 と変更して順に試してみたが、局収支は -1019、-996、-997 と改善には至らなかった。結論として改善(3-1)のアルゴリズムを改善(3)として採用することにした。

先制リーチを受けた局面以外も含めた全体の成績は以下の通り。

改善前 改善(1)改善(2)改善(3) 改善前 改善(1)改善(2)改善(3)
対戦数 1,000 1,000 1,000 1,000 総局数 10,505 10,465 10,464 10,480
1位率 .241 .249 .255 .258 和了率 .209 .218 .215 .213
2位率 .251 .244 .248 .247 放銃率 .128 .141 .137 .134
3位率 .254 .255 .248 .243 立直率 .221 .237 .232 .233
4位率 .254 .252 .249 .252 副露率 .346 .349 .349 .345
平均順位 2.52 2.51 2.49 2.49 平均打点 5,492 5,499 5,580 5,648

このアルゴリズムを次回リリースの ver.1.5.0 に採用する。

*1:テンパイ時に評価値400未満となるのは副露手1000点の愚形テンパイあるいは役なしテンパイのみ

*2:メンゼンテンパイで評価値1200未満となるのはリーチのみ愚形テンパイだけ