import random
import datetime
#基因范围
genes=' abcdefghijklmnopqrstABCDEFGHIJKLMNOPQRSTUVWXYZ!'#注意首行有个空格
#目标
target='Genetic Algorithm!'
def generate_parent(length):
sample=[]
#如果生成的序列的长度大于genres的长度,需要使用循环来生成 \
while length>len(genes):
sample.extend(random.sample(genes,len(genes)))
length-=len(genes)
#这个地方要使用extend,添加可迭代对象的元素到sample列表里面
# append是添加对象在列表里面
sample.extend(random.sample(genes,length))
return ''.join(sample)
def get_fitness(guess):
return sum([1 for k,v in zip(guess,target) if k==v])
def mutate(parent):
index=random.randrange(0,len(parent))
child=list(parent)
new,alt=random.sample(genes,2)
child[index]=new if child[index]!=new else alt
return ''.join(child)
def display(guess):
timediff=datetime.datetime.now()-starttime
fitness = get_fitness(guess)
print("{0}\t{1}\t{2}".format(guess, fitness, str(timediff)))
random.seed()
starttime=datetime.datetime.now()
bestparent=generate_parent(len(target))
bestfitness=get_fitness(bestparent)
display(bestparent)
count=0
while True:
'''这部分代码是最关键的
首先看新生成的孩子的匹配度是否高于父亲的匹配度
如果是,则把该孩子作为下一代的父亲
如果不是,直接舍弃掉。
这样可以保证输出准确的结果
由于每次只对一个基因进行突变,所以每次匹配度最多增加1
count 记录了总共循环的次数
'''
count+=1
child=mutate(bestparent) #突变
childfitness=get_fitness(child)
if childfitness<=bestfitness:
continue
display(child)
if get_fitness(child)==len(target):
break
bestparent=child
bestfitness=get_fitness(child)
print(count)
DZTCoKbpFIPjMGlnXW 0 0:00:00.000334
DZTCtKbpFIPjMGlnXW 1 0:00:00.137380
DZTCtKbpFIPjrGlnXW 2 0:00:00.250656
DZTCtibpFIPjrGlnXW 3 0:00:00.371055
DZTCtibpFIPjrGlhXW 4 0:00:00.464222
DZTCtibpFIPjrGlhmW 5 0:00:00.583061
GZTCtibpFIPjrGlhmW 6 0:00:00.703987
GZTCtibpFIPjrilhmW 7 0:00:00.800174
GZTCtibpAIPjrilhmW 8 0:00:00.900482
GZTCtib AIPjrilhmW 9 0:00:00.972964
GeTCtib AIPjrilhmW 10 0:00:01.082624
GeTCtib AIPjrithmW 11 0:00:01.202221
GenCtib AIPjrithmW 12 0:00:01.324595
Genetib AIPjrithmW 13 0:00:01.398448
Genetib AlPjrithmW 14 0:00:01.474818
Genetib AlgjrithmW 15 0:00:01.567963
Genetib Algjrithm! 16 0:00:01.684794
Genetib Algorithm! 17 0:00:01.743722
Genetic Algorithm! 18 0:00:01.823464
2417