首页 > 编程语言 > 详细

现代优化算法——遗传算法

时间:2020-11-27 17:23:25      阅读:80      评论:0      收藏:0      [点我收藏+]

简介

GA:根据群体搜索技术,根据适者生存原则逐代进化,最终得到最优解或准最优解。

需要的操作

  • 产生初始群体
  • 求每个个体适应度,选择优良个体
  • 父代优良个体两两配对,随机交叉染色体基因并随机变异某些染色体基因生成子代群体(变异操作是基于交叉后的染色体种群)

实现方法

  • 确定可行解域,确定编码方法,用字符串或数值串(基因序列)表示可行解域中的每一个解
  • 适应度函数度量每个解的好坏
  • 确定进化参数:群体规模M,交叉概率$p_c$,变异概率$p_m$,进化终止条件

分析

在传统的遗传算法中:

  • 变异操作在交叉操作的基础上进行,强调交叉作用,变异只是一个生物学机制;
  • 交叉操作中,常采用单点交叉/段交叉(随机产生交叉位置),多点交叉,均匀交叉;
  • 变异操作中,变异算子用 高斯分布的随即变异实现。

改进

  • 将变异操作从交叉操作中分离出来,使其成为并列于交叉操作的产生子代的寻优操作;
  • 交叉操作中,父代配对的个体采用“门当户对”原则(排序,较优对较优),混沌序列确定交叉点,单点交叉;
  • 变异操作中,混沌序列确定变异染色体及变异位置。

使用方法


参考blog

使用python第三方库geatpy,利用算法模板进行遗传进化求解
框架使用

示例:
技术分享图片

代码


import geatpy as ea
import numpy as np

class MyProblem(ea.Problem):
    def __init__(self):
        name="Problem_12.1" # 问题名称
        M=1 # 目标维度
        maxormins=[1] # 目标最小最大化标记,1:最小化该目标;-1:最大化该目标
        Dim=2 # 决策变量维度
        varTypes=[0]*Dim # 决策变量类型,0:连续性;1:离散型
        lb=[-100]*Dim # 决策变量下界
        ub=[100]*Dim # 决策变量上界
        lbin=[1]*Dim # 是否包括决策变量上界
        ubin=[1]*Dim # 是否包括决策变量下界
        # 调用父类构造方法完成实例化
        ea.Problem.__init__(self,name,M,maxormins,Dim,varTypes,lb,ub,lbin,ubin)

    def aimFunc(self,pop): # 目标函数
        x1=pop.Phen[:,[0]]
        x2=pop.Phen[:,[1]]
        f=(x1-2)**2+(x2-1)**2
        CV1=-x1+2*x2-1
        CV2=-x1*x1/4+x2*x2-1
        CV=np.hstack((CV1,CV2))
        pop.CV=CV # 约束矩阵(注意<=0表示满足,越大越不满足)
        pop.ObjV=f # 目标函数

# 实例化问题变量
problem=MyProblem()

‘‘‘----------------------种群设置--------------------------------------‘‘‘
Encoding=‘BG‘ # 编码方式,BG表示二进制/格雷编码
NIND=100 # 种群规模
Field=ea.crtfld(Encoding,problem.varTypes,problem.ranges,problem.borders) # 区域描述器
population=ea.Population(Encoding,Field,NIND) #生成初始种群


‘‘‘-----------------------算法模板调用------------------------------------‘‘‘
myAlgo=ea.soea_EGA_templet(problem,population)# 实例化算法模板对象
myAlgo.MAXGEN=200 # 最大进化代数
myAlgo.logTras=1 #每隔多少代记录日志,0表示不记录
myAlgo.verbose=True # 是否打印日志信息
myAlgo.drawing=1 # 绘图方式,1:绘制结果图 2:绘制目标空间过程动画 3:绘制决策空间过程动画


‘‘‘‘----------------------调用算法模板进行种群进化------------------------------‘‘‘
[BestIndi, population]=myAlgo.run()  # 执行算法模板,得到最优个体及最后一代种群
BestIndi.save() # 保存最优个体信息至文件

‘‘‘--------------------------输出结果----------------------------------------‘‘‘
print(‘用时:%f 秒‘ % myAlgo.passTime)
print(‘评价次数:%d 次‘ % myAlgo.evalsNum)
if BestIndi.sizes != 0:
    print(‘最优的目标函数值为:%s‘ % BestIndi.ObjV[0][0])
    print(‘最优的控制变量值为:‘)
    for i in range(BestIndi.Phen.shape[1]):
        print(BestIndi.Phen[0, i])
else:
    print("未找到可行解")

运行结果

用时:0.145813 秒
评价次数:19801 次
最优的目标函数值为:5.92308989399086e-10
最优的控制变量值为:
1.9999990463252288
0.9999756812933356

技术分享图片

分析

技术分享图片

geatpy算法箱算法模板:
技术分享图片

现代优化算法——遗传算法

原文:https://www.cnblogs.com/ShineMiao/p/14048200.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!