木原直哉氏のブログ記事 ポーカー的視点から見た、今後の麻雀の進化予想 に触発されて「敢えてダマにする戦術」の効果をシミュレーションしてみようと思い立ちました。
木原氏の記事は「いつも同じ行動をすると読まれる」が趣旨だと思いますが、例として挙げた「たまにはリーチせずダマテンにとる」という戦術が議論を呼んでしまっているようです。
電脳麻将 のAIの現在の戦略は「テンパイ即リー」であり、押し引きアルゴリズムもリーチ者以外は無警戒としているので「敵を欺く」例題としては格好のケースに思えます*1。 さて、いったいどうなるでしょうか?
電脳麻将のアルゴリズムを「役ありテンパイならば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 と減少したのが響いたのでしょう。 やはり満貫以下の手はリーチした方がよさそうですね。