パターンデータベースへのインデックス作成-Korfの最適ルービックキューブソリューション


11

楽しいプロジェクトとして、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}になります。

これらの種類の順列からインデックスを取得する方法はありますか?


あなたはおそらくこれが面白いでしょう。
Tom van der Zanden、2016年

面白い!あなたは彼が紙の上で何かを「釉薬をかける」と言います。「肉付け」されていないセクションについては、より具体的にする方が良いでしょう。あなたはそれが機能しているとも言います 最初のインデックス作成の実装は何ですか?これは学校のプロジェクトですか?さらにコンピュータサイエンスチャットを提案してください。また、例えば、それについてブログを書いたり、コードをオープンソース化したりすることは、他の人に役立ち、詳細につながる可能性があります。また、この論文はハッシュ関数について言及していないようです...
vzn

私はコーフのアルゴリズムを実装しました:github.com/benbotto/rubiks-cube-cracker。私は中にそれについて記事を書いたので、私は、あまりにも、インデックス化が困難であることが判明:medium.com/@benjamin.botto/...は
avejidah

回答:


6

(pi,oi)(p0,,p7)(0,,7)oi{0,1,2}o7o0,,o68!37=88179840{0,,23}(pi,oi)(p0,,p7)o0,,o637p+o8!o+p


ユーバルさん、コメントありがとうございます。私にとって、0から23は、コーナーキューブが取り得る一意の位置/方向を識別する方法です。8位置x位置ごとの3方向=24。幸いにも、この値を個別の位置/方向のタプルに簡単に分割できます。あなたの答えは、あなたが説明しているアルゴリズムの実装であるこのコードに私を導きました。 github.com/brownan/Rubiks-Cube-Solver/blob/master/cornertable.c これをより一般的なものにするために少し作業を行う必要があります(「コーナーのみ」とは異なるパターンを処理できるようにするため)。私は正しいトラックthxにいます!
Cosmosis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.