Genetic algorithm in Python that plots its evolution
random.seed is a bug: add parentheses to actually call the function.
Use collections.namedtuple so you can write member.fitness instead of the less readable member[0]
copy.deepcopy should not be necessary in a functional approach
Keeping the genes in a tuple instead of a list would make the member tuple fully immutable, in line with the functional approach. This eliminates the need to deep-copy objects as you can safely copy just references.


After these changes create_member becomes like this:

import collections
Member = collections.namedtuple("Member", "fitness genes")

def create_member(genes):
    genes = tuple(genes)
    return Member(sum(genes), genes)


In some places you create members without calling create_member. Be sure to change them, for example:

def mutate_member(member, rate=1):
    return create_member(mutate_genes(member.genes, rate))



With immutable members there is no need to recalculate fitnesses. You can delete such functions.