楽しいプロジェクトとして、Richard KorfのC#実装-パターンデータベースを使用したルービックキューブの最適解の検索に取り組んでいます。
https://www.cs.princeton.edu/courses/archive/fall06/cos402/papers/korfrubik.pdf
私は実際にそれを働いています、私は私のソリューションを改善しようとしています。
Korfが彼の論文で注目していることの1つは、パターンデータベースに格納してインデックスを付ける方法です。理想的には、ルービックキューブのインスタンスを使用して配列へのインデックスを生成したいと思います。
私の質問は、このインデックスを生成する最良の方法についてです。
私の解決策は、最小限の完全なハッシュを生成することです。これには、パターンデータベース全体が見つかるまですべてのキューブをメモリに保持し、それに基づいて最小限の完全なハッシュを生成することが含まれます。MPHの実行には、パターンデータベースのサイズに応じて数時間かかりますが、ディスクに保存するので、一度だけ実行する必要があります。結局、MPHだけを格納しているキューブ自体を捨てることができます。このようにして、ランダム化されたルービックキューブを取得し、パターンを適用してから、MPHで配列のインデックスを調べて、解の長さの見積もりを取得します。
KorfとShultzは、「Large Scale Breadth-First Search」と呼ばれる2005年の論文でキューブのインデックスを決定するためのより良い方法を説明していると思います。
https://www.aaai.org/Papers/AAAI/2005/AAAI05-219.pdf
このペーパーでは、順列の辞書式順序に基づいてインデックスを生成するアルゴリズムについて説明します。基本的に、順列{1、2、3}を取得し、それがインデックス0で最小であることを計算できます。{1、3、2}は、次のインデックス1などです。
このアルゴリズムをルービックキューブに適用してパターンデータベース内のインデックスを取得できるように思えますが、実際にどのように機能するかを理解するのに苦労しています。
たとえば、コーナーのみのパターンデータベースには、エッジステッカーが外されたすべてのルービックキューブが含まれています。このセットには正確に88,179,840のキューブがあります。ルービックキューブのコーナーキューブは、24の異なる状態のいずれかになります。8番目のコーナーキューブの状態は他の7つに基づいて計算できるため、コーナーのみのパターンデータベースのキューブはそれぞれ0〜23の7つの値を持っています。
たとえば、{0、3、6、9、9、12、15、18、21}は、すべてのエッジステッカーが削除された「解決済み」キューブを定義します。
前面を90度回転すると、順列は{0、3、11、23、12、15、8、20}になります。
これらの種類の順列からインデックスを取得する方法はありますか?