<p>因为遗传算法很有趣。。。:)</p>
<pre><code>import random
target_list = [1,2,3,4,5,6,7,8,9,10]
size_of_individual = len(target_list)
size_of_population = 100
n_generations = 10000
def score_fitness(individual):
return sum((val-target)**2 for val,target in zip(individual,target_list))
def create_individual():
return [random.random()*10 for _ in range(size_of_individual)]
def crossover(individual1,individual2):
return [val1 if random.random() < 0.5 else val2 for val1,val2 in zip(individual1,individual2)]
def mutate(individual,mutation_chance=0.1,mutation_size = 0.1):
def get_mutation(val):
return val if random.random()>mutation_chance else val + [-mutation_size,mutation_size][random.random()<0.5]
return [get_mutation(val) for val in individual]
def selection_step(sorted_old_population):
def select_one():
while True:
candidate_idx = random.randint(0,len(sorted_old_population)-1)
if random.randint(0,len(sorted_old_population))>= candidate_idx:
return sorted_old_population[candidate_idx]
selections = [select_one(),select_one()]
while selections[1] == selections[0]:
selections[1] = select_one()
return selections
def create_new_population(old_population,elitism=0):
sorted_population = sorted(old_population,key= score_fitness)
print "BEST OLD:",sorted_population[0],score_fitness(sorted_population[0])
print "AVG OLD:", sum(score_fitness(i) for i in sorted_population)
new_population = sorted_population[:elitism]
while len(new_population) < size_of_population:
new_population.append(mutate(crossover(*selection_step(sorted_population))))
return new_population[:size_of_population]
population = [create_individual() for _ in range(size_of_population)]
for i in range(n_generations):
population = create_new_population(population,5)
</code></pre>
<p>请记住,这对遗传算法来说是一个很糟糕的问题,而且还有很多改进的余地(即一起摆脱精英主义)</p>