JADE: Adaptive Differential Evolution withOptional External Archive

news2024/12/29 8:24:52

0、论文背景

本文在DE的基础上,提出了一种新的差分进化(DE)算法JADE,通过实现一种新的突变策略DE/current-to-pbest,采用可选的外部存档参数的自适应更新,来提高优化性能。上述两种操作使种群多样化,并提高了收敛性能。

Zhang J, Sanderson A C. JADE: adaptive differential evolution with optional external archive[J]. IEEE Transactions on evolutionary computation, 2009, 13(5): 945-958.

 

 1、JADE

JADE是在DE的基础上提出来的,有关DE,参见博客:DE。JADE采用了DE/current-to-pbest的突变策略,F和CR的值采用外部存档的方式动态自适应更新,JADE算法流程图如下所示。

 

1.1 DE/current-to-pbest

DE/current-to-pbest是在DE/current-to-best/1的基础上改进得到的,DE/current-to-best/1:

\mathbf{v}_{i, g}=\mathbf{x}_{i, g}+F_{i} \cdot\left(\mathbf{x}_{\text {best }, g}-\mathbf{x}_{i, g}\right)+F_{i} \cdot\left(\mathbf{x}_{r 1, g}-\mathbf{x}_{r 2, g}\right)

但是它有个问题,会出现收敛过早的情况。为了解决这个问题,为了增加突变后种群的多样性,提出了DE/current-to-pbest:

\mathbf{v}_{i, g}=\mathbf{x}_{i, g}+F_{i}\left(\mathbf{x}_{\text {best }, g}^{p}-\mathbf{x}_{i, g}\right)+F_{i}\left(\mathbf{x}_{r 1, g}-\tilde{\mathbf{x}}_{r 2, g}\right)

其中x_{\text {best, } g}^{p}被随机选择为当前种群中前100p%的个体之一,p∈(0,1],p决定了突变策略的贪婪性,p越大,突变后种群的多样性越高。而\tilde{\mathbf{x}}_{r 2, g}是从P∪A中随机选择的,引入A也是想提高突变后种群的多样性。

A为存档的次等解的集合,P为当前的总体。在迭代过程中,在选择过程中失败的种群将被添加到A中。如果存档大小超过了一定的阈值(NP),那么将从存档中随机删除一些解决方案,以保持A(存档)大小在NP。

1.2 F和CR的自适应

CR采用正太分布随机数,\mu_{C R}的初始值设置为0.5:

C R_{i}=\operatorname{randn}_{i}\left(\mu_{C R}, 0.1\right)

\mu_{C R}的更新为:

\mu_{C R}=(1-c) \cdot \mu_{C R}+c \cdot \operatorname{mean}_{A}\left(S_{C R}\right)

其中c是0和1之间的正数,c控制参数自适应的速率。meanA(·)是通常的算术平均值。S_{CR}是每次选择成功后的种群的CR值集合。

F采用柯西分布随机数,因为与正态分布相比,柯西分布更有利于使突变因子多样化,从而避免了贪婪突变策略中经常发生的过早收敛,\mu _{F}的初始值设置为0.5:

\mu_{F}=(1-c) \cdot \mu_{F}+c \cdot \operatorname{mean}_{L}\left(S_{F}\right)

meanL(·)是Lehmer的平均值:

\operatorname{mean}_{L}\left(S_{F}\right)=\frac{\sum_{F \in S_{F}} F^{2}}{\sum_{F \in S_{F}} F}

Lehmer均值有助于传播更大的突变因子,而F越大,有助于增加种群多样性,防止过早收敛

2、算法的复现和简单实验

有关SaNSDE,请参见博客:SaNSDE。

JADE复现代码:

function [globalBest, globalBestFitness, FitnessHistory] = JADE(popsize, maxIteration,dim, LB, UB, Fun)

Sol(popsize, dim) = 0;    % 种群的初始化和计算适应度值
Fitness(popsize) = 0;
for i = 1 : popsize
    Sol(i, :) = LB + (UB - LB) .* rand(1, dim);
    Fitness(i) = Fun(Sol(i, :));
end

[fbest, bestIndex] = min(Fitness);    % 获得全局最优值以及对应的种群向量
globalBest = Sol(bestIndex, :); 
globalBestFitness = fbest; 
muCR = 0.5;    % 相关变量的初始化
muF = 0.5;
A = [];
p = 0.05;
c = 0.2;

for time = 1 : maxIteration
    SF = [];
    SCR = [];
    for i = 1 : popsize

        CR = normrnd(muCR, 0.1);    % 正太随机数
        %pd = makedist('tLocationScale', 'mu', muF, 'sigma', 0.1, 'nu', 1);
        % F = random(pd, 1, 1);    
        F = Cauchy_rand(muF, 0.1);    % 柯西随机数

        [~, sortIndex] = sort(Fitness);    % 随机选择前 popsize * p 对应的 xPBest
        sortSol = Sol(sortIndex, :);
        xPBest = sortSol(randi(p * popsize), :);

        r1 = randi(popsize);
        while r1 == i
            r1 = randi(popsize);
        end
        SolA = [Sol; A];
        r2 = randi(size(SolA, 1));
        while r2 == r1 || r2 == i
            r2 = randi(size(SolA, 1));
        end
        mutantPos = Sol(i, :) + F * (xPBest - Sol(i, :)) + F * (Sol(r1, :) - SolA(r2, :));    % 突变

        jj = randi(dim);  % 选择至少一维发生交叉
        for d = 1:dim
            if rand() < CR || d == jj
                crossoverPos(d) = mutantPos(d);
            else
                crossoverPos(d) = Sol(i,d);
            end
        end
        
        crossoverPos(crossoverPos>UB) = UB(crossoverPos>UB);     % 检查是否越界
        crossoverPos(crossoverPos<LB) = LB(crossoverPos<LB);
        
        evalNewPos = Fun(crossoverPos);    % 将突变和交叉后的变量重新评估
        if evalNewPos < Fitness(i)    % 小于原有值就更新
            A = [A; Sol(i,:)];
            if size(A, 1) > popsize
                A(randi(size(A, 1)), :) = [];    % 保持A的数目不超过popsize
            end
            SCR = [SCR; CR];
            SF = [SF; F];
            Sol(i,:) = crossoverPos;
            Fitness(i) = evalNewPos;
        end
    end

    muCR = (1 - c) * muCR + c * mean(SCR);
    muF = (1 - c) * muF + c * (sum(SF .* SF) / sum(SF));

    [fbest, bestIndex] = min(Fitness);
    globalBest = Sol(bestIndex,:);
    globalBestFitness = fbest;
    
    FitnessHistory(time) = fbest;    % 存储每次迭代的最优值
end
end
clc;clear;clearvars;
addpath('CEC2008\');
global initial_flag
initial_flag = 0;

% 初始化变量维度,种群数,最大迭代次数,搜索区间,F,CR
dim = 30;
popsize = 100;
maxIteration = 1000;
LB = -100 * ones(1, dim);
UB = 100 * ones(1, dim);
F = 1;
CR = 0.9;

[globalBest, globalBestFitness, FitnessHistory] = DE(popsize, maxIteration,dim, LB, UB, F, CR,  @(x)benchmark_func(x,1));
[globalBest1, globalBestFitness1, FitnessHistory1] = JADE(popsize, maxIteration,dim, LB, UB, @(x)benchmark_func(x,1));
[globalBest2, globalBestFitness2, FitnessHistory2] = SaNSDE(popsize, maxIteration,dim, LB, UB, @(x)benchmark_func(x,1));
plot(FitnessHistory);
hold on;
plot(FitnessHistory1);
hold on;
plot(FitnessHistory2);
legend('DE','JADE','SaNSDE','Location', 'northeast');

函数1测试结果:

函数2测试结果:

 

函数3测试结果:

 

 如有错误,还望批评改正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis源码解析(六):缓存执行器操作流程

Mybatis源码系列文章 手写源码&#xff08;了解源码整体流程及重要组件&#xff09; Mybatis源码解析(一)&#xff1a;环境搭建 Mybatis源码解析(二)&#xff1a;全局配置文件的解析 Mybatis源码解析(三)&#xff1a;映射配置文件的解析 Mybatis源码解析(四)&#xff1a;s…

【附源码】Python计算机毕业设计图书共享系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Bootstrap(三)

目录&#xff1a; &#xff08;1&#xff09;bootstrap响应式工具 &#xff08;2&#xff09;bootstrap实例导航 &#xff08;1&#xff09;bootstrap响应式工具 class加属性&#xff1a; visible-xs&#xff1a;隐藏显示&#xff0c;当屏幕宽度小于等于xs的时候显示、 vis…

如何使用轻量应用服务器搭建Typecho个人博客系统?

之前有写过WordPress搭建博客的教程&#xff1a;如何使用轻量应用服务器搭建WordPress个人博客 有的小伙伴感觉WordPress比较臃肿&#xff0c;有没有比较简洁的博客系统呢&#xff0c;今天就把Typecho搭建个人博客的操作方法分享给大家&#xff0c;需要的小伙伴可以参考以下。 …

注解的使用

1. 注解概述 1.1 注解概述、作用 Java 注解&#xff08;Annotation&#xff09;又称 Java 标注&#xff0c;是 JDK5.0 引入的一种注释机制。Java 语言中的类、构造器、方法、成员变量、参数等都可以被注解进行标注。 1.2 注解的作用是什么 2. 自定义注解 2.1 自定义注解 —…

大数据之Hive基本查询

文章目录前言一、Hive基本查询&#xff08;一&#xff09;普通查询&#xff08;二&#xff09;Join查询&#xff08;三&#xff09;排序查询总结前言 #博学谷IT学习技术支持# 这一次主要介绍Hive的基本查询以及相关函数&#xff0c;Hive的查询以及函数用法与MySQL不尽相同&…

自动化立体仓库系统实训

实训目的 理解被控对象&#xff0c;控制系统关系&#xff1b;逻辑流程任务综合训练&#xff1b;仓储智能管理实现&#xff1b;工业系统整体调试&#xff1b; 实训设备 虚拟仿真被控对象&#xff1b;S7-300控制器及实验台接口&#xff1b;DAQ信号板卡及继电器模块&#xff1b; 设…

基于划分的方法、K-均值算法、K-medoids、K-prototype(机器学习)

目录 基于划分的方法 K-均值算法 k-均值算法聚类步骤如下&#xff1a; K-均值算法优缺点 K-medoids算法 K-prototype算法 基于划分的方法 1、基于划分的方法是简单、常用的一种聚类方法&#xff1b; 2、通过将对象划分为互斥的簇进行聚类&#xff0c; 每个对象属于且仅属…

Python学习基础笔记九——集合

集合&#xff1a;可变的数据结构&#xff0c;元素必须是不可变的数据类型&#xff0c;无序&#xff0c;不重复&#xff08;去重&#xff09;。 数据集的方法&#xff1a; 方法功能S.add(tom)增加一个元素S.update(abc)增加一个可迭代元素&#xff0c;每个元素都分别添加进去S.…

[附源码]java毕业设计网上博物馆设计

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

《计算机视觉技术与应用》-----第五章 边缘和轮廓

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

【人工智能】MindSpore Hub

目录 前言 一、什么是MindSpore Hub 1.简单介绍 2.MindSpore Hub包含功能 3.MindSpore Hub使用场景 二、安装MindSpore Hub 1.确认系统环境信息 2.安装 3.下载源码 4.进行验证 三、加载模型 1.介绍 2.推理验证 3.迁移学习 四、模型发布 前言 MindSpore着重提升易…

营造激发自驱力注重培养学习力的想法一

目录背景过程第一节&#xff1a;第二节&#xff1a;第三节&#xff1a;总结升华背景 小编做的是教育类公司&#xff0c;其实无论是做公司的产品&#xff0c;还是对于公司团队人员的培养&#xff0c;都需要去思考教育这件事&#xff0c;尤其是激发自驱力培养学习力&#xff1b;…

常用的框架07-消息中间件-RabbitMQ

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录1.消息中间件概述1.1 为什么学习消息队列1.2 什么是消息中间件1.3 消息队列应用场景1.3.1 异步处理1.3.2 应用程序解耦合1.3.3 削峰填谷1.3.4 什么是QPS1.3.5 什么是…

servlet和vue的增删改查

1.servlet实现步骤 Servlet->新增 servlet获取请求参数&#xff0c;将参数转化为对象&#xff0c;调用service WebServlet("/addService") public class addAllService extends HttpServlet {private BrandService brandService new BrandServiceimpl() ;Over…

云计算之虚拟化技术学习(KVM/Xen/Hyper-V/VMware)

文章目录虚拟化技术什么是虚拟化服务器虚拟化cpu的虚拟化内存虚拟化管理硬盘的虚拟化网络虚拟化IO虚拟化Intel虚拟化技术主流的虚拟化技术虚拟化技术对比XenKVMHyper-VVMware ESX/ESXi虚拟化服务平台Libvirt基于KVM的虚拟化服务平台虚拟化技术 什么是虚拟化 虚拟化是云计算的…

最长公共子序列长度

求两个字符串的最长公共子序列长度。 输入格式: 输入长度≤100的两个字符串。 输出格式: 输出两个字符串的最长公共子序列长度。 输入样例1: ABCBDAB BDCABA输出样例1: 4输入样例2: ABACDEF PGHIK输出样例2: 0 (1条消息) HBU训练营【动态规划DP】——最长公共子序列长…

力扣(LeetCode)799. 香槟塔(C++)

动态规划 设 iii 是行 , jjj 是列 &#xff0c; f[i][j]f[i][j]f[i][j] 表示经过杯子的酒量 &#xff0c;初始 f[0][0]pouredf[0][0]pouredf[0][0]poured &#xff0c; 为了理解&#xff0c;当做每个杯子有无限容量。 当香槟溢出时&#xff0c;f[i][j]f[i][j]f[i][j] 保留自己的…

放大镜-第12届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第80讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

SpringCloud系列(一)Eureka 注册中心

本文主要介绍 Eureka 用来做什么&#xff1f; 如何搭建以及测试&#xff1b;  微服务框架区分于普通的单体架构项目&#xff0c;它是一种经过良好架构设计的分布式架构方案&#xff0c;根据业务功能对系统进行拆分&#xff0c;将每个业务模块都当做是一个独立的项目进行开发&a…