简化遗传算法:
模拟物竞天择的生物进化过程,通过维护一个潜在解的群体执行了多方向的搜索,并支持这些方向上的信息构成和交换。以面为单位的搜索,比以点为单位的搜索,更能发现全局最优解。
- **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
刚开始写的时候没有用周期性边界条件,直接取两者的中间值为下一代,就导致了收敛老是在中间。
后来改进了一下周期性边界条件,让函数可以到边界值了。
当然了我的繁殖速度比较慢,所以收敛也比较慢。
代码初学者,风格不是很好,以后还会继续学习。