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

来源:互联网 发布:瑞士钟表行业数据2017 编辑:程序博客网 时间:2024/06/06 23:16

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


算法步骤如下:

  1. 初始化

  2. 变异

  3. 交叉

d.选择



测试函数

Rastrigr函数  

                 

全局最优点,       

matlab代码如下:

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

结果:

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


DE算法的求解步骤:
(1)基本参数的设置,包括NP, F, CR
(2)初始化种群
(3)计算种群适应度值
(4)终止条件不满足时,进行循环,依次执行变异、交叉、选择运算,直到终止运算。

DE算法的流程图:

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