当前位置:   article > 正文

差分进化算法

差分进化算法

差异演化(Differential Evolution,DE)是一种基于群体差异的演化算法,该算法是Rainer Storn和Kenneth Price在1996年为求解切比雪夫多项式而提出的。差异演化算法在当年首届IEEE演化计算大赛中表现超群,随后在各个领域得到了广泛应用。差分算法的基本思想:应用当前种群个体的差异来重组得到中间种群,然后应用子代个体与父代个体竞争来获得新一代种群。

差异演化算法最新颖的特征是它的变异操作。当选定一个个体后,算法通过在该个体上加上两个个体带权的差来完成变异。算法迭代初期,种群中个体差异大,这样的变异操作会使算法具有较强全局搜索能力;到迭代后期,当趋于收敛,种群中个体差异小,也使得算法具有较强局部搜索能力。这种新颖的变异操作,主要优点有:待定参数少;不易陷入局部最优;收敛速度快。

差分进化算法的主要步骤包括:

(1)群体初始化
(2)变异操作
(3)交叉操作
(4)选择操作

差分算法的过程如下:


举例说明:

求函数f(x,y)=3cos(xy)+x+y的最小值,其中x的取值范围为[-4,4], y的取值范围为[-4,4](多个局部极值的函数)

首先在matlab中绘制出该函数的图像,如下:

x=[-4:0.1:4];
y=x;
[X,Y]=meshgrid(x,y);
[row,col]=size(X);
for l=1:col
    for h=1:row
        z(h,l)=3*cos(X(h,l)*Y(h,l))+X(h,l)+Y(h,l);
    end
end
surf(X,Y,z);
shading interp
绘图如下:


MATLAB实现差分进化算法:

第一步:定义适应度函数

  1. function value=func2(x)
  2. value=3*cos(x(1)*x(2))+x(1)+x(2);
  3. end

第二步:MATLAB主函数程序

  1. %初始化参数设置
  2. clear all;
  3. close all;
  4. clc;
  5. NP=20; %种群数量
  6. D=2; %变量的维数
  7. G=100; %最大进化代数
  8. F=0.5; %变异算子
  9. CR=0.1; %交叉算子
  10. Xs=4; %上限
  11. Xx=-4; %下限
  12. x=zeros(D,NP); %初始种群
  13. v=zeros(D,NP); %变异种群
  14. u=zeros(D,NP); %选择种群
  15. x=rand(D,NP)*(Xs-Xx)+Xx; %赋初值
  16. %计算适应度函数值
  17. for m=1:NP
  18. Ob(m)=func2(x(:,m));
  19. end
  20. trace(1)=min(Ob);
  21. %差分操作
  22. for gen=1:G
  23. %变异操作
  24. %r1,r2,r3和m互不相同
  25. for m=1:NP
  26. r1=randi([1,NP],1,1);
  27. while(r1==m)
  28. r1=randi([1,NP],1,1);
  29. end
  30. r2=randi([1,NP],1,1);
  31. while(r2==m)|(r2==r1)
  32. r2=randi([1,NP],1,1);
  33. end
  34. r3=randi([1,NP],1,1);
  35. while((r3==m)|(r3==r1)|(r3==r2))
  36. r3=randi([1,NP],1,1);
  37. end
  38. v(:,m)=x(:,r1)+F*(x(:,r2)-x(:,r3));
  39. end
  40. %交叉操作
  41. r=randi([1,NP],1,1);
  42. for n=1:D
  43. cr=rand(1);
  44. if(cr<CR)|(n==r)
  45. u(n,:)=v(n,:);
  46. else
  47. u(n,:)=x(n,:);
  48. end
  49. end
  50. %边界条件处理
  51. %边界吸收
  52. for n=1:D
  53. for m=1:NP
  54. if u(n,m)<Xx
  55. u(n,m)=Xx;
  56. end
  57. if u(n,m)>Xs
  58. u(n,m)=Xs;
  59. end
  60. end
  61. end
  62. %选择操作
  63. for m=1:NP
  64. Ob1(m)=func2(u(:,m));
  65. end
  66. for m=1:NP
  67. if Ob1(m)<Ob(m) %小于先前的目标值
  68. x(:,m)=u(:,m);
  69. end
  70. end
  71. for m=1:NP
  72. Ob(m)=func2(x(:,m));
  73. end
  74. trace(gen+1)=min(Ob);
  75. end
  76. [SortOb,Index]=sort(Ob);
  77. x=x(:,Index);
  78. X=x(:,1); %最优变量
  79. Y=min(Ob); %最优值
  80. disp('最优变量');
  81. disp(X);
  82. disp('最优值');
  83. disp(Y);
  84. %绘图
  85. figure
  86. plot(trace);
  87. %plot(X,Y,'-ro');
  88. xlabel('迭代次数');
  89. ylabel('目标函数值');
  90. title('DE目标函数曲线');

运行结果:



最优变量
   -4.0000
   -3.9467

最优值
  -10.9374


参考文章:

http://blog.csdn.net/zuochao_2013/article/details/71514058

http://blog.csdn.net/u010480899/article/details/73795669

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/630178
推荐阅读
相关标签
  

闽ICP备14008679号