利用遗传算法框架gaft计算函数极值

利用遗传算法框架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计算函数极值

上一篇:2021-05-22


下一篇:两个聚类算法