Javaでルービックキューブを解くための比較的簡単なアルゴリズムは何でしょうか。効率も重要ですが、二次的な考慮事項です。
私が見つけた最も単純な非自明なアルゴリズムはこれです:
http://www.chessandpoker.com/rubiks-cube-solution.html
コーディングは難しくありません。 Yannick M.の回答 に記載されているリンクも適切に見えますが、「 the cross 」ステップの解決策は少し複雑になるようです。
あなたが見てみたいかもしれない多くのオープンソースのソルバー実装があります。これが Python実装 です。この Javaアプレット にはソルバーも含まれており、ソースコードが利用可能です。 Javascript solver もあり、ダウンロード可能なソースコードも付いています。
Anthony Gatlinの答え は、このタスクに対するPrologの適切性について優れた点を示しています。独自の Prologソルバー を作成する方法に関する詳細な記事を以下に示します。それが使用するヒューリスティックは特に興味深いものです。
適切なソリューションが得られるまでランダムな操作を実行します。最も簡単なアルゴリズムで、最も効率が悪い。
チェックアウトしたいかもしれません: http://peter.stillhq.com/jasmine/rubikscubesolution.html
3x3x3ルービックキューブを解くアルゴリズムのグラフィック表示があります
あなたの質問がJavaに関連していることを理解していますが、実際には、Prologのような言語は、ルービックキューブを解くようなはるかに適した問題です。これはおそらくクラス向けだと思いますが、ツールの選択に関して余裕がないかもしれません。
1つの解決策は、すべての可能なルートを同時に実行することです。それは愚かに聞こえますが、これが論理です-可能なスクランブルの99%以上が20未満の移動で解決できます。これは、膨大な数の可能性を循環しても、最終的にはそれを実行することを意味します。基本的に、これは最初のステップをスクランブルキューブとして使用することで機能します。次に、最初のキューブで可能な移動ごとに、新しいキューブを変数に格納します。これらの新しいキューブのそれぞれについて、同じことを行います。可能な各移動の後、それが完了しているかどうかを確認し、完了している場合はそれが解決策です。ここにあなたがソリューションを持っていることを確認するために、あなたはその段階に到達するために行われた動きを言っている各ルービックキューブ上の追加のビットのデータを必要とするでしょう。
BFS(Breadth-First-Search)を行うことで実現できます。実装はそれほど難しいものではないと思います(これはグラフのカテゴリで最も単純なアルゴリズムの1つです)。キューと呼ばれるデータ構造でそれを行うことにより、実際に取り組むのは、BFSツリーを構築し、特定の条件から望ましい条件へのいわゆる最短経路を見つけることです。このアルゴリズムの欠点は、十分に効率的ではないことです(変更を加えないと、2x2x2の立方体をソルバーする場合でも、必要な時間は約5分です)。しかし、速度を上げるためのトリックをいつでも見つけることができます。
正直なところ、MITの「 Introduction of Algorithm 」というコースの宿題の1つです。これが宿題のリンクです: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011 /assignments/MIT6_006F11_ps6.pdf 。彼らはあなたがそれを視覚化し、あなたが不必要な努力を避けるのを助けるためにいくつかのライブラリを持っています。
参考までに、確かにこれを見ることができますJava実装。-> rubikの立方体を解くために2フェーズアルゴリズムを使用 。そして、このコードを試してみたところ、上手。