差分进化算法_差分进化算法入门及实例应用

差分进化算法_差分进化算法入门及实例应用这个就当是自己学习的整理总结吧 一 差分进化算法理论差分进化算法是基于群体智能理论的优化算法 通过群体内个体间的合作与竞争而产生的智能优化搜索算法 1 1 差分进化特点 1 结构简单 容易使用 主要通过差分变异算子来进行遗传操作 2 性能优越 具有较好的可靠性 鲁棒性 高效性 3 自适应性 差分变异算子可以是一个常数 也可以是一个具有变异步长和搜索方向的自适应能力 4 具有内在并行性

这个就当是自己学习的整理总结吧。

一、差分进化算法理论

差分进化算法是基于群体智能理论的优化算法,通过群体内个体间的合作与竞争而产生的智能优化搜索算法。

1.1 差分进化特点

(1)结构简单,容易使用。主要通过差分变异算子来进行遗传操作。

(2)性能优越。具有较好的可靠性,鲁棒性,高效性。

(3)自适应性。差分变异算子可以是一个常数,也可以是一个具有变异步长和搜索方向的自适应能力。

(4)具有内在并行性,可协同搜索。在同一要求下,差分进化算法拥有更快的收敛速度。

1.2 差分进化算法操作

(1)初始化

差分进化算法利用NP个维数为D的实数值参数向量,作为每一代的种群。一般初始化种群符合均匀概率分布。

(2)变异

基本变异向量由下式产生

2ffe82f672e366854a04291bec9c7769.png

要求r1,r2,r3,i互不相同,所以NP必须大于4,F是变异算子通常在0-2之间,它控制偏差向量的放大作用。

通俗的理解就是把两个向量的差值乘上变异算子加给第三个向量作为新的变异向量。

(3)交叉

为了增加干扰向量的多样性,引入交叉操作。

af0b4822675e28fd8fe15ead6188ba4d.png

randb(j)表示产生[0,1]之间随机数第j个估计值,rnbr表示一个随机选择的序列。CR是交叉算子。

通俗理解就是如果随机产生的randb(j)小于CR或者j=r,那么就将变异后的种群放入选择群体中,如果不是就就将原来的种群放入选择种群中。

(4)选择

为了决定选择种群中的向量是否能成为下一代的一员,试验向量与当前的目标向量进行比较,如果出现目标函数被最小化,那么具有最小目标函数的向量将在下一代出现。试验向量只与一个个体进行比较,而不是所有个体。

(5)边界条件处理

一种方法是将超过边界的向量使用可行域中随机产生的参数向量代替。

例如:u(n,m)=rand*(Xs-Xx)+Xx;

另一种方法是,进行边界吸收处理,直接放栗子好理解

 if u(n,m) 
    
      Xs u(n,m)=Xs; end 
    

二、改进的差分进化算法

(1)自适应差分进化算法

主要是使用了自适应算子。在基本的差分进化算法中,变异算子经常取常数,比较难准确确定,变异率太大,全局最优解低,变异率小,群体多样性下降,易出现‘早熟’的现象。我们可以设计这样的变异算子:

22fe9bd5455b7c8d67f50453316f64d3.png

这样开始的时候变异算子为2F0,在初期可以保持多样性,防止早熟。随着进展,变异算子降低最后变为F0,避免最优解遭到破坏。

还可以设计一个随机范围的交叉算子:

05e8231d6de734ac70516004f7319a6f.png

这样交叉算子的均值就在0.75,保持了群体多样性。

(2)离散差分进化算法

采用的是浮点数编码,用到了floor这个函数向下取整即可。

三、差分进化算法流程

4caa50b3213f89dec908dffa636a347b.png

四、参数说明

种群数量NP:规模越大多样性越好,但是增加计算难度,一般在5D~10D之间,而且必须大于4。

变异算子F:

差分进化算法_差分进化算法入门及实例应用 ,决定偏差向量的放大比例。F=0.5是一个比较好的初始选择,如果过早收敛可以增大F或者NP

交叉算子CR:

差分进化算法_差分进化算法入门及实例应用 ,CR越大,发生交叉的可能性就越大,一般CR=0.1,较大的CR会加速收敛。

终止条件:一般当目标函数值小于阈值时程序终止,一般取

差分进化算法_差分进化算法入门及实例应用

五、实例练习

(1)计算函数

差分进化算法_差分进化算法入门及实例应用 的最小值,其中个体x的维数n=10,这是一个简单的平方和函数,只有一个极小点x=(0,0,…,0),理论上最小值分f(0,0,…,0)=0。

