1. 程式人生 > >matlab學習筆記(1)——粒子群優化演算法(PSO)的程式實現

matlab學習筆記(1)——粒子群優化演算法(PSO)的程式實現

     本文內容參考matlab R2016a完全自學一本通。

     粒子群優化演算法(PSO)屬於進化演算法的一種,它從隨機解出發,通過迭代找到最優解。該演算法通過適應度來評價解的品質,並通過追隨當前搜尋到的最優值來尋找全域性最優。

     假設在一個D維的目標搜尋空間中,即每個粒子(解)都是一個D維的向量,粒子群由N個粒子構成,則其中第i個粒子可以表示為:

      Xi = (xi1,xi2,...,xiD),其中i=1,2,3,...,N

第i個粒子的飛行速度也是一個D維的向量,記為:

     Vi = (vi1,vi2,...,viD),其中i=1,2,3,...,N

並設定第i個粒子迄今為止搜尋到的最優位置為個體極值,記為pi,而整個粒子群迄今為止搜尋到的最優位置為全域性極值,記為pg。同樣,pi、pg均為D維向量。

      在整個搜尋過程中,粒子根據如下公式更新自己的速度和位置:

      Vi = w*Vi+c1*r1*(pi-Xi)+c2*r2*(pg-Xi)            (1)

      Xi = Xi+Vi                                                         (2)

      其中:c1、c2為學習因子,也稱加速常數,r1、r2為[0,1]範圍內的均勻隨機數。

      其中(1)式由三個部分組成:

1、第一部分為“慣性”,代表粒子有維持自己先前速度的趨勢

2、第二部分為“認知”,代表粒子有向自身歷史最佳位置逼近的趨勢

3、第三部分為“社會”,代表粒子有群體歷史最佳位置逼近的趨勢

以下是使用matlab實現粒子群優化演算法(PSO)的程式碼:

function [xm,fv] = PSO(fitness,N,c1,c2,w,M,D)
% 粒子群優化演算法,給定初始化條件
% c1學習因子1
% c2學習因子2
% w慣性權重
% M最大迭代次數
% D搜尋空間維數
% fitness待優化的目標函式,適應度函式% 初始化種群的個體
format long;
for i = 1:N
    for j = 1:D
        x(i,j) = randn;
        v(i,j) = randn;
    end
end% 計算各粒子的適應度,並初始化個體最優Pi和全域性最優Pg
for i = 1:N
    y(i) = fitness(x(i,:));
    p(i,:) = x(i,:);
end
pg = x(N,:);
for i = 1:N-1
    if fitness(x(i,:)) < fitness((pg))
        pg = x(i,:);
    end
end% 主要迴圈,依次迭代,直到滿足精度要求
for t = 1:M
    for i = 1:N
        v(i,:) = w*v(i,:)+c1*rand*(p(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
        x(i,:) = x(i,:)+v(i,:);
        if fitness(x(i,:)) < y(i)
            y(i) = fitness(x(i,:));
            p(i,:) = x(i,:);
        end
        if y(i) < fitness(pg)
            pg = p(i,:);
        end
    end
    Pbest(t) = fitness(pg);
end% 給出最後計算結果
disp('*******************************************')
disp('目標函式取最小值時的自變數:')
xm = pg'
disp('目標函式最小值:')
fv = fitness(pg)
disp('******************************************')fitness是待優化的目標函式,也稱適應度函式,這裡給出一個例子:    function F=fitness(x)
    F = sum(x.^2+x-6);      
在命令列視窗輸入程式碼:[xm1,fv1] = PSO(@fitness,50,1.5,2.5,0.5,100,3)執行後即可得到目標函式最小值以及最小值時對應的自變數。