天天看点

【DE算法】差分进化算法原理及matlab代码

差分进化算法DE与遗传算法GA非常类似,下面是差分进化算法的步骤。

算法步骤如下:

  1. 初始化
    【DE算法】差分进化算法原理及matlab代码
  2. 变异
    【DE算法】差分进化算法原理及matlab代码
  3. 交叉
    【DE算法】差分进化算法原理及matlab代码
【DE算法】差分进化算法原理及matlab代码

d.选择

【DE算法】差分进化算法原理及matlab代码
【DE算法】差分进化算法原理及matlab代码

测试函数:

Rastrigr函数  

【DE算法】差分进化算法原理及matlab代码

全局最优点: 

【DE算法】差分进化算法原理及matlab代码

,

【DE算法】差分进化算法原理及matlab代码

matlab代码如下:

[plain] view plain copy

  1. function DE(Gm,F0)  
  2. t0 = cputime;  
  3. %差分进化算法程序  
  4. %F0是变异率 %Gm 最大迭代次数  
  5. Gm = 10000;  
  6. F0 = 0.5;  
  7. Np = 100;  
  8. CR = 0.9;  %交叉概率  
  9. G= 1; %初始化代数  
  10. D = 10; %所求问题的维数  
  11. Gmin = zeros(1,Gm); %各代的最优值  
  12. best_x = zeros(Gm,D); %各代的最优解  
  13. value = zeros(1,Np);  
  14. %产生初始种群  
  15. %xmin = -10; xmax = 100;%带负数的下界  
  16. xmin = -5.12;  
  17. xmax = 5.12;  
  18. function y = f(v)  
  19.     %Rastrigr 函数  
  20. y = sum(v.^2 - 10.*cos(2.*pi.*v) + 10);  
  21. end  
  22. X0 = (xmax-xmin)*rand(Np,D) + xmin;  %产生Np个D维向量  
  23. XG = X0;  
  24. %%%%%%%%%%%%%----这里未做评价,不判断终止条件----%%%%%%%%%%%%%%%%%%%%%%%%  
  25. XG_next_1= zeros(Np,D); %初始化  
  26. XG_next_2 = zeros(Np,D);  
  27. XG_next = zeros(Np,D);  
  28. while G <= Gm   
  29. G   
  30. %%%%%%%%%%%%%%%%%%%%%%%%----变异操作----%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  31.     for i = 1:Np  
  32.         %产生j,k,p三个不同的数  
  33.         a = 1;  
  34.         b = Np;  
  35.         dx = randperm(b-a+1) + a- 1;  
  36.         j = dx(1);  
  37.         k = dx(2);  
  38.         p = dx(3);  
  39.         %要保证与i不同  
  40.         if j == i  
  41.             j  = dx(4);  
  42.             else if k == i  
  43.                  k = dx(4);  
  44.                 else if p == i  
  45.                     p = dx(4);  
  46.                     end  
  47.                 end  
  48.          end  
  49.         %变异算子  
  50.         suanzi = exp(1-Gm/(Gm + 1-G));  
  51.         F = F0*2.^suanzi;  
  52.         %变异的个体来自三个随机父代  
  53.         son = XG(p,:) + F*(XG(j,:) - XG(k,:));         
  54.         for j = 1: D  
  55.             if son(1,j) >xmin  & son(1,j) < xmax %防止变异超出边界  
  56.                 XG_next_1(i,j) = son(1,j);  
  57.             else  
  58.                 XG_next_1(i,j) = (xmax - xmin)*rand(1) + xmin;  
  59.             end  
  60.         end  
  61.     end  
  62.    %%%%%%%%%%%%%%%%%%%%%%%---交叉操作----%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  63.     for i = 1: Np  
  64.         randx = randperm(D);% [1,2,3,...D]的随机序列     
  65.         for j = 1: D  
  66.             if rand > CR & randx(1) ~= j % CR = 0.9   
  67.                 XG_next_2(i,j) = XG(i,j);  
  68.             else  
  69.                 XG_next_2(i,j) = XG_next_1(i,j);  
  70.             end  
  71.         end  
  72.     end  
  73.     %%%%%%%%%%%%%%%%%%----选择操作---%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
  74.     for i = 1:Np  
  75.         if f(XG_next_2(i,:)) < f(XG(i,:))  
  76.             XG_next(i,:) = XG_next_2(i,:);  
  77.         else  
  78.             XG_next(i,:) = XG(i,:);  
  79.         end  
  80.     end  
  81.     %找出最小值  
  82.     for i = 1:Np  
  83.         value(i) = f(XG_next(i,:));  
  84.     end  
  85.     [value_min,pos_min] = min(value);  
  86.     %第G代中的目标函数的最小值  
  87.     Gmin(G) = value_min;     
  88.     %保存最优的个体  
  89.     best_x(G,:) = XG_next(pos_min,:);     
  90.     XG = XG_next;      
  91.     trace(G,1) = G;  
  92.     trace(G,2) = value_min;  
  93.     G = G + 1;  
  94. end  
  95.   [value_min,pos_min] = min(Gmin);  
  96.   best_value = value_min  
  97.   best_vector =  best_x(pos_min,:)    
  98.   fprintf('DE所耗的时间为:%f \n',cputime - t0);  
  99.   %画出代数跟最优函数值之间的关系图    
  100.   plot(trace(:,1),trace(:,2));  
  101. end  

结果:

【DE算法】差分进化算法原理及matlab代码
【DE算法】差分进化算法原理及matlab代码

以上转载自:http://blog.csdn.net/hehainan_86/article/details/38685231

DE算法的求解步骤:

(1)基本参数的设置,包括NP, F, CR

(2)初始化种群

(3)计算种群适应度值

(4)终止条件不满足时,进行循环,依次执行变异、交叉、选择运算,直到终止运算。

DE算法的流程图:

【DE算法】差分进化算法原理及matlab代码

以上转载自:http://blog.csdn.net/misayaaaaa/article/details/54407548

继续阅读