私は麻雀ソリティアソルバーを開発していて、これまでのところ、かなりうまくやっています。ただし、私が望むほど速くはないので、皆さんが知っているかもしれない追加の最適化手法を求めています。
すべてのタイルはレイアウトからわかりますが、解決策はわかりません。現時点では、同じタイルの特定のペアを安全に削除することを保証するルールはほとんどありません(これは可能な解決策の障害にはなりません)。
明確にするために、タイルはいつでも選択できる場合は無料で、他のタイルをまったくバインドしていない場合はタイルが緩んでいます。
- 無料の無料タイルが4つある場合は、すぐに削除します。
- 拾うことができるタイルが3つあり、そのうちの少なくとも1つが緩いタイルである場合は、緩んでいないタイルを取り外します。
- 拾うことができるタイルが3つあり、フリータイルが1つ(ルーズ2つ)しかない場合は、フリータイルとランダムルーズ1つを削除します。
- 使用可能なルーズタイルが3つある場合は、そのうちの2つを削除します(どちらでも構いません)。
- まったく同じタイルが4倍あるので、2つ残っている場合は、残っているのはそれらだけなので削除します。
私のアルゴリズムは、複数のスレッドでソリューションを再帰的に検索します。ブランチが終了し(これ以上移動がない位置に)、それが解決に至らなかった場合、それは悪いものを含むベクトルにその位置を置きます。これで、新しいブランチが起動されるたびに、その特定の位置がすでにチェックされているかどうかをチェックするために、悪い位置を繰り返し処理します。
このプロセスは、解決策が見つかるか、すべての可能な位置がチェックされるまで続きます。
これは、たとえば36または72タイルを含むレイアウトでうまく機能します。しかし、それ以上になると、検索する位置が膨大になるため、このアルゴリズムはほとんど役に立たなくなります。
ですから、安全なタイルの削除やアルゴリズムに関するその他の特定の高速化のために、より多くのルールを実装する方法について良いアイデアがあれば、もう一度お聞きします。
よろしくお願いいたします。nhaa123