My genetic algorithm attempts to evolve reasonable bouldering problems out of random sequences of holds. A bouldering problem is a short rock climbing route. This particular program assumes the bouldering wall being set on is about 15 feet high and 15 feet wide. The wall is thus represented as a 15x15 grid of bolt holes.
Some general principles used in the general boulder problem algorithm are that better routes use a reasonable number and variety of holds with a variety of orientations, start near the bottom of the wall and end near the top, have holds placed within a reasonable distance of each other (but not too close), and generally progress up the wall.
Some general principles used in the dyno boulder problem algorithm are that better dyno routes use fewer holds than a general route, tend towards slopers and jugs as holds (trying to avoid finger injuries sustained dynoing to crimps), place holds far apart, and generally progress up the wall.
While this program does evolve routes that get slightly better through generations, it's really just a very simple proof-of-concept sort of project. I do not include any logic for placing footholds, and the mechanics of generating random routes could be improved upon. Even the highly evolved routes can have undesirable traits. In addition, boulder problems are hard to create general rules for. There are plenty of great routes that break all the rules I created. In the future, I would probably change my focus to top rope routes. Roped routes really do have to progress upwards and not too far sideways. This is not a flexible rule. I think this would have better demonstrated the potential of a GA for climbing routes. There are a lot of aspects of my algorithm that I would rework should I continue developing it, but this very basic start was fun, and a good learning experience.
This section includes visuals with respect to hold types, RoboSetter's best and worst demo routes, and some boulder problems. It is intended to provide some background for those unfamiliar with climbing styles and vocabulary, and hopefully contextualize RoboSetter's routes to help understand the evolution from worst to best.
Hold and Route Visualizations
Hold/Route Object Code (Tasks 1-11)
Task 4: Mutation & Crossover Demo Programs
Task 8: Incorporating Mutation Demo
Task 10: Population Crossover Demo