--- tags: hpc, algorithms, development date: 2018-03-20 --- # Rubik's Cube Solver For AP Computer Science, I was required to complete a programming project of some kind. Because of my interest in Rubik's Cubes, I decided to combine some of my passions and do something related to cubing for my project. ## Simulator I first decided to write a Python program to simulate a Rubik's Cube. A user would be able to enter moves on the command line and see a real-time display of the cube's state. Here is an example of what this looked like in 2x2 mode: ```{image} /_static/images/cube-solver-simulation.png ``` ## Solver After successfully accomplishing this goal, I decided to build out a solver capability. This is where it really got fun, and I was able to apply some of my CS/algorithms skills. ### Brute Force First, I tried making a brute force solution generator. It searched through every possible turn until a solution was found. However, this was extremely inefficient and could not feasibly be done, even in an entire lifetime. Read more on [The Devil's Algorithm](http://anttila.ca/michael/devilsalgorithm/) to understand how truly difficult this is. #### Parallel Version Since the regular brute force method didn't work and I had recently finished an internship at INL HPC, I set out to implement a parallelized version of this technique with MPI. I did this, and ran the code on my Raspberry Pi cluster. However, the problem complexity simply overpowered my very limited resources. ### State Inspection & Algorithm Selection Eventually, I realized that I make much better decisions than a brute force algorithm when solving a cube. I figured that a much more suitable approach would be to teach the computer what my method is, and let it generate solutions that way. I call this technique "state inspection and algorithm selection" since we strategically choose algorithms to get nearer to a solved state by inspecting the current state. Ultimately, this was the fastest and most efficient method. I turned it in as my AP Computer Science project and received full points.