粒子群优化(PSO)算法例题实现

目录

一、实验要求

二、算法流程

三、案例实现及结果

完整程序:


一、实验要求

二、算法流程

粒子群算法流程

1、初始化:初始化粒子群;给每个粒子赋予初始位置和速度

2、计算适应值:根据适应度函数,计算每个粒子的适应值

3、求个体最佳适应值:对每一个粒子,将其当前位置的适应值与其历史最佳位置对应的适应值比较,如果当前位置的适应值更高,则用当前位置更新历史最佳位置

4、求群体最佳适应值:对每一个粒子,将其当前位置的适应值与其全局最佳位置对应的适应值比较,如果当前位置的适应值更高,则用当前位置更新全局最佳位置

5、更新粒子位置和速度:根据公式更新每个粒子的速度与位置

6、判断算法是否结束:若未满足结束条件,则返回步骤2,若满足结束条件则算法结束,全局最佳位置即全局最优解

三、案例实现及结果

初始化各参数

学习因子全为c1,c2=1.5;进化参数T=100;种群规模数N=50;粒子堆数D=2;最大速度为1;最小速度为-1;最大粒子为为3,最小粒子位置为-3;对其进行迭代得到如下结果:

 其中最优个体是:-0.0022800 -0.0000772;最优值为:0.0001353

接下来对上述过程改变单一变量看看结果的变化

1.改变学习因子的大小,查看适应度值的变化

如图可知,学习因子的变化对结果的影响很小。

2.种群规模大小变化对适应度结果的影响

如图可知,种群规模的大小变化的影响,随种群规模的的逐渐增大有了较大的变化,但达到一定程度后便不再变化。

3.速度大小变化对适应度结果的影响

 如图可知,速度变化的影响随着速度的增大逐渐减小,当速度达到0.1以后速度变化的影响几乎为0。

完整程序:

%% 清空环境
clc;
clear all;
close all;

%% 参数初始化
%粒子群算法中的两个参数
c1 = 1.5; %学习因子1
c2 = 1.5; %学习因子2

T=100;   % 进化次数  
N=50;   %种群规模
D=2; %粒子堆数

Vmax=1; %速度最大数
Vmin=-1; %速度最小数
Xmax=3; %位置最大数
Xmin=-3; %位置最小数
[zbest,fitnesszbest]=pso_train(T,N,D,c1,c2,Vmax,Vmin,Xmax,Xmin);
%% 产生初始粒子和速度
X = rand(N,D)*(Xmax-Xmin)-Xmax;
V = rand(N,D)*(Vmax-Vmin)-Vmax;
for i=1:N
    %随机产生一个种群
%     pop(i,:)=rands(1,2)*(Xmax-Xmin)-Xmax;    %初始种群
%     V(i,:)=rands(1,2)*(Vmax-Vmin)-Vmax;  %初始化速度
%     计算适应度
    fit(i)=fun(X(i,:));   %染色体的适应度
end

%% 个体极值和群体极值
[bestfitness bestindex]=min(fit);
zbest=X(bestindex,:);   %全局最佳
gbest=X;    %个体最佳
fitnessgbest=fit;   %个体最佳适应度值
fitnesszbest=bestfitness;   %全局最佳适应度值

%% 迭代寻优
for i=1:T
    for j=1:N
        %速度更新
        V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - X(j,:)) + c2*rand*(zbest - X(j,:));
        V(j,find(V(j,:)>Vmax))=Vmax;
        V(j,find(V(j,:)<Vmin))=Vmin;
        %种群更新
        X(j,:)=X(j,:)+0.5*V(j,:);
        X(j,find(X(j,:)>Xmax))=Xmax;
        X(j,find(X(j,:)<Xmin))=Xmin;
        %适应度值
        fit(j)=fun(X(j,:)); 
    end
    for j=1:N
        
        %个体最优更新
        if fit(j) < fitnessgbest(j)
            gbest(j,:) = X(j,:);
            fitnessgbest(j) = fit(j);
        end
        
        %群体最优更新
        if fit(j) < fitnesszbest
            zbest = X(j,:);
            fitnesszbest = fit(j);
        end
    end 
    yy(i)=fitnesszbest;    
end
%% 结果分析
% 绘图
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);
fprintf('最优个体是:%8.7f%8.7f\n',zbest(1),zbest(2))
fprintf('最小值是:%8.7f\n',fun(zbest))

猜你喜欢

转载自blog.csdn.net/qq_25990967/article/details/128800681