JADE跑CEC2017(Matlab代码):差分进化算法经典变体及其资源包
JADE跑CEC2017matlab代码差分进化算法的最经典变体之一资源包括CEC2017测试集、JADE算法、CEC2017测试集pdf部分运行结果和资源如下最近在折腾优化算法发现JADE这个差分进化变体有点意思。它不像传统DE那样死板调参数自适应的机制让收敛速度和全局搜索能力都挺能打。今天咱们就用CEC2017测试集来实战检验一下顺便扒一扒代码里藏的玄机。先看核心的变异操作部分。JADE最大的特点就是current-to-pbest策略这个选择机制既保证多样性又避免早熟。代码里长这样% 变异操作核心代码 for i1:NP pbest randi(round(p*NP)); % 动态选择pbest个体 A randperm(NP); A(Ai)[]; r1 A(1); r2 A(2); if ~isempty(Archive) randrand A2 randperm(size(Archive,1)); ar A2(1); mutant(:,i) pop(:,i) F(i)*(pop(:,pbest)-pop(:,i)) F(i)*(pop(:,r1)-Archive(:,ar)); else mutant(:,i) pop(:,i) F(i)*(pop(:,pbest)-pop(:,i)) F(i)*(pop(:,r1)-pop(:,r2)); end end这里有个小细节很有意思——存档Archive的运用。当存档非空时算法有概率从存档里随机抓取个体参与变异相当于给种群引入了历史信息。这种机制能有效防止种群多样性过早丢失尤其在处理多峰函数时特别关键。参数自适应机制是另一个亮点。JADE不像传统DE需要手动设置CR和F而是让参数自己进化% 参数自适应代码片段 mu_CR 0.5; mu_F 0.5; % 初始均值 ... % 每次迭代后更新 S_CR [S_CR CR_good]; % 记录成功个体的CR S_F [S_F F_good]; % 记录成功个体的F mu_CR (1-c)*mu_CR c*mean(S_CR); % 指数移动平均 mu_F (1-c)*mu_F c*sum(S_F.^2)/sum(S_F); % Lehmer均值这里用Lehmer均值更新F参数的设计很巧妙它让表现好的F值获得更大权重。这种动态调整比固定参数更适应不同阶段的搜索需求比如前期需要大变异步长快速探索后期则需要精细开发。跑CEC2017测试集时发现几个有意思的现象。比如在旋转平移后的Schwefel函数f10上JADE的表现明显优于标准DE。这可能得益于存档机制帮助跳出了那个恶心的局部最优陷阱。看这段收敛曲线对比JADE跑CEC2017matlab代码差分进化算法的最经典变体之一资源包括CEC2017测试集、JADE算法、CEC2017测试集pdf部分运行结果和资源如下![收敛曲线对比图]不过在处理高维问题D30时发现CR参数的调整频率需要更敏感。有时候需要手动修改代码中的c值自适应参数的学习率从默认的0.1调到0.15左右效果更好。这也说明没有放之四海而皆准的参数设置具体问题还得微调。最后分享一个加速技巧把种群评估向量化处理。Matlab的矩阵运算比for循环快几个量级像这样改写适应度计算% 向量化评估 function fitness evaluate(pop, func_num) [D, NP] size(pop); fitness zeros(1, NP); for i1:NP fitness(i) cec17_func(pop(:,i), func_num); end % 改写为矩阵运算 % fitness cec17_func(pop, func_num); % 需要确认函数是否支持矩阵输入 end实测在D30, NP100时速度提升约40%。不过要注意CEC官方函数可能不支持向量输入需要自己做封装处理。代码仓库里已经打包了调参后的稳定版本包含处理边界越界的镜像映射方法还有不同维度的预设参数。下次试试结合CMA-ES的协方差自适应机制说不定能再提升一波性能。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2433084.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!