Python genetic algorithm
That is, more or less, a genetic algorithm, though it only implements mutation and not recombination:

@classmethod
def recombine(cls, parentA, parentB):
    traits = {}
    for t in ("r", "g", "b"):
        traits[t] = (getattr(parentA, t) + getattr(parentB, t))/2
    return cls(**traits)


There are, of course, many ways to implement recombination.  For example, instad of the simple averaging I do above, you could instead choose a random parent to take each trait from.  The best solution depends on your problem space.

To learn more, I'd suggest googling and finding tutorials or examples, and then trying to solve some more realistic problems with them.  Can you adapt them to solve any ProjectEuler problems?  Or find another application where they're useful?