C でルービック キューブを解くためのプログラムを開発しようとしています。これにはバック トラッキング手法を使用しました。これは非常に長いプロセスであり、多くの反復が必要なため、解決できません。
他の手法やバックトラッキング自体の採用など、これをより効率的に解決する方法について提案してください。Google では、これを解決するためのショートカットがたくさん見つかりましたが、ショートカットを使用してこれを解決したくありません。
C でルービック キューブを解くためのプログラムを開発しようとしています。これにはバック トラッキング手法を使用しました。これは非常に長いプロセスであり、多くの反復が必要なため、解決できません。
他の手法やバックトラッキング自体の採用など、これをより効率的に解決する方法について提案してください。Google では、これを解決するためのショートカットがたくさん見つかりましたが、ショートカットを使用してこれを解決したくありません。
人間指向のソリューションを使用して、これをプログラムしてみませんか。
パターン マッチングが必要ですが、それほど難しくはありません。(1000x1000x1000 を解決するプログラムもあります)。
基本的な考え方は、段階的に作業することです。
レイヤーごとに、パターン X をパターン X' に変換するいくつかのアルゴリズムを実装します。フェーズの各ステップは、キューブを解決に近づける必要があります。これを行うには、各パターンに値を追加します (より高い値が未解決のキューブに与えられます)。また、難易度 (ターン数など) を追加して、難易度ごとの最高のバリュー ゲインに基づいてアルゴリズムを選択することもできます (または、最小のターンで最高の結果に到達することもできます)。
このアプローチの面白さは、必要に応じて新しいアルゴリズムを追加し、それらがどのくらいの頻度で使用されるかをテストできることです。したがって、各アルゴリズムの有用性をテストできます。
これらのギークポイントを本当に獲得したい場合は、別の言語を作成して、アルゴリズムとアルゴリズムが解決するパターンを記述してください。
ルービック問題を解くアルゴリズムはたくさんありますが、この最適なものを参照できます http://en.wikipedia.org/wiki/Optimal_solutions_for_Rubik's_Cube
ルービック キューブの状態空間サイズは 2 65のオーダーです。状態空間をやみくもに検索するバックトラッキング アルゴリズムは、解を見つける前に状態空間の大部分を調べる必要がある場合があるため、単純なバックトラッキング アルゴリズムがうまく機能しないことは明らかです。しかし、この問題はすでに何度も解決されています。たとえば、http ://www.cs.princeton.edu/courses/archive/fall06/cos402/papers/korfrubik.pdf を参照してください。
あなたの問題と、ショートカットの意味を理解しているかどうかはわかりません。ルービック キューブを解くために何らかの動的計画法を使用している場合は、解に到達するために十分なステップを先に見ていることを確認する必要があります。2 種類の移動 (右回転、上回転) のみをサポートする場合は、解決策を確実にするために、各移動を決定する前に 12 のステップ (確信はありません) を見る必要があると思います。
このようなことを行っていて、メモリのスペースが不足していることに気付いた場合は、適切なソリューションを決定するためにトラバースしているパスのみを保持する必要があることに注意してください (ツリー全体ではありません)。
Javaでルービックキューブを解決するためにこのアプローチをうまく使用したので、Cには問題がありません(メモリフットプリントに関する限り)。
関係する移動の数を気にしない場合は、ブルートフォースメソッドが機能するように状態空間を分割する方法があります。