粒子羣優化算法及matlab程序

%% 粒子羣 PSO 
clear
clc

%% 繪製原圖
x1 = -15:1:15;
x2 = -15:1:15;
[x1,x2] = meshgrid(x1,x2); %生成網格點
y = x1.^2 + x2.^2 - x1.*x2 - 10*x1 - 4*x2 + 60;
mesh(x1,x2,y)%繪製曲面
hold on

%% 預設參數
n = 100; %粒子數量
d = 2; %變量個數
c1 = 2; %學習因子
c2 = 2;
w = 0.9;%慣性權重
K = 1000;%迭代次數

%% 分佈粒子
x = -10 + 20*rand(n,d);%初始化粒子
v = -5 + 10*rand(n,d);%初始化例子速度

%% 計算適應度
fit = zeros(n,1); %預分配內存
fit_1=zeros(n,1);
for j = 1:n
    a=x(j,1);
    b=x(j,2);
    fit(j) = a^2 + b^2 - a*b - 10*a - 4*b + 60;  %計算每一個粒子的適應度
end

%% 計算極值

pbest = x;                  %初始位置初始化爲個體極值

abest=pbest(:,1);
bbest=pbest(:,2);
fitbest=abest.^2 + bbest.^2 - abest.*bbest - 10*abest - 4*bbest + 60;%保存初始的適應度個體極值
ind = find(min(fit) == fit);%尋找所有極值適應度最小值所在的位置
gbest = x(ind,:); %將該最小個體極值作爲羣體極值

agbest=gbest(1);
bgbest=gbest(2);
fitgbest=agbest.^2 + bgbest.^2 - agbest.*bgbest - 10*agbest - 4*bgbest + 60;%保存初始的適應度羣體極值
% h = scatter3(x(:,1),x(:,2),fit,'o');

%% 更新速度與位置
fitnessbest=zeros(1,1000);
for i = 1:K
    % 更新速度與位置
    for m = 1:n   %
        v(m,:) = w*v(m,:) + c1*rand*(pbest(m,:) - x(m,:)) + c2*rand*(gbest - x(m,:));
        
        v(m,find(v(m,:) < -10)) = -10; %尋找更新後速度小於-10的速度,將其值設置爲-10
        v(m,find(v(m,:) > 10)) =  10;  %尋找更新後速度大於 10的速度,將其值設置爲 10
        
        x(m,:) = x(m,:) + 0.5*v(m,:);  %更新每一個粒子羣的位置
        x(m,find(x(m,:) < -10)) = -10; %尋找更新後速度小於-10的位置,將其值設置爲-10
        x(m,find(x(m,:) > 10)) = 10;   %尋找更新後速度大於 10的位置,將其值設置爲 10
        % 重新計算適應度
        a=x(m,1);
        b=x(m,2);
        fit(m) = a.^2 + b.^2 - a.*b - 10*a - 4*b + 60;  %計算每一個粒子的適應度
        if fit(m) < fitbest(m)  %該粒子當前位置適應度是否小於上位置()
            pbest(m,:) = x(m,:);  %更新個體極值
        end
        if  fit(m) < fitgbest 
            gbest = pbest(m,:);
        end
    end
    abest=pbest(:,1);
    bbest=pbest(:,2);
    fitbest=abest.^2 + bbest.^2 - abest.*bbest - 10*abest - 4*bbest + 60;%保存本次的適應度個體極值
    agbest=gbest(1);
    bgbest=gbest(2);
    fitgbest=agbest.^2 + bgbest.^2 - agbest.*bgbest - 10*agbest - 4*bgbest + 60;
%保存本次的適應度羣體極值
    fitnessbest(i) = fitgbest;
end
plot(fitnessbest)
xlabel('迭代次數');

 

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