matlab基本粒子群算法實現(二)


雖然這個不是我寫的

但是這個粒子群是二維的

之前的是一維的。

main.m

clear all;
close all;
clc;

[x y]=meshgrid(-100:100,-100:100);
sigma=50;
img = (1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2)); %目標函數,高斯函數
mesh(img);
hold on;
n=10;   %粒子群粒子個數

%初始化粒子群,定義結構體
%結構體中八個元素,分別是粒子坐標,粒子速度,粒子適應度,粒子最佳適應度,粒子最佳坐標
par=struct([]);          
for i=1:n
    par(i).x=-100+200*rand();   %[-100 100]對x位置隨機初始化
    par(i).y=-100+200*rand();   %[-100 100]對y位置隨機初始化
    par(i).vx=-1+2*rand();      %[-1 1]對vx速度隨機初始化
    par(i).vy=-1+2*rand();      %[-1 1]對vy速度隨機初始化
    par(i).fit=0;               %粒子適應度為0初始化
    par(i).bestfit=0;           %粒子最佳適應度為0初始化
    par(i).bestx=par(i).x;      %粒子x最佳位置初始化
    par(i).besty=par(i).y;      %粒子y最佳位置初始化
end
par_best=par(1);    %初始化粒子群中最佳粒子

for k=1:10    
    plot3(par_best.x+100,par_best.y+100,par_best.fit,'g*'); %畫出最佳粒子的位置,+100為相對偏移
    for p=1:n
        [par(p) par_best]=update_par(par(p),par_best);  %更新每個粒子信息         
    end  
end

 update_par.m

function [par par_best]=update_par(par,par_best)
    
    %Px=Px+Pv*t,這里t=1,Px為當前粒子的位置,Pv為當前粒子的速度
    par.x=par.x+par.vx;   
    par.y=par.x+par.vy;   
    
    par.fit=compute_fit(par);    %計算當前粒子適應度
    
    %Pv=Pv+(c1*rand*(Gx-Px))+(c2*rand*(PBx-Px))
    %這里c1,c2為加速因子
    %Gx為具有最佳適應度粒子的位置
    %PBx為當前粒子的最佳位置
    c1=1;
    c2=1;
    par.vx=par.vx+c1*rand()*(par_best.x-par.x)+c2*rand()*(par.bestx-par.x);   
    par.vy=par.vy+c1*rand()*(par_best.y-par.y)+c2*rand()*(par.besty-par.y);
 
    if par.fit>par.bestfit      %如果當前粒子適應度要好於當前粒子最佳適應度
        par.bestfit=par.fit;    %則更新當前粒子最佳適應度
        par.bestx=par.x;        %更新當前粒子最佳位置
        par.besty=par.y;
        if par.bestfit>par_best.fit     %如果當前粒子最佳適應度好於最佳粒子適應度
            par_best.fit=par.bestfit;   %則更新最佳粒子適應度
            par_best.x=par.x;           %更新最佳粒子位置
            par_best.y=par.y;
        end
    end

end

  

compute_fit.m

function re=compute_fit(par)
    x=par.x;
    y=par.y;
    sigma=50;
    if x<-100 || x>100 || y<-100 || y>100
        re=0;        %超出范圍適應度為0
    else            %否則適應度按目標函數求解
        re= (1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2)); 
    end
end

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM