天天看點

【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

繼續閱讀