面子と面子候補の数え上げアルゴリズム
以上をふまえて、向聴数を正しく求めるための面子・面子候補数え上げアルゴリズムを考えると、次のようになります。
For すべての雀頭候補について
それを雀頭と仮定する
数牌の種類ごとに、
A:「面子×2 + 面子候補」が最大となる面子・面子候補を選ぶ
B:「面子×10 + 面子候補」が最大となる面子・面子候補を選ぶ
それらの組み合わせの中で、向聴数が最少となるものを探す
End
雀頭なしと仮定して同じ事を行う
このアルゴリズムに基づいてプログラムを作れば、正しい向聴数を求めることが出来ます。
雀頭を仮定する部分は、二枚以上持っている牌を探してfor文を回すだけでよいので、難しいところはありません。
一方、「面子×2 +
面子候補」や「面子×10 + 面子候補」が最大になるように面子・面子候補を選ぶ、という部分については、前述のように様々なケースが考えられますので、すべての組み合わせを試す必要があります。
通常は再帰関数を使って実装すると簡単にプログラムを書くことが出来るでしょう。つまり、考えられる面子・面子候補を取ってみて、残りの牌について同じ処理を再帰的に行えばよいということです。
これによって、正しい向聴数を求めることは出来るのですが、ひとつ大きな問題が残ります。
それは、計算時間がかかる、ということです。
向聴数を求めるというのは、麻雀のプログラムの中で基本的な処理ですので、おそらくかなりの回数呼ばれることになります。したがって、この処理を高速化するための工夫が必要になってきます。
向聴数計算アルゴリズムの高速化
まず考えられるのは孤立牌の除去です。
数牌の中で、他の牌と面子や面子候補を構成する可能性がないものについては、あらかじめ抜かして考えることが出来ます。
例えば、一四五と持っている場合、一については向聴数に影響を与えることはありませんので、最初から考慮する必要はありません。
細かいことのようですが、再帰処理の回数に関係してきますので結構な差になります。
しかし、上記の操作を行ったとしても、チンイツ系の手牌の場合にはどうしても計算量が多くなってしまいます。
その解決法として効果があるのが、次のページに示す方法です。
前へ 次へ
|