A few points of feedback though:
Typically, what you are calling "genes" are called "chromosomes". Calling them "genes" is confusing because genes typically refer to smaller hereditary units (generally an individual bit on the chromosome). It would also be helpful if you mentioned that what you call "mating" is usually called "crossover".
Also this bit is rather inaccurate in terms of theory:
>Mating alone has a little bit of a problem: in-breeding. If all you do is mate your candidates to go from generation to generation, you run the risk of getting stuck near a “local optimum”: an answer that’s pretty good but not necessarily the “global optimum” (the best you can hope for).
You're sort of looking at all of GA backwards here. Mutation is the main way that a GA arrives at new innovations, and an algorithm with no crossover will do usually pretty well, but will be prone to getting stuck in local optima. This is because it is possible to arrive at a solution where no incremental change can improve the fitness.
Crossover is somewhat helpful against local optima because it allows the algorithm to try combinations of innovations from different solutions. Depending on the fitness landscape, this can be either helpful or useless. Regardless, a GA will, on any non-trivial problem, almost certainly get stuck on a local optimum, which is a very important point for users of GAs to realize.
But what is not the case is that mutation prevents crossover from hitting a local optimum. Crossover by itself basically just won't optimize at all. It's generally best to think of a GA as being driven primarily by mutation and selection, with crossover as a tweak that can make the search more efficient.