pso_qzn.m

来自「自己写的关于粒子群算法求函数最小值的例程」· M 代码 · 共 81 行

M
81
字号


clear all
n = 20;%n维变量
m = 50;%粒子群的数量
c1 = 2;
c2 = 2;
w = 1;
vmax = 0.01;

%随即产生m个粒子
x = -1+2*rand(m,n);%对每个粒子的每一个变量产生相应的初始位置和速度
v = 0.5*rand(m,n);

%计算适应值

for i = 1:m
    f(i)=obf_pso(x(i,:),n);%每一个粒子的适应度,即为目标函数值。
end
clear i;
%找出个体极值和全局极值
pbx = x;%初值即为个体极值
pbf = f;
[gbf i] = min(pbf);%全局最小值
gbx = pbx(i,:);%
for i =1:m
    v(i,:)=w*v(i,:)+c1*rand*(pbx(i,:)-x(i,:))+c2*rand*(gbx-x(i,:));
    for j=1:n
        if v(i,j)>vmax
            v(i,j)=vmax;
        elseif v(i,j)<vmax
            v(i,j)=-vmax;
        end
    end
    x(i,:) = x(i,:)+v(i,:);
end

%%begin loop
k = 0;
while abs(gbf)>0.001
%while k<20
    for i = 1:m
        f(i)=obf_pso(x(i,:),n);
    end
    %%适应度优于原来的个体则设置当前个体为为最佳个体
    for i=1:m
        if f(i)<pbf(i)
            pbf(i) = f(i);
            pbx(i,:)=x(i,:);
        end
    end
    [gbf i]=min(pbf);
    gbx = pbx(i,:);%找到迭代后全局最佳个体
    for i = 1:m
        v(i,:)=w*v(i,:)+c1*rand*(pbx(i,:)-x(i,:))+c2*rand*(gbx-x(i,:));  %更新速度,并限制在设定的范围内。
        for j=1:n
            if v(i,j)>vmax
                v(i,j)=vmax;
            elseif v(i,j)<vmax
                v(i,j)=-vmax;
            end
        end
        x(i,:)=x(i,:)+v(i,:);%更新位置
    end
    k = k+1;
    trace(k) = gbf;
    tracea(k,1) = gbx(1);
    tracea(k,2) = gbx(2);
    subplot(1,2,1);
    hold on;
    plot(tracea(k,1),tracea(k,2),'r.','markersize',20);axis([-2,2,-2,2]);
    subplot(1,2,2);
    hold on 
    plot(k,trace(k),'r.')
end
gbx
gbf
k


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?