defcrossover(pop,rate=0.7): # 注意这里只与自身种群发生变化 new_pop=[] for idx in pop.shape[0]: children=[] for father in pop[idx]: if np.random.rand()<rate: child=father mother=pop[idx][np.random.randn(0,Population_Nums)] # 随机选择发生互换的碱基对 choicePoint=np.random.randn(0,DNA_Size) child[choicePoint:]=mother[choicePoint:] # 发生变异 children.append(mutation(child)) return chidren
三、自然选择
这部分将会根据个体的适宜度分配权值,决定该个体基因出现在下一轮概率。
1 2 3 4 5
defselect(pop,fitness): pop_s=[] for i in pop: pop_s.append(i[np.random.choice(np.array(Population_Nums),size=Population_Nums,replace=True,p=(fitness)/(fitness.sum()))]) return pop_s
defmutation(self,pop): if np.random.rand()<self.mutationRate: pop[np.random.randint(0,self.DNA_Size)]^=1 return pop
交叉遗传:
1 2 3 4 5 6 7 8 9 10 11
defcrossover(self): for idx inrange(self.pop.shape[0]): for _,father inenumerate(self.pop[idx]): child = father if np.random.rand()<self.crossRate: mother=self.pop[idx][np.random.randint(0,self.popN)] crossPoint=np.random.randint(0,self.DNA_Size) child[crossPoint:]=mother[crossPoint:] self.pop[idx][_]=self.mutation(child)
自然选择:
1 2 3 4 5
defselect(self,fitness): pops=[] for i in self.pop: pops.append(i[np.random.choice(self.popN,size=self.popN,replace=True,p=fitness/(fitness.sum()))]) return pops
打印信息:
1 2 3
defgetInfo(self): print('最优参数为: ',[i for i in self.best]) print("最优结果为: ",self.bestScore)
defmutation(self,pop): if np.random.rand()<self.mutationRate: pop[np.random.randint(0,self.DNA_Size)]^=1 return pop
defcrossover(self): for idx inrange(self.pop.shape[0]): for _,father inenumerate(self.pop[idx]): child = father if np.random.rand()<self.crossRate: mother=self.pop[idx][np.random.randint(0,self.popN)] crossPoint=np.random.randint(0,self.DNA_Size) child[crossPoint:]=mother[crossPoint:] self.pop[idx][_]=self.mutation(child)
defselect(self,fitness): pops=[] for i in self.pop: pops.append(i[np.random.choice(self.popN,size=self.popN,replace=True,p=fitness/(fitness.sum()))]) return pops
defgetInfo(self): print('最优参数为: ',[i for i in self.best]) print("最优结果为: ",self.bestScore)
deftrain(self,plot=False): for _ inrange(self.Epochs): self.crossover()
f=self.fitness() max_fit = np.argmax(f) k=[(i[max_fit].dot(2**np.arange(self.DNA_Size))/float(2**self.DNA_Size))*(self.Range[idx][1]-self.Range[idx][0])+self.Range[idx][0] for idx,i inenumerate(self.pop)] bs=self.f(*k) if self.bestScore==Noneor bs>self.bestScore: self.bestScore=bs self.best=k self.pop = np.array(self.select(f))
if plot: self.plot_.append(bs)
self.getInfo() return self.best
defplot(self): if self.plot_==[]: pass plt.plot([i for i inrange(self.Epochs)],self.plot_) plt.xlabel("Epochs") plt.ylabel("BestValue") plt.show()