利用遗传算法框架gaft计算函数极值
作者:互联网
的极大值,x的取值范围为[0,10]
# 遗传算法的一个框架gaft,pip install gaft
from gaft.components import BinaryIndividual# 个体
from gaft.components import Population# 种群
from gaft.operators import RouletteWheelSelection,TournamentSelection # 轮盘赌算法
from gaft.operators import UniformCrossover # 均匀交叉
from gaft.operators import FlipBitMutation #翻转位突变
from gaft import GAEngine # 引擎
from gaft.plugin_interfaces.analysis import OnTheFlyAnalysis # 分析插件
from gaft.analysis.fitness_store import FitnessStore# 用于迭代期间存储与适应度相关的数据
from math import sin,cos
from matplotlib import pyplot as plt
import numpy as np
# 建立个体 模板
# ranges 表达个体数据取值范围
# eps 二元序列的递减精度
indv_template=BinaryIndividual(ranges=[(0,10)],eps=0.0001)
# 个体组成种群
population=Population(indv_template=indv_template,size=50).init()
# 创建遗传算法算子
# 轮盘赌算法进行适应度选择
selection=RouletteWheelSelection()
# selection=TournamentSelection()# 联赛选择,k个竞争个体产生下一代,优胜劣出,随机挑选k个竞争者,交配池中竞争每一个基因遗传,适应性较好的将获得该基因遗传权
# 基因交叉、变异
crossover=UniformCrossover(pc=0.8,pe=0.5)
# pc(crossover probaility) 交叉概率
# pe (genome exchange probaility) 基因组交换概率
mulation=FlipBitMutation(pm=0.1)# 翻转位突变
# pm(mutation probaility) 突变概率
# 创建遗传算法引擎(绑定轮盘赌算法,交叉、变异、适应度函数、分析插件)
engine=GAEngine(population=population,selection=selection,crossover=crossover,mutation=mulation,analysis=[FitnessStore])
# 绑定适应度函数
@engine.fitness_register
def fitness(indv):
# 求最大解
x,=indv.solution #取出个体数据
return x+10*sin(5*x)+7*cos(4*x)
# ** 额外的自定义分析插件
@engine.analysis_register
class ConsoleOutputAnalysis(OnTheFlyAnalysis):
interval=1
master_only=True
# 必须这么写,因为这里是重写OnTheFlyAnalysis的register_step函数
# 所以函数名和参数名必须一致,否则会出问题
# 输出每一次迭代过程数据
def register_step(self,g,population,engine):
best_indv=population.best_indv(engine.fitness)# 求最优解的操作
msg='Generation:{},best fitness:{:.3f}'.format(g,engine.fitness(best_indv))
engine.logger.info(msg)# 呈现文本
# 函数名和函数内容必须这么写
# 输出最后结论数据
def finalize(self,population,engine):
best_indv=population.best_indv(engine.fitness)# 求最优解的操作
x=best_indv.solution # 获取值
y=engine.fitness(best_indv)# 得到函数最优解对应的值
msg='Optimal solution:({},{})'.format(x[0],y)
# 换一个图,来呈现一元方程以及最优解位置
x_data=np.arange(1000)/100 # 数值控制在(0,10)之间
y_data=x_data+10*np.sin(5*x_data)+7*np.cos(4*x_data)
plt.plot(x_data,y_data)
plt.scatter(x[0],y,edgecolors='red',marker='*')
plt.plot(x_data,[y]*1000,'-.') # 换一个线段,表达最高点的位置
plt.text(x[0]+0.1,y+0.1,'({:.2f},{:.2f})'.format(x[0],y)) # 标记最优解的点
plt.show()
engine.logger.info(msg)
# 执行引擎
if __name__=='__main__':
# ng迭代次数
engine.run(ng=100)
最终求出的极值图像如下:
标签:engine,indv,fitness,best,import,遗传算法,极值,gaft 来源: https://blog.csdn.net/bian_h_f612701198412/article/details/115802497