Matlab-粒子群优化算法实现

发布于:2024-05-17 ⋅ 阅读:(50) ⋅ 点赞:(0)


一、粒子群优化算法

粒子群优化算法起源于鸟类觅食的经验,也就是一群鸟在一个大空间内随机寻找食物,目标是找到食物最多的地方。以下是几个条件:
(1) 所有的鸟都会共享自己的位置以及发现的食物量。
(2) 鸟群经过信息传递后知道哪个地方食物最多。
(3) 每一个鸟都会根据自己的信息和整个鸟群的信息来进行下一步应该去哪里。

二、相关概念和流程图

1.鸟群中的每一只鸟都记录自己经过位置中食物量最多的位置----个体最优解
2.每只鸟都知道整个鸟群中记录的食物量最多的位置—全局最优解
3.鸟具有惯性,有保持自身原来方向的趋势。
4.鸟学习个体经验,有向个体最优解飞行的趋势。
5.鸟学习社会经验,有向全局最优解飞行的趋势。

鸟最终飞行的大小和方向由上述几个参数决定。

其中速度更新公式:
在这里插入图片描述
位置更新公式:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

三、例题

在这里插入图片描述

实现

%粒子群优化算法实现
%定义维度
dim=2;
%惯性系数
w=2;
%两个学习因子
c1=1.5;
c2=1.5;
%x最大和最小值
xMax=10;
xMin=0;
%速度的最大和最小值
Vmax=1;
Vmin=0;
%种群数目
N=500;
%迭代次数
maxg=100;
%进行初始化
for i=1:N
    %第i个种群的位置初始化:x1,x2
    location(i,:)=xMax*rand(1,2);
    %速度初始化
    V(i,:)=Vmax*rand(1,2);
    %适应度初始化,也就是函数值
    fitness(i)=PSO_Schaffer(location(i,1),location(i,2));
end
%全局还有个体最优初始化
[fitnessgbest,gbest_index]=min(fitness);
%全局最优x1,x2
gbest=location(gbest_index);
%局部最优
pbest=location;
%适应度最优
fitnesspbest=fitness;
%迭代进化
for i=1:maxg
    for j=1:N
        %速度更新
        V(j,:)=w*V(j,:)+c1*(pbest(j,:)-location(j,:))+c2*(gbest-location(j,:));
       for k=1:dim
           if V(j,k)>Vmax
               V(j,k)=Vmax;
           elseif V(j,k)<Vmin
               V(j,k)=Vmin;
           end
       end
        %位置更新
        location(j,:)=location(j,:)+V(j,:)*1;
        for k=1:dim
            if location(j,k)>xMax
               location(j,k)=xMax;
            elseif location(j,k)<xMin
                location(j,k)=xMin;
            end
        end
        %适应度更新
        fitness(j)=PSO_Schaffer(location(j,1),location(j,2));
        %全局和个体最优的更新
        if fitnesspbest(j)>fitness(j)
            %更新个体最优和适应度最优
            pbest(j,:)=location(j,:);
            fitnesspbest(j)=fitness(j);
        end
        if fitnessgbest>fitness(j)
            gbest=location(j,:);
         fitnessgbest=fitness(j);
        end
          

           w=w*0.99;
    end
    yy(i)=fitnessgbest;
end



%画图
figure
plot(yy);
xlabel("迭代次数")
ylabel("适应度");


function Y=PSO_Schaffer(x1,x2)
temp1=x1^2+x2^2;
temp2=sin(sqrt(temp1));
Y=0.5+((temp2^2-0.5)/((1+0.001*temp1))^2);
end

结果

在这里插入图片描述
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到