Home

ダマテンの効果をシミュレーションする

木原直哉氏のブログ記事 ポーカー的視点から見た、今後の麻雀の進化予想 に触発されて「敢えてダマにする戦術」の効果をシミュレーションしてみようと思い立ちました。

木原氏の記事は「いつも同じ行動をすると読まれる」が趣旨だと思いますが、例として挙げた「たまにはリーチせずダマテンにとる」という戦術が議論を呼んでしまっているようです。

電脳麻将 のAIの現在の戦略は「テンパイ即リー」であり、押し引きアルゴリズムもリーチ者以外は無警戒としているので「敵を欺く」例題としては格好のケースに思えます*1。 さて、いったいどうなるでしょうか?


AIの実装

電脳麻将のアルゴリズムを「役ありテンパイならば50%の確率でリーチせずダマにとる」に変更します*2。 木原氏のブログ記事では「満貫テンパイならリーチしない」となっているのですが、それではありふれた戦術になってしまうので、今回は敢えて「敵を欺く」ことを目的に全ての役ありテンパイを対象にしてみます。

    /*
     *  配牌時の処理
     */
    qipai(qipai) {
        this._defen_cache = {};
        this._eval_cache  = {};
        this._no_lizhi    = false;  // ダマテンを選択したとき true を設定する
        this._suanpai = new SuanPai(this._rule['赤牌']);
        this._suanpai.qipai(
            qipai, (this._id + 4 - this._model.qijia + 4 - qipai.jushu) % 4);
        super.qipai(qipai);
    }
    /*
     *  立直判断: リーチするとき true を返す
     */
    select_lizhi(p) {
        if (! p) return this.allow_lizhi(this.shoupai, p);
        if (this._no_lizhi) return false;       // すでにダマテンを選択済みの場合
        if (! this.allow_lizhi(this.shoupai, p)) return false;
                                                // リーチできない場合
        let shoupai = this.shoupai.clone().dapai(p);
        for (let tp of Majiang.Util.tingpai(shoupai)) {
            if (! this.allow_hule(shoupai, tp + '=')) return true;
                                                // 役なしの場合はリーチを選択
        }
        this._no_lizhi = Math.random() < 0.5;   // 50% の確率でダマテンを選択する
        return ! this._no_lizhi;
    }

シミュレーション

リーチ禁止の影響をシミュレーションする と同様の方法でシミュレーションしました。

リーチ率は 23.5% → 17.6% と減少し、ダマテンの効果で和了率が 21.7% → 22.1% と上昇しました。 しかしながら平均順位は 2.52 → 2.54 と悪化しています。 平均打点が 5646 → 5113 と減少したのが響いたのでしょう。 やはり満貫以下の手はリーチした方がよさそうですね。

  1. ^ ダマテンにどんどん放銃するのでは?と言う期待
  2. ^ この決定に乱数を使うため、対戦の再現性がなくなるのが難点です