新手从零敲代码:遗传算法由简到繁(一)

简化遗传算法:
模拟物竞天择的生物进化过程,通过维护一个潜在解的群体执行了多方向的搜索,并支持这些方向上的信息构成和交换。以面为单位的搜索,比以点为单位的搜索,更能发现全局最优解。

  • **1.***这里我们的思想是不考虑基因变异。
  • **2.***只考虑遗传问题,并且用浮点型遗传。
  • **3.***我用了周期性来替代遗传变异问题。
  • 代码如下:
  • from random import uniform
    import matplotlib.pyplot as plt
    import numpy as np
    import ga_fun
    import time
    n=int(100) #输入第一代数目
    sdow=-1
    stop=2
    dets=abs(stop-sdow)
    sample=list()
    for i in range(n):
    sample.append(uniform(sdow,stop)) #这里我们随机产生了100个生物


上面是产生的结果,函数用的就是:
def fun(x):
y=xnp.sin(103.1415926*x)
return y

这里面我做了简化,一次只杀死最靠后的两个排名,然后再随机生两个新的样本:

def fitness(fix,sdow,stop):
    detl=abs(stop-sdow)
    #kill
    for i in range(2):
        n_ki,c_ki=np.where(fix==np.min(fix[:,1]))
        #print(n_ki[0])
        fix=np.delete(fix,n_ki[0],axis=0)
    fixlist=[0,0]
    rd=[]
    ge=np.array([0.0,0.0,0.0,0.0])
    #select
    total=0
    for i in range(len(fix[:,1])):
        total+=abs(fix[i,1])
        fixlist=np.append(fixlist,total)
    for i in range(4):
        #print(fixlist[1],fixlist[-1])
        rd.append(random.uniform(fixlist[1],fixlist[-1]))
        
    for i in range(len(fix[:,0])):
        for j in range(4):
            if fixlist[i]<rd[j]<fixlist[i+1]:
                ge[j]=fix[i,0]
    
                
    detge1=((ge[0]-ge[1])/2)
    avege1=(ge[0]+ge[1])/2+random.uniform(-detge1,detge1)
    detge2=((ge[2]-ge[3])/2)
    avege2=(ge[2]+ge[3])/2+random.uniform(-detge2,detge2)
    #这里用了一下周期性边界条件,这样繁殖出来的样本才容易到边界
    if avege1<sdow:
        avege1=avege1+detl
    if avege1>stop:
        avege1=avege1-detl
    if avege2<sdow:
        avege2=avege2+detl
    if avege1>stop:
        avege2=avege2-detl
    newfix=fix
    bf=[[avege1,fun(avege1)],[avege2,fun(avege2)]]
    newfix=np.vstack((newfix,bf))
    
    return newfix

刚开始写的时候没有用周期性边界条件,直接取两者的中间值为下一代,就导致了收敛老是在中间。

在这里插入图片描述

后来改进了一下周期性边界条件,让函数可以到边界值了。

在这里插入图片描述
当然了我的繁殖速度比较慢,所以收敛也比较慢。

代码初学者,风格不是很好,以后还会继续学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值