利用遗传算法框架gaft计算函数极值
2021/4/17 22:25:33
本文主要是介绍利用遗传算法框架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)
最终求出的极值图像如下:
这篇关于利用遗传算法框架gaft计算函数极值的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南