声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~
目录
今天给大家带来一期CEC冠军算法介绍!冠军算法一般指国际进化计算大会(CEC)中的Top算法(一般为前三),计算机领域也经常成为SOTA算法。通常来说,这些算法通常也是差分进化算法的变体,因为差分进化算法的性能属于非常经典的进化算法,有很强的进化能力。
我们要介绍的算法,JADE由Jingqiao Zhang于2009年发表于SCI一区顶刊《IEEE TRANSACTIONS ON EVOLUTIONARY COMPUTATION》上!它通过引入外部档案库和自适应地更新控制参数,实现了DE/current-to-pbest的变异策略,提高了优化性能。而可选的存档操作利用历史数据提供了前进方向的信息。
本期代码在CEC2017上进行测试,函数格式均已调整成经典的6输入3输出格式,如果大家需要替换成自己的对比算法非常方便!
您只需做的工作:一键运行main文件即可出图!非常适合新手小白!
原理简介
一、变异策略 DE/current-to-pbest
JADE 定义了“DE/current-to-pbest”如下(无外部存档时):
其中:𝐱𝑝_𝑏𝑒𝑠𝑡,𝑔从当前种群按目标函数值排序后排在前100𝑝%的精英解中随机选出,𝐱𝑟1,𝑔和𝐱𝑟2,𝑔分别从当前种群随机选出,且与𝐱𝑖,𝑔不同;𝐹𝑖为第𝑖个个体对应的变异因子。
如果启用了外部存档 𝐴,则有:
其中𝐱˜𝑟2,𝑔从(𝑃 ∪𝐴)中随机选取,𝑃为当前种群,𝐴为外部存档(存储上代被淘汰的个体,容量通常限制在𝑁𝑃以内)。
二、交叉(Crossover)
采用二进制交叉(binomial crossover)生成子代向量 𝐮𝑖,𝑔:
其中𝑗𝑟𝑎𝑛𝑑是在[1,𝐷]随机选出的整型索引,𝐶𝑅𝑖为交叉概率。
三、选择(Selection)
在第𝑔代,若子代𝐮𝑖,𝑔的适应度优于父代𝐱𝑖,𝑔,则令𝐱𝑖,𝑔+1 =𝐮𝑖,𝑔;否则保持父代不变。若启 用了存档,则把被淘汰的父代𝐱𝑖,𝑔放入存档𝐴。
四、自适应参数更新
JADE中,每个个体𝑖的𝐹𝑖和𝐶𝑅𝑖都是从某一分布中随机生成的,并在迭代中持续“学习”成功参数。设𝜇𝐹和𝜇𝐶𝑅分别是这两种分布的中心,初始都为0.5。
对交叉概率 𝐶𝑅𝑖:
生成后若超出 [0,1] 则截断。收集本代中所有成功(即子代优于父代)的 𝐶𝑅𝑖 于 集合 𝑆𝐶𝑅,在代末更新:
其中 0<𝑐<1 为学习率,mean(⋅) 表示算术平均值。
对变异因子 𝐹𝑖:
分布为截断柯西分布,若 𝐹𝑖≤0 则重采样,若 𝐹𝑖≥1 则可截断为 1。收集所有 成功的 𝐹𝑖 于集合 𝑆𝐹,在代末更新:
其中 meanL(⋅) 为 Lehmer 均值:
通过以上机制,JADE 可以在保证利用精英解方向信息的同时,保留足够多样性,结合外部存档还能进一步获取更多差分向量以防止早熟收敛,整体表现出较好的全局搜索效率与可靠性。
算法伪代码
为了使大家更好地理解,这边给出作者算法的伪代码,非常清晰!
如果实在看不懂,不用担心,可以看下源代码,再结合上文公式理解就一目了然了!
性能测评
为了方便大家对比与理解,我们采用29个CEC2017函数,设置种群数量为30,迭代次数为500,和原始且经典的差分进化算法进行对比!这边展示其中5个测试函数的图,其余几十个个测试函数大家可以自行切换尝试!
可以看到,这个算法在DE算法的基础上有很大的改进,大部分函数上均优于DE算法,表明其寻优能力非常强!大家应用到各类预测、优化问题中也是一个不错的选择~
部分代码展示
%% 清除环境变量
clear
clc
close all
addpath(genpath(pwd));
%% 参数设置
pop_size = 30; % 种群规模
max_iter = 500; % 最大迭代次数
Function_name = 'F1'; % CEC2017测试函数: F1,F3-F30(F2被删除,勿选)
[lb, ub, dim, fobj] = CEC2017(Function_name); % 加载所选基准函数的详细信息
%% 运行各算法
[JADE_Best_score,~,JADE_curve] = JADE(pop_size,max_iter,lb,ub,dim,fobj);
[DE_Best_score,~,DE_curve] = DE(pop_size,max_iter,lb,ub,dim,fobj);
%% 显示结果
display(['JADE在函数' [num2str(Function_name)],'上的最优值', num2str(JADE_Best_score)]);
display(['DE在函数' [num2str(Function_name)],'上的最优值', num2str(DE_Best_score)]);
%% 画图
figure1 = figure('Color',[1 1 1]);
G1=subplot(1,2,1,'Parent',figure1);
完整代码获取
如果需要以上完整代码,只需点击下方小卡片,再后台回复关键字,不区分大小写:
JADE