木原直哉氏のブログ記事 ポーカー的視点から見た、今後の麻雀の進化予想 - 木原直哉オフィシャルブログ に触発されて「敢えてダマにする戦術」の効果をシミュレーションしてみようと思い立ちました。
木原氏の記事は「いつも同じ行動をすると読まれる」が趣旨だと思いますが、例として挙げた「たまにはリーチせずダマテンにとる」という戦術が議論を呼んでしまっているようです。
電脳麻将 の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; }
シミュレーション
リーチ禁止の影響をシミュレーションする - koba::blog と同様の方法でシミュレーションしました。
リーチ率は 23.5% → 17.6% と減少し、ダマテンの効果で和了率が 21.7% → 22.1% と上昇しました。しかしながら平均順位は 2.52 → 2.54 と悪化しています。平均打点が 5646 → 5113 と減少したのが響いたのでしょう。やはり満貫以下の手はリーチした方がよさそうですね。