役の評価関数
役の評価関数の考え方
まず最初に断っておきますが、評価関数の決め方というのは自由であるということです。あくまでもここで解説する方法は一つの手法であり、他の考え方ももちろんありえます。そして現実の状態をうまく評価関数で表現することがより良い評価関数ということになります。
ここで使用する方法は、面子の分析を主体とします。
余り牌に刻子や順子なども加えて、面子及び面子候補を以下のように分類します。
- 中張牌のみで構成される順子
- 123/789の順子
- 中張牌の刻子
- ヤオ九牌の刻子
- 中張牌の対子
- 飜牌を除くヤオ九牌の対子
- 飜牌の対子
- 34/45/56/67の両搭
- 23/78の両搭
- 246/468の二嵌
- 135/579の二嵌
- 35/46/57の嵌搭
- 24/68の嵌搭
- 13/79の嵌搭
- 辺搭
- 4/5/6の浮き牌
- 3/7の浮き牌
- 2/8の浮き牌
- 1/9の浮き牌
- オタ風の浮き牌
- 飜牌の浮き牌
このように分類すると、平和やタンヤオなどの役ではどの面子または面子候補を重視・軽視すれば良いかがわかりますね。
今、ある牌姿ωを上記のような面子および面子候補に分類したとします。21個の分類があるわけですから21個の数字の組み合わせになります。より数学的な表現を使えば21次元のベクトル
vec(ω) = ( n1, n2, …, n21 )のように表されます。
なお、この分類の仕方は以前メルマガで解説したように、余り牌の取り方で何通りもの組み合わせがあるということを記憶にとどめておいてください。
一方、平和やタンヤオなどの個々の役 Y に対して上記の21個の分類に対してそれぞれ評価値を決めることができます。
これも21次元のベクトル
のように表すことができます。
このとき、この2つのベクトルの内積
vec(Y)・vec(ω) = (y1, y2, …, y21 )・( n1, n2, …, n21 ) = Σyi*niを牌姿ωの役Yによる評価として定義します。
そうすると
を役の評価関数の候補として考えることができます。
しかし、この評価関数にはいくつか問題点があります。
- 食い下がりの役・副露無効役の状態が反映されない
- アガリ形(四面子一雀頭、七対子、国士無双)による役評価の区別がない
- 混一色、清一色など同じ傾向の役は重複して評価されてしまう
これらについて、それぞれ検討していきます。
食い下がりの役・副露無効役の状態が反映されない
これについては比較的単純です。例えば副露しているかどうかの判定式を
isMenzen(ω) = 門前のとき1, 門前ではないとき0と定義し、役の飜数を
Han(Y, isMenzen(ω))
と定義することにより、
ΣHan(Y, isMenzen(ω)) * vec(Y)・vec(ω)
y∈役
の形にすることで食い下がりの役などについても反映させることができます。
アガリ形(四面子一雀頭、七対子、国士無双)による
役評価の区別がない
これについてはまず、以下のような関数を定義します。
getType(ω) = 牌姿ωのアガリ形(四面子一雀頭か七対子か国士無双)を返す
isYaku(Y, t) = 役 Y がアガリ形 t で有効なら 1, 無効なら 0 を返す
そうすると、評価関数を以下のように書き換えることで、アガリ形の違いにも対応できるようになります。
ΣisYaku(Y, getType(ω)) * Han(Y, isMenzen(ω)) * vec(Y)・vec(ω)
y∈役
混一色、清一色など同じ傾向の役は重複して評価されてしまう
まず、役は以下のように分類されます。
- タイプA:アガリ形のすべての牌に関係し、面子の組み合わせや状態によらない役(タンヤオ 混一色等)
- タイプB:アガリ形のすべての牌に関係し、面子の組み合わせや状態に依存する役(平和 対々和 七対子等)
- タイプC:アガリ形の一部の面子が条件を満たしたときに成立する役(飜牌 三色同順等)
- タイプD:アガリ形とは関係なく、特定の条件を満たすことで成立する役(立直 八連荘等)
- タイプE:偶発的な条件により成立する役(槍槓 嶺上開花等)
- タイプF:タイプA~Eに分類されない役(ドラ 流し満貫等)
上記タイプのうち、タイプDおよびタイプEは評価関数として考慮する必要はありません。また、国士無双以外の確率の低い役満貫についても考えないことにします。
そうすると残るのは以下の役です。
平和/タンヤオ/チャンタ/トイトイ/混老頭/飜牌/純チャン/混一色/清一色/三色同順/一気通貫/三暗刻/一盃口/二盃口/小三元/三槓子/三色同刻/三連刻/七対子/ドラ/国士無双
これをアガリ形によって両立しうる役で分類すると下記のようになります。
四面子一雀頭の形でできる役
平和/タンヤオ/チャンタ/トイトイ/混老頭/飜牌/純チャン/混一色/清一色/三色同順/一気通貫/三暗刻/一盃口/二盃口/小三元/三槓子/三色同刻/三連刻/ドラ
七対子の形でできる役
タンヤオ/混老頭/混一色/清一色/七対子/ドラ
国士無双の形でできる役
国士無双
では簡単なところから考えていきます。
まず、国士無双の形については同じ傾向の役での重複評価というものはありませんので無視して構いませんね。
次に七対子ですが、タンヤオと混老頭、混一色は重複することがありません。したがって、和了役としては
七対子/タンヤオ/清一色/ドラ
七対子/混老頭/混一色/ドラ
の2系統を考えれば良いでしょう。それぞれで役の評価値を計算し、大きい方を採用すれば役の重複評価は行われなくなります。
同様に四面子一雀頭の形についても分類してみます。ここでは結果のみ挙げておきます。なお、作られる可能性の低い三槓子/三色同刻/三連刻/二盃口については雀-Xでは無視しています。
平和/タンヤオ/三色同順/一盃口/ドラ
平和/タンヤオ/一盃口/清一色/ドラ
平和/一気通貫/一盃口/清一色/ドラ
平和/一気通貫/一盃口/混一色/ドラ
平和/チャンタ/一盃口/混一色/ドラ
平和/純チャン/一盃口/清一色/ドラ
平和/チャンタ/三色同順/一盃口/ドラ
平和/純チャン/三色同順/一盃口/ドラ
タンヤオ/三色同順/一盃口/ドラ
タンヤオ/トイトイ/三暗刻/清一色/ドラ
飜牌/三色同順/チャンタ/ドラ
飜牌/一気通貫/混一色/ドラ
飜牌/チャンタ/一盃口/小三元/ドラ
飜牌/トイトイ/三暗刻/混一色/小三元/混老頭/ドラ
飜牌/混一色/一盃口/小三元/ドラ
それぞれのパターンで評価値を計算し、一番値の高くなる組み合わせでの値を役の評価関数の値とします。
そして、牌の組み合わせパターンごとに上記の値を計算することで、一番役評価の高くなる組み合わせというものを算出できるようになります。