一种优化的Genetic Algorithm —— Python实现
优化内容:
1、 加入精英保护机制,种群内最优秀个体将被保留,精英更迭采用“打擂机制”,加快收敛。
2、 变异基因数服从泊松分布,模拟每个基因在同一时刻具有相同变异几率,接近实际。
3、 为获得更清晰的数学特性,增强对变异的可控性,不再使用常规GA的基因编码方式实现难以用数学概率描述的变异。
4、 指定变异造成的变化量与变异基因数目成指数关系(源代码采用2的幂级数),模拟自然界的基因变异影响,使得陷入局部最优的可能性下降,同时保证算法的搜索精度极高。
5、 加入适应度对变异率的影响,模仿自然界中,适应度越高的个体类型竞争压力越小,基因频率发生改变的概率越小。越不适应环境的个体相应的变异率会大大提升,变异的大小也因此增大。实验发现,这项优化减小了最优解附近的搜索步长,对减少最优解附近的振荡有非常明显的作用。
6、 适应度函数加入平方项,使得优劣个体差异增大,选择强度增大,加快收敛。实验发现,达到相同收敛程度的迭代次数至少减少了50%。
7、 在每一季度(每一次迭代更新一代)加入外来种群,采用在可行域均匀分布的随机生成,模拟外来个体的竞争压力,实验表明对防止陷入局部解有很明显的作用。
源代码:
# -*- coding: utf-8 -*-
# 遗传算法优化
from math import sin as sin
from math import cos as cos
from math import exp as exp
from random import random as rand
from random import shuffle as shuffle
from copy import copy
rg = [[-2.25, 2.5], [-2.5, 1.75]] # 搜索范围
ST = 25 # 约束条件
N = 300 # 初始种群规模
E = 0.05 # 适应度偏移修正
e = 0.01 # 变异基础值
T = 4 # 淘汰比率/每个个体平均产生配子数
n = 2 # 输入变量数/染色体数/修改这里以实现不同的模型
# g = 1000 # 输入空间分割数/决定单个性状的基因数(线性变异用)
g1 = 20 # 输入空间分割数/决定单个性状的基因数
e1 = 0.30 # 基础变异比率
times = 80