優化算法之粒子羣算法

今天爲大家分享啓發式優化算法的第二種算法——粒子羣算法(又稱鳥羣算法),粒子羣算法是依據鳥羣在覓食過程中信息在在個體和集體中傳遞的原理進行優化的,具體原理這裏同樣不進行詳細介紹,大家可以參考其他博客,這裏直接貼出相關程序:

function Record = PSOfunction(Population,Dim,Inter,PosLimit,VLimit,C1,C2,C3)
%粒子羣算法
%{
輸入:
Population:初始種羣數
Dim:變量維度
Inter:迭代次數
PosLimit:尋優範圍
VLimit:速度範圍
C1:慣性權重
C2:自我學習因子
C3:集體學習因子

輸出:

日期:
20190905_ZD
%}
%隨機初始化種羣位置
for i = 1:Dim
    X(:,i) = PosLimit(i,1) + ( PosLimit(i,2) - PosLimit(i,1) ) * rand(Population,1);
end
%初始化種羣速度
V = rand(Population,Dim);
XBest = X;%每個個體的歷史最佳位置
XAllBest = zeros(1,Dim);%種羣的歷史最佳位置
FitnessBest = zeros(Population,1);%每個個體的歷史最佳適應度
FitnessAllBest = -inf;%種羣歷史最佳適應度
%尋優
jj = 1;
Record = zeros(Inter,1);
while jj <= Inter
    [Fitness,f] = CalFitness(X);%計算適應度
    for i = 1:Population
        if FitnessBest(i) < Fitness(i)
            FitnessBest(i) = Fitness(i);%更新個體歷史最佳適應度
            XBest(i,:) = X(i,:);%更新個體歷史最佳位置
        end
    end
    if FitnessAllBest < max(Fitness)
        [FitnessAllBest,label] = max(Fitness);
        XAllBest = X(label,:);
    end
    V = V*C1+C2*rand*(XAllBest-X)+C3*rand*(repmat(XAllBest,Population,1) - X);%更新速度
    %處理速度邊界問題
    for i=1:Dim
        for k = 1:Population
            if V(k,i) > VLimit(i,2)
                V(k,i) = VLimit(i,2);
            end
            if V(k,i) < VLimit(i,1)
                V(k,i) = VLimit(i,1);
            end
        end
    end
    X = X + V;%更新位置
    %邊界問題處理
    for i = 1:Dim
        for k = 1:Population
            if X(k,i) > PosLimit(i,2)
                X(k,i) = PosLimit(i,2);
            end
            if X(k,i) < PosLimit(i,1)
                X(k,i) = PosLimit(i,1);
            end
        end
    end
    %繪製
    cla
    fsurf(f,[0 20 0 20])
    hold on
    if mod(jj,10) == 0
        plot3(X(:,1),X(:,2),f(X(:,1),X(:,2)),'ro');
        pause(0.1)
    end
    Record(jj) = FitnessAllBest;
    jj = jj+1;
end
function [Fitness,f] = CalFitness(X)
%計算適應度
%{
輸入:
X:參數

輸出:
Fitness:適應度
f:函數

日期:
20190905_ZD
%}
f= @(a,b)(a .* sin(a) .* cos(2 * a) - 2 * a .* sin(3 * a)).*(b .* sin(b) .* cos(2 * b) - 2 * b .* sin(3 * b));
Fitness = f(X(:,1),X(:,2));

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章