def testDeathPenalty(self):
     fitness = MockFitness()
     offspring = [[8], [23], [1], [-1], [0], [15]]
     survivors = es.deathPenalty(offspring, fitness)
     self.assertEqual(survivors, [[8], [1], [0], [15]])
5. Use death penalty approach to weed out offspring that do not meet constraints
6. Create more offspring using steps 3, 4, and 5 until desired number of offspring reached
7. Do survivor selection using (mu, lambda) approach
8. Compare best of current generation with best overall. If current is better, make it the best overall
9. Repeat until maxGenerations reached
"""
random.seed(seed)

parents = es.createGeneration0(numParents, fitness, initialSigma, random.uniform)
parents = es.rank(parents, len(parents), fitness)
currentBest = parents[0]

for i in xrange(maxGenerations):
    validOffspring = []
    offspringNeeded = numOffspring
    while offspringNeeded > 0:
        offspring = es.recombination(parents, offspringNeeded, vRecombination, sRecombination, random.sample)      
        mutatedOffspring = es.mutation(offspring, random.gauss)
        validOffspring.extend(es.deathPenalty(mutatedOffspring, fitness))
        offspringNeeded = numOffspring - len(validOffspring)
    parents = survivorSelection(parents, validOffspring, fitness)
    currentBest = es.compareBestFitness(currentBest, parents[0], fitness)

    if log['sample'] is not None  and i % log['sample'] == 0:
        print "Generation {}:".format(i),
        print parents[0]
        print "Fitness = {}\n".format(fitness.calculate(*parents[0]))

print "Best x values: ",
print currentBest
print "Fitness = {}".format(fitness.calculate(*currentBest))