基本粒子羣優化算法(PSO)的matlab實現

    

    粒子羣優化算法是一種模擬鳥羣社會行爲的羣體搜素算法。它分爲全局最佳粒子優化和局部最佳粒子優化,對於全局最佳PSO,或者叫做gbest PSO,每個粒子的鄰域都是整個羣,其算法僞代碼如下:

      


創建並初始化一個n維的粒子羣

repeat

     for 每個粒子i=1,2,…n do

           //設置個體最佳位置

           if f(i)<y then

                y=f(i);

           end

           //設置全局最佳位置

           if y<Y then

                Y=y;

           end

     end

     for 每個粒子i=1,2,…n do

         用速度方程更新速度

         用位置方程更新位置

     end

until 滿足終止條件


gbest PSO的matlab實現代碼如下:


tic   %該函數表示計時開始

%------初始格式化--------------------------------------------------

clear all;

clc;

format long;

%------給定初始化條件----------------------------------------------

c1=1.4962;             %加速常數即學習因子1

c2=1.4962;             %加速常數即學習因子2

w=0.7298;              %慣性權重

MaxDT=10000;           %最大迭代次數

D=10;                  %搜索空間維數(測試函數sphere中未知數個數)

N=40;                  %初始化羣體個體數目

eps=10^(-7);           %設置精度(在已知最小值時候用)

%------初始化種羣的個體(可以在這裏限定位置和速度的範圍)------------

for i=1:N

    for j=1:D

        x(i,j)=randn;  %產生一個服從正態分佈的隨機數作爲初始化位置

        v(i,j)=randn;  %產生一個服從正態分佈的隨機數作爲初始化速度

    end

end

%------先計算各個粒子的適應度,並初始化個體最優位置y和全局最優位置Pg--------

for i=1:N

    p(i)=sphere(x(i,:),D);%計算適應度,測試函數爲sphere

    y(i,:)=x(i,:);    %初始化個體最優位置y爲在時間步t=0時的粒子位置

end

Pg=x(1,:);             %Pg爲全局最優位置

for i=2:N

    if sphere(x(i,:),D)<sphere(Pg,D)

        Pg=x(i,:);%更新全局最優位置

    end

end

%------進入主要循環,按照公式依次迭代,直到滿足精度要求------------

for t=1:MaxDT

    for i=1:N

        v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(Pg-x(i,:));

        x(i,:)=x(i,:)+v(i,:);

        if sphere(x(i,:),D)<p(i)

            p(i)=sphere(x(i,:),D);%更新適應度

            y(i,:)=x(i,:);%更新個體最佳位置

        end

        if p(i)<sphere(Pg,D)

            Pg=y(i,:);%更新羣體最佳位置

        end

    end

    Pbest(t)=sphere(Pg,D);%保存每一代的羣體最佳位置

end

toc %該函數表示計時結束

%------最後給出計算結果

disp('*************************************************************')    

disp('函數的全局最優位置爲:')

for i=1:D

    fprintf('x(%d)=%s\n',i,Pg(i));

end

fprintf('最後得到的優化極值爲:%s\n',sphere(Pg,D));

disp('*************************************************************')


sphere函數如下:


%適應度函數源程序(sphere.m)

%參數x爲變量名,參數D爲維數

function result=sphere(x,D)

sum=0;

for i=1:D

    sum=sum+x(i)^2;

end

result=sum;


程序運行結果:

Elapsed time is 2.943799 seconds.

*************************************************************

函數的全局最優位置爲:

x(1)=6.654911e-009

x(2)=5.739281e-009

x(3)=-3.207077e-009

x(4)=-1.107863e-011

x(5)=9.756758e-009

x(6)=6.682152e-009

x(7)=-2.828295e-010

x(8)=2.533800e-009

x(9)=3.868910e-009

x(10)=1.740554e-009

最後得到的優化極值爲:2.518562e-016

*************************************************************

   從運行結果可以看出,程序運行時間約爲3秒,找到的sphere函數的最小值點接近0,在座標原點附近,符合預期結果。

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