一、Geatpy实现遗传算法(一):编写脚本实现进化算法

本文介绍了如何使用Geatpy通过脚本实现遗传算法。主要涉及直接使用库函数求解问题的基本流程,包括导入库、定义目标函数、设置变量、染色体编码、配置算法参数、初始化种群及进化过程,最后是绘图和输出结果。
摘要由CSDN通过智能技术生成

一、概述

  在Geatpy上有3种基本的方法来求解问题:
  1. 直接使用工具箱提供的库函数,通过编写脚本来实现进化算法并且求解问题。
  2. 使用Geatpy提供的面向对象进化算法框架,利用内置的算法模板求解问题。
  3. 使用Geatpy提供的面向对象进化算法框架,通过自定义进化算法模板实现进化算法并且求解问题。
  本章将先介绍如何使用第一种方法。

二、基本流程

  脚本编程法是Geatpy最原生、最基础的使用方式。它通过直接调用工具箱的库函数来实现进化算法,不涉及面向对象的编程方法,编程风格与Matlab比较相似,缺点是代码量比较大。其详细编码流程如下:
  1.导入相关库,如numpy、Geatpy等。
  2.定义了优化目标函数。
  3.优化问题的变量设置。其中ranges、borders是根据实际问题而编写的,但写法格式是固定的。假如优化函数中包含3个变量,那么我们可以这么写:

x1 = [下界,上界]
x2 = [下界,上界]
x3 = [下界,上界]
b1 = [0, 1] # (这里0表示变量x1不包含下界,1表示包含上界)
b2 = [1, 0]
b3 = [1, 1]
ranges = np.vstack([x1, x2, x3]).T #根据x1,x2,x3生成一个矩阵来表示所有变量的范围
borders = np.vstack([b1, b2, b3]).T

  varTypes是一个存储决策变量类型的行向量。元素为0则对应的决策变量是连续型变量;为1则表示离散型决策变量。比如array([0,0,1])表示三个决策变量中的前2个是连续型变量,第三个是离散型变量。
  4.染色体编码设置:这一部分将设置进化算法采用何种编码的染色体种群进行进化。Encoding指定了染色体的编码方式。Encoding有三种类型:’BG’(二进制/格雷编码)、’RI’(实整数编码)以及’P’(排列编码)。当Encoding为’BG’时,需要用到codes、precisions、scales三个参数。这三个参数是给“crtfld”函数来自动化生成译码矩阵用的。
  准备好这些参数后,就可以调用crtfld()函数自动化生成译码矩阵(当然你也可以手动创建)。crtfld函数会根据变量的边界和精度自动地调整变量的范围,返回一个符合规范的译码矩阵。译码矩阵有“FieldD”和“FieldDR”两种类型。
  5.对进化算法的运行参数进行设置,比如确定种群规模(即种群包含多少个个体)、最大遗传代数、重组算子、变异算子、重组概率以及变异概率等。
  6.根据创建的译码矩阵计算染色体的长度。前面“Geatpy数据结构”章节中讲解了译码矩阵FieldD的第一行是代表控制各个变量的染色体基因数目。因此对它求和便可算出染色体的长度。
  7.创建进化记录器,它的写法也是固定的,2表示该进化记录器有2列,每一列存放不同的数据。本例中,它的第一列是存放各代种群最优个体的目标函数值;第二列是存放各代种群的平均目标函数值。
  8.创建最优个体记录器,记录各代种群的最优个体的染色体。
  9.做完这些基本步骤后,就开始初始化种群以及进化了,这些都是遗传算法的基本流程了,上面的注释中有详细解释,这里不再重复讲解。
  10.绘图和输出寻优结果。Geatpy中提供trcplot函数来根据进化记录器绘制进化过程追踪图。

三、Python实现

import numpy as np
import geatpy as ea
import time

def aim(Phen):
    x1 = Phen[:, [0]]
    x2 = Phen[:, [1]]
    return np.sin(x1 + x2) + (x1 - x2) ** 2 - 1.5 * x1 + 2.5 * x2 +1

