简单的遗传算法实例

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)


#测试结果
==================== RESTART: /Users/zxy/Documents/GA.py ====================
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


   




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值