首页 / 算法 / 利用遗传算法框架gaft计算函数极值
利用遗传算法框架gaft计算函数极值
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了利用遗传算法框架gaft计算函数极值,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2839字,纯文字阅读大概需要5分钟。
内容图文
![利用遗传算法框架gaft计算函数极值](/upload/InfoBanner/zyjiaocheng/592/fbe21b972b8f4972beeb548e9e0692f9.jpg)
的极大值,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计算函数极值全部内容,希望文章能够帮你解决利用遗传算法框架gaft计算函数极值所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。