"""============================变量设置============================"""
#定义决策变量范围
x1 = [-1.5, 4]
x2 = [-3, 4]
#定义决策变量边界,1表示包含范围的边界,0表示不包含
b1 = [1, 1]
b2 = [1, 1]
#生成自变量的范围矩阵,使得第一行为所有决策变量的下界,第二行为上界
ranges = np.array([x1, x2]).T
#生成自变量的边界矩阵
borders = np.array([b1, b2]).T
#决策变量的类型,0表示连续,1表示离散
varTypes = np.array([0, 0])

"""==========================染色体编码设置========================="""
#'BG'表示采用二进制/格雷编码
Encoding ='BG'
#决策变量的编码方式,两个1表示变量均使用格雷编码
codes = [1, 1]
#决策变量的编码精度,表示解码后能表示的决策变量的精度可达到小数点后6位
precisions =[6, 6]
#0表示采用算术刻度,1表示采用对数刻度
scales = [0, 0]
#调用函数创建译码矩阵
FieldD =ea.crtfld(Encoding, varTypes, ranges, borders, precisions, codes, scales)

"""=========================遗传算法参数设置========================"""
#种群个体数目
NIND = 20
#最大遗传代数
MAXGEN = 100
#表示目标函数是最小化,元素为-1则表示对应的目标函数是最大化
maxormins = np.array([1])
#采用随机抽样选择
selectStyle ='sus'
#采用两点交叉
recStyle ='xovdp'
#采用二进制染色体的变异算子
mutStyle ='mutbin'
#计算染色体长度
Lind =int(np.sum(FieldD[0, :]))
#交叉概率
pc= 0.9
#变异概率
pm= 1/Lind
#定义目标函数值记录器
obj_trace = np.zeros((MAXGEN, 2))
#染色体记录器,记录历代最优个体的染色体
var_trace = np.zeros((MAXGEN, 2))

""""=========================开始遗传算法进化========================"""
#开始计时
start_time = time.time()
#生成种群染色体矩阵
Chrom = ea.crtpc(Encoding, NIND, FieldD)
#对初始种群进行解码
variable = ea.bs2ri(Chrom, FieldD)
#计算初始种群个体的目标函数值
ObjV = aim(variable)
#计算当代最优个体的序号
best_ind = np.argmin(ObjV)
#开始进化
for gen in range(MAXGEN):
    #根据目标函数大小分配适应度值
    FitnV = ea.ranking(maxormins * ObjV)
    #选择
    SelCh = Chrom[ea.selecting(selectStyle, FitnV, NIND-1), :]
    #重组
    SelCh = ea.recombin(recStyle, SelCh, pc)
    #变异
    SelCh = ea.mutate(mutStyle, Encoding, SelCh, pm)
    #把父代精英个体与子代的染色体进行合并,得到新一代种群
    Chrom = np.vstack([Chrom[best_ind, :], SelCh])
    #对种群进行解码
    Phen = ea.bs2ri(Chrom, FieldD)
    #求种群个体的目标函数值
    ObjV = aim(Phen)
    #计算当代最优个体的序号
    best_ind = np.argmin(ObjV)
    #记录当代种群的目标函数均值
    obj_trace[gen,0] = np.sum(ObjV)/ObjV.shape[0]
    #记录当代种群最优个体目标函数值
    obj_trace[gen,1]=ObjV[best_ind]
    #记录当代种群最优个体的染色体
    var_trace[gen,:]=ea.bs2ri(Chrom[[best_ind],:], FieldD)
    #进化完成,结束计时
    end_time = time.time()

""""=========================输出结果========================"""
#输出目标函数最值
print('目标函数最值:{0}'.format(obj_trace[-1, 1]))
#对应变量值
print('对应的决策变量值为:{0},{1}'
      .format(var_trace[-1, 0], var_trace[-1, 1]))
#用时
print('用时:{0}'.format(end_time - start_time))
#绘制图像
ea.trcplot(obj_trace, [['种群个体平均目标函数值','种群最优个体目标函数值']])
ea.trcplot(var_trace, [['x1值','x2值']])

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、Tips

  编写Geatpy脚本风格与Matlab非常相近,对于新的问题,你可以复制上面的脚本,结合实际问题修改函数定义和变量设置,以及绘图和输出便可以对新问题进行求解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白银时代_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值