解:使用的是自适应进化算法,所以变异算子和变异算子不是常数

clear all; close all; clc; NP=50; %种群数量 D=10; %变量的维数 G=200; %最大进化代数 F0=0.4; %初始变异算子 CR=0.1; %交叉算子 Xs=20; %上限 Xx=-20; %下限 yz=10^-6; %阈值 %赋初值 x=zeros(D,NP); %初始种群 v=zeros(D,NP); %变异种群 u=zeros(D,NP); %选择种群 x=rand(D,NP)*(Xs-Xx)+Xx; %赋初值 %计算目标函数 for m=1:NP Ob(m)=func1(x(:,m)); end trace(1)=min(Ob); %差分进化循环 for gen=1:G %变异操作 %自适应变异算子 lamda=exp(1-G/(G+1-gen)); F=F0*2^lamda; %r1,r2,r3,m互不相同 for m=1:NP r1=randi([1,NP],1,1); while (r1==m) r1=randi([1,NP],1,1); end r2=randi([1,NP],1,1); while (r2==m)||(r1==r2) r2=randi([1,NP],1,1); end r3=randi([1,NP],1,1); while (r3==m)||(r2==r3)||(r1==r3) r3=randi([1,NP],1,1); end v(:,m)=x(:,r1)+F*(x(:,r2)-x(:,r3)); end %交叉操作 r=randi([1,D],1,1); for n=1:D cr=rand(1); if (cr<=CR)||(n==r) u(n,:)=v(n,:); else u(n,:)=x(n,:); end end %边界条件处理 for n=1:D for m=1:NP if (u(n,m) 
    
      Xs) u(n,m)=rand*(Xs-Xx)+Xx; end end end %选择操作 for m=1:NP Ob1(m)=func1(u(:,m)); end for m=1:NP if Ob1(m) 
      
    

提示一下size 函数的用法,size(x,1)返回行数,size(x,2)返回列数。

5ad412ac7a9789fc971c35086eabce7d.png

(2)求函数

差分进化算法_差分进化算法入门及实例应用 的最小值,其中x的范围是[-4,4],y的取值范围是[-4,4],这是一个有多个局部极值的函数,函数图形如图所示。

3a95f1ceab0d83f98ef5564452da3593.png

解:

clear all; close all; clc; NP=20; %种群数量 D=2; %变量的维数 G=100; %最大进化代数 F=0.5; %变异算子 CR=0.1; %交叉算子 Xs=4; %上限 Xx=-4; %下限 %赋初值 x=zeros(D,NP); %初始种群 v=zeros(D,NP); %变异种群 u=zeros(D,NP); %选择种群 x=rand(D,NP)*(Xs-Xx)+Xx; %赋初值 %计算目标函数 for m=1:NP Ob(m)=func2(x(:,m)); end trace(1)=min(Ob); %差分进化循环 for gen=1:G %变异操作 %r1,r2,r3,m各不相同 for m=1:NP r1=randi([1,NP],1,1); while (r1==m) r1=randi([1,NP],1,1); end r2=randi([1,NP],1,1); while (r1==r2)||(r2==m) r2=randi([1,NP],1,1); end r3=randi([1,NP],1,1); while (r1==r3)||(r2==r3)||(r3==m) r3=randi([1,NP],1,1); end v(:,m)=x(:,r1)+F*(x(:,r2)-x(:,r3)); end %交叉操作 r=randi([1,D],1,1); for n=1:D cr=rand(1); if(cr 
    
      Xs u(n,m)=Xs; end end end %选择操作 for m=1:NP Ob1(m)=func2(u(:,m)); end for m=1:NP if Ob1(m) 
      
    

5975449fffddc00c932818fba6e3a181.png

结果:当x=-4,y=-3.9478时取到最小值-10.9734

(3)用离散差分算法求函数

差分进化算法_差分进化算法入门及实例应用 的最大值,其中x取-100~100之间的整数,y取-100~100之间的整数,其函数图像如图所示:

58d9ecaf51e3da45b467480a567a35cf.png

解:

clear all; close all; clc; NP=20; %种群数量 D=2; %变量的维数 G=100; %最大进化代数 F=0.5; %变异算子 CR=0.1; %交叉算子 Xs=100; %上限 Xx=-100; %下限 %赋初值 x=zeros(D,NP); %初始种群 v=zeros(D,NP); %变异种群 u=zeros(D,NP); %选择种群 x=randi([Xx,Xs],D,NP); %赋初值 %计算目标函数 for m=1:NP Ob(m)=func3(x(:,m)); end trace(1)=max(Ob); %差分进化循环 for gen=1:G for m=1:NP r1=randi([1,NP],1,1); while (r1==m) r1=randi([1,NP],1,1); end r2=randi([1,NP],1,1); while (r1==r2)||(r2==m) r2=randi([1,NP],1,1); end r3=randi([1,NP],1,1); while (r3==m)||(r3==r2)||(r3==r1) r3=randi([1,NP],1,1); end v(:,m)=floor(x(:,r1)+F*(x(:,r2)-x(:,r3))); %floor向下取整 end %交叉操作 r=randi([1,D],1,1); for n=1:D cr=rand(1); if (cr<=CR)||(n==r) u(n,:)=v(n,:); else u(n,:)=x(n,:); end end %边界吸收 for n=1:D for m=1:NP if u(n,m) 
    
      Xs u(n,m)=Xs; end end end %选择操作 for m=1:NP Ob1(m)=func3(u(:,m)); end for m=1:NP if Ob1(m)>Ob(m) x(:,m)=u(:,m); end end for m=1:NP Ob(m)=func3(x(:,m)); end trace(gen+1)=max(Ob); end [SortOb,Index]=sort(Ob); X=x(:,Index); XBest=x(:,end); %最优变量 Y=max(Ob); %最优 %画图 figure plot(trace) xlabel('迭代次数') ylabel('目标函数值') title('DE目标函数曲线') %%适应度函数 function y=func3(x) y=-((x(1).^2+x(2)-1).^2+(x(1)+x(2).^2-7).^2)/200+10; end 
    

7ef9bed656c15c66829b14aa966aab0d.png

通过这三个例子我们可以发现如果把遗传算法部分学好了,差分进化这块也特别好理解,这两种算法虽然交叉的变异的方法不一样,但是思想上很相近。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223607.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午1:49
下一篇 2026年3月17日 下午1:49


相关推荐

  • NodeJS环境下使用axios上传文件

    NodeJS环境下使用axios上传文件最近有个需求,需要在nodejs后端上传图片到云存储服务器,刚好对axios这个库比较熟悉,因此便开始在网上查资料,但是网上大多的都是用axios在前端上传文件的代码,即是基于浏览器环境的。后来找到了基于Nodejs环境的axios上传代码,一番copy后便开始了测试,本以为会一帆风顺,没想到服务器那边却总是返回如下错误,也就是说我们的请求并没有以multipart/form-data的形式封装好…

    2022年6月16日
    111
  • vue django mysql_Python MySQL

    vue django mysql_Python MySQL工作之余断断续续根据网上找到的教程进行环境搭建,搭建了多个。但是一直没有一个整体概念,到底该先做什么,后做什么,操作一步后,结果应该是怎样另外,网上的教程都是直接用命令行操作,用pycharm又应该怎么弄呢环境搭建好以后,应该怎么分目录结构,应该先从哪里的代码开始写,写了以后,又需要做哪些配置这些问题一直困扰着我,所以我决定边学边记录整理。也希望能帮助同为初学者的你少走一些…

    2022年8月28日
    9
  • Mock 测试

    Mock 测试Mock基本概念介绍mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。好处团队并行工作 团队间不需互相等待对方进度,只需约定好相互之间的数据规范(接口文档),即可使用mock构建出可用接口,然后尽快进行开发和自测,提前发现缺陷 测试驱动开发TDD(Test-DrivenDevelopment) 单元测试是TDD实现的基石,而TDD经常会碰到协同模块尚未开发完成的情况,但有了mock,当接口定义好后,测试人

    2022年6月20日
    36
  • Nano-Banana软萌拆拆屋实战教程:3步用SDXL生成服饰拆解图

    Nano-Banana软萌拆拆屋实战教程:3步用SDXL生成服饰拆解图

    2026年3月15日
    2
  • smb服务检测(smb应用)

     开源包,http://jcifs.samba.org/.复制一篇文章.用JAVA访问共享文件系统前言在Microsoft网络系统中,SMB(ServerMessageBlock,服务信息块)协议是WindowsforWorkgroup(WfWg)、Windows95、WindowsNT和LanManager用来实现共享局域网上

    2022年4月13日
    72
  • Matlab代码之plot函数的坐标点显示

    Matlab代码之plot函数的坐标点显示plot函数的xlabel、ylabel、title、text、legend1、在图像某个位置显示文字信息,2、用text()显示plot函数的坐标点;3、用legend()在一张图同时显示不同曲线;4、用xlabel()、ylabel()、title()显示横纵坐标和标题;5、用subplot在一张画布上画多个图像;新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个

    2022年10月15日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号