枝刈りDFS¶
DFS¶
ある手牌の向聴数を計算する方法として, すべての和了形との距離を計算するものがある. 重複を許すことにすればすべての和了形を探索することは下図の木のすべての葉ノードを訪問することに対応する(重複を許しても計算結果に影響を与えない). この木では根ノードが空の手牌に, 枝が面子または雀頭を手牌に追加する操作に対応している. なお, この図はイメージであり各ノードの子ノードの数は図の通りではない.
枝刈り¶
向聴数を計算するためには和了形との距離の最小値がわかれば十分である. そこで最小値を与えない葉ノードを子孫に持つノードへの訪問をできるだけ避けること(枝刈り)を考える. これには手牌への牌の追加に対して距離が(広義)単調増加することを利用する. 例えば手牌
木の拡張¶
向聴数を連立漸化式を解いて求めたい. 参照先のページで定義される
上図の木を探索することで正しく
参考¶
本アルゴリズムは以下のソースコードを参考にした.
https://github.com/gimite/MjaiClients/blob/master/src/org/ymatsux/mjai/client/ShantensuUtil